Two-stage:从R-CNN到Faster R-CNN

1. R-CNN

概览

Two-stage:从R-CNN到Faster R-CNN_第1张图片
R-CNN

R-CNN训练的过程如上图:

1 输入图片,通过selective search获取2000个可能包含目标的区域PR。
2 将PR变形缩放到227*227的大小输入到CNN网络中进行特征提取
3 将提取出的特征输入到svm中进行分类

接下来我们对每一部分进行细致的分析。

1.1 Region Proposal

候选区域的提取使用的是传统的selective search方法,其利用像素之间的关系来合并得到可能存在的区域,比滑窗法高效得多,但是计算量很大并且其候选框存在大量的冗余,后续的算法利用深度学习对RP进行了改进。

2特征提取

2.1 图片缩放

实际上,在第一步RP获得的候选框的大小不可能完全一样,然后我们使用的CNN网络由于最后连接了全连接层,那么我们输入的图片的大小必须是一致的(强行变形到一致会导致特征的损失,后续有网络对此进行了优化),那么输入之前我们把这些区域缩放到227*227,缩放的方法如下:

  • B: 直接用原始图片的像素扩充,形成一个227*227的区域
  • C: 用灰色填补缺失的部分
  • D: 直接放缩


    Two-stage:从R-CNN到Faster R-CNN_第2张图片
    Wrap.PNG
2.2特征提取CNN
Two-stage:从R-CNN到Faster R-CNN_第3张图片
Alexnet.png

特征提取网络是基于Alex net的变形,AlexNet的结构如图,首先这个Alexnet的权重是在ImageNet数据集上训练好的,我们只需要把softmax的1000个类别改为21 (数据集为Pascal Voc格式,其中有20个类别,背景也算一个负类,一共21),然后在poscal voc数据集上做fine-tuning,使得alexnet的权重你和当前数据集。

3 SVM分类

对每一个类别,训练一个SVM分类器,每个SVM的输入为Alexnet中最后一个全连接层FC7的4096维向量,那么对于每个候选框来说,最终都会输出一个4096维向量来送入到SVM进行分类,那么就会得到2000个分类,其中对于同一个目标可能会存在多个候选框,那么我们就要做一个NMS(non-maximun suppression),得到最佳的预测框。对于位置的预测,我们训练一个回归器,输入的数据是Pool5的特征和每个样本对的坐标和长宽。后续深入探讨下Bbox回归

一些重要的细节

1.正负样本
在fine-tuning 中,对于得到的2000个RP,如果某个RP与GT(ground truth)重叠的部分最大的那个其IOU大于0.5,那么RP可以作为这个GT的正样本,否则为负样本,另外,GT也作为正样本。
在训练SVM的过程中,IOU大于0.7的认定为正样本,IOU小于0,3的认定为负样本。
在fine-tuning与SVM训练中之所以IOU不一样是因为:

  • 正样本相对负样本很少,IOU阈值低可以获得多一点的数据,同时也为了防止过拟合
  • SVM是一个最终的分类器,且SVM适用于小样本,IOU阈值高样本会更为准确,那SVM会更为精确。
  1. 回归
    用Alexnet中pool5的6*6*256维特征和bounding box的GT来训练回归,每种类型的回归也是单独训练的。输入的是pool5的特征和样本对的坐标(x,y)和长宽w, h。另外只跟和GT的IOU超过某个阈值,并且最大的RP进行回归,其余的RP不参与回归。
    假设我们现在有:候选框,对应的ground truth :,以及我们希望获得的预测结果,那么我们希望尽可能接近。通过pool5层的特征做线性变换得到函数,输出平移量和缩放量,从而得到.
    详细的叙述下:
         
         
         
    我们提出了一个候选框时,发现它与 IOU较低,那么可以把从候选框到通过平移和缩放使得与的IOU尽量大,那么其实学习的是一个平移量,移动,使得其尽量靠近,还需要学习一个缩放量,让按照一定比列缩放,使得最终的预测框与的IOU尽可能的大。

输入:
样本值:输入的是P区域经过Alexnet网络在pool5的特征向量
标签值:GT:
输出:平移以及缩放尺度

训练过程:

2. SppNet

R-CNN缺陷与SppNet的改进

  • R-CNN缺陷
    R-CNN提高了目标检测的mAP,但是即使在GPU上处理,其fps也很低,其中主要原因:
    • 在region proposal阶段提取了2k个RP,并且需要把每个RP都送入到Alexnet中进行特征提取,大大增加了计算量,导致处理时间较长.
    • 由于Alexnet输入的是一个固定尺寸的图片,而我们在将RP送入时是对其进行了放缩,一定程度上减少了物体的特征,例如下图中的灯塔。这样会导致识别率的降低。
  • SppNet改进
    • 在提取特征的时候,我们可以直接把图片输入到Alexnet中,得到一个完整的feature map,然后对应每个RP,直接在feature map上找到其相应位置的feature 即可,只需要进行一次特征提取,大大减少了运算量
    • 对于输入图片需要固定大小的问题,SppNet提出了一个叫做spatial pyramid pooling的结构来提取特征,并且保证提取的特征维数,长度等完全一致,然后输入到FCN中,接下来再详述这个结构。
Two-stage:从R-CNN到Faster R-CNN_第4张图片
pipeline

上图是R-CNN和SppNet的pipeline,我们只讨论SppNet。输入一张图片Image到CNN中,得到全图的feature map,让2000个候选框RP与feature map直接映射,可以直接得到RP的特征(这里通过映射得到feature,不用经过CNN了,因为是直接从计算好的全局的feature map中得到的),然后将这个RP对应的feature map输入到空间金字塔变换层,输出一个固定大小的向量给到fc6,fc7中,进行分类。实际上,我们只需要着重关注两个点:RP到全局feature map的映射,空间金字塔变换层的结构。

RP->feature map

原始图片到feature map的映射要从感受野(receptive field)说起,感受野即特征图上一点在原始图像上对应的面积,之前我们找到一个图片,给定一层CNN的filter,stride,经过运算后可以得到其运算结果feature map的大小,实际上,它们的坐标之间是有关联的,我们以下图为例:


Two-stage:从R-CNN到Faster R-CNN_第5张图片
ec.jpg

在这个图中,假定Conv1为feature map1,Conv2为feature map2,原始图像大小为7*7,假定从在原图上那四个框框起来的面积为RP,我们用两个坐标来确定他的位置:第一次的运算filter1 = 3,stride1=2,那么RP在Conv1上其坐标为
第二次的运算filter1 = 2,stride1=1,那么RP在Conv2上其坐标为
由这个例子可知,给定原图上的一个位置RP其坐标,可以计算出其在feature map上的坐标。

Spatial Pyramid Pooling

如下图,假设RP在feature map上得到的特征向量为N*N*256,那么先对N*N的面积做一个maxpooling,得到一个1*256向量,再把N*N分成四块,每块做maxpooling,得到一个4*256维向量,然后把N*N分成16块,每块做maxpooling,得到一个16*16的向量,然后把这三个向量合并起来得到一个21*256维向量输入到FCN中,可以看到,得到这个21*256维向量和尺寸N*N没有关系,输出的都是固定的大小,划分为4块或者是16块有时候并不一定可以均分,有固定的公式,这里就不展开。

Two-stage:从R-CNN到Faster R-CNN_第6张图片
SPPNET2.PNG

3. Fast R-CNN

SppNet缺点

  • 整体的结构是分阶段训练,不是一个end-to-end结构,训练CNN,训练SVM,训练bbox回归器没有结合到一起
  • 训练SVM,Bbox回归时算法不能更新卷积层的参数,影响网络的精度
    Fast R-CNN提出了ROI层,整合了整个结构,下图是pipeline:


    Two-stage:从R-CNN到Faster R-CNN_第7张图片
    ROI.PNG

    首先把图片输入到CNN中得到一个全图的feature map,然后找到RP(候选框)在feature map对应的区域S,把S输入到ROI (region of interest ) pooling layer,输出一个固定大小的特征向量,然后特征向量经过FCN后,最后分为两个分支:一个处理softmax概率,一个作bbox回归。然后联合一起训练网络。

ROI layer

ROI层实际上就是单尺度的一个SppNet,就是把RP的feature map直接划分为H*W大小的块,然后直接去做maxpooling那么得到的一定是一个固定大小的向量。

4. Faster R-CNN

实际上,Fast R-CNN最耗时间的地方是在Region proposal,通过selective search获取2000个候选区RP,Faster R-CNN提出了RPN网络(region proposal network)来提取特征,使得R-CNN系列形成了一个完整的end-to-end的网络结构。Faster R-CNN = RPN +Fast R-CNN .

  • RPN
    基本思想:在提取好的feature map上,通过一个滑动窗口获取特征向量,然后输出到两个全连接层,一个是bbox回归层,一个是分类层cls。现在我们实际上来看下。
    原文中中结果特征提取后得到了一个13*13*256的feature map,然后他经过了一个3*3*256*256的卷积后得到了一个11*11*256的特征向量,就是图中的那个sliding window,对于这个11*11*256的feature map来说,其上面的1*1*256的向量可能在原图中代表的是一个很大的面积,而256-d则是这个面积的特征,原图的大小可能是440*440,那么对于1*1来讲,可能对应的是一个20*20的面积,然后有k个可能的anchor在上面框,框出物体,输出即为2k个score,为包含某个物体的概率和4k个coordinate,为bbox坐标。


    Two-stage:从R-CNN到Faster R-CNN_第8张图片

    Two-stage:从R-CNN到Faster R-CNN_第9张图片
    RPN.jpg
  • pipeline
    理解了RPN,我们可以看下Faster R-CNN的pipeline:
    • 首先,将图片输入到一个特征提取网络获得一个feature map
    • RPN作用在feature map后,给出RP的信息,然后和feature map一起输入到ROI pooling(ROI pooling实际上是一个单尺度的SppNet),得到了一个固定长度的特征向量。
    • 将固定长度的特征向量输入到FCN中,最后进行softmax回归分类和bbox regress进行定位。


      Two-stage:从R-CNN到Faster R-CNN_第10张图片
      Pipeline

参考:
[1] RPN网络通俗理解
[2] 目标检测(一)——目标检测综述

你可能感兴趣的:(Two-stage:从R-CNN到Faster R-CNN)