【目标检测】Faster-R-CNN (Towards Real-Time Object Detection with Region Proposal Networks)

Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.

本文是继RCNN,Fast RCNN之后,目标检测界的领军人物Ross Girshick团队在2015年的又一力作。简单网络目标检测速度达到17fps,在PASCAL VOC上准确率为59.9%;复杂网络达到5fps,准确率78.8%。

1. 思想

从RCNN到Fast RCNN,再到本文的Faster RCNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
这里写图片描述


\[ Faster-RCNN \]
Faster RCNN可以简单地看做“区域生成网络+Fast RCNN“的系统,用区域生成网络(RPN)代替Fast RCNN中的Selective Search方法。本篇论文着重解决了这个系统中的三个问题:

  1. 如何设计区域生成网络
  2. 如何训练区域生成网络
  3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络

2. 区域生成网络(Region Proposal Network)

RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度多长宽比的region proposal。我们通过如下VGG模型进行分析:

以上是script_faster_rcnn_demo.m 代码中使用的VGG网络结构proposal + detection,我们输入一张图片375x500 (进行尺度缩放后为600x800, 即对应于test_scales=600,短边最短为600,长边最长不超过1000进行的缩放:Reference),然后将其处理成caffe输入的blob格式im_blob: 800x600x3 输入到proposal(RPN)网络中:Reference,经过卷积操作后得到最后一层conv5_3的卷积特征图feature map(大小为50x38,共有512个,ZF则有256个)。在这个特征图上使用3x3的卷积核(滑动窗口)与特征图进行卷积后,可以得到一个512维的特征向量50x38x512,后面接 cls layerreg layer 分别用于分类和边框回归(跟Fast R-CNN类似,只不过这里的类别只有目标和背景两个类别)。

  • cls layerproposal_cls_score层 :输出每一个位置上,9个anchor属于前景和背景的概率(代码中只取了每个位置属于前景的概率:Reference,即 17100x1 = 50x38x9个anchors属于前景的概率);
  • reg layerproposal_bbox_pred层 :输出每一个位置上,9个anchor对应窗口应该平移缩放的参数(之后可使用该参数,对缩放后的原图上的 50x38x9 个anchors进行边框回归,修正每个anchor属于前景的位置)

就局部来说,这两层是全连接网络;

就全局来说,由于网络在所有位置(共50x38个)的参数相同,所以实际用尺寸为1×1的卷积网络实现。

这样设计的好处是什么呢?虽然现在也是用的滑动窗口策略,但是:滑动窗口操作是在卷积层特征图上进行的,维度较原始图像降低了16x16倍(中间经过了4次2x2的pooling操作);多尺度采用了9种anchor,对应了三种尺度和三种长宽比,加上后边接了边框回归,所以即便是这9种anchor外的窗口也能得到一个跟目标比较接近的region proposal。

2.1 候选区域(anchor)

我们通过RPN网络,可以得到最后一个卷积层conv5_3的feature map大小50x38(因为输入的im_blob格式是width优先),我们取featuremap_size为38x50,这是为了与缩放后的原图(height优先)600x800进行对应。然后我们计算该38x50个像素点对应于缩放后原图中的位置,即将feature map中的每个像素点位置×conf.feat_stride,即可映射回缩放后原图的位置(感受野的概念)。接着使用映射回缩放后原图上的点,共38x50个位置,计算其在缩放后原图上的9个anchors,即9个可能的候选窗口:三种面积 { \(128^2,256^2,512^2\) } × 三种比例{ \(1:1,1:2,2:1\) } ,共可以计算得到38x50x9 = 17100个anchors,每个anchor就是一个候选框:Reference。这样我们就粗略得到了输入的一张图片所拥有的anchors。(注意,这里每个位置上的9个anchors尺寸,代码中提前设计好了,对应于下图中的conf.anchors)。

我们使用一张测试图片,将通过以上方法产生的anchors,维度为17100x4(未进行Bounding boxes regression前的),取前9个和最后9个anchors,即对应于将feature map映射回缩放后原图(600x800尺寸)上的最左上角的一点,和最右下角一点具有的9个anchors,绘制如下,以便更好的理解:

绿、蓝、红分别对应三种比例:{ \(1:1,1:2,2:1\) }
每一种颜色中又有三种面积: { \(128^2,256^2,512^2\) }

在整个Faster RCNN算法中,有三种尺度。
原图尺度:原始输入的大小。不受任何限制,不影响性能。
归一化尺度(缩放后的原图):输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor是在这个尺度上设定的,具体如上所述。这个参数和anchor的相对大小决定了想要检测的目标范围。
网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224x224。

2.2 窗口分类和位置精修

将以上计算得到的anchors,结合上面RPN网络proposal_bbox_pred层所输出的平移缩放参数进行边框回归,得到pred_boxes,然后将这些anchors按归一化尺度缩放回对应于原图尺寸375x500,并把anchors超过原图375x500边界的部分都减去,得到最终的pred_boxes:即得到输入的一张原图内所拥有的所有anchors:Reference;以及每个anchors属于前景和背景的得分 ( proposal_cls_score层 所输出的,代码中只取了其属于前景的得分)。

2.3 测试阶段

通过RPN网络得到了该张图片的50x38x9=17100个anchors,以及每个anchors属于前景的分数,然后将anchors根据分数进行排序,选取得分最高的6000个anchors,然后再使用NMS(Non-Maximum Suppression)留下比较好的约2000个左右候选框。之后,再将这些候选框anchors boxes做为rois输入到Fast-RCNN detection test网络,并输入RPN网络conv5_3输出的feature map做为data,进行后续的Softmax分类+Boundingboxes回归。

因此,Faster-RCNN和RCNN, Fast-RCNN一样,属于2-stage的检测算法。

3. 区域生成网络:训练

3.1 样本

考察训练集中的每张图像:
a. 对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本
b. 对a)剩余的anchor,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本
c. 对a),b)剩余的anchor,弃去不用。
d. 跨越图像边界的anchor弃去不用

3.2 代价函数

同时最小化两种代价:
a. 分类误差
b. 前景样本的窗口位置偏差
具体参看Fast RCNN中的“分类与位置调整”段落
(实质是一样的,只是公式表达的方式不同而已)

3.3 超参数

原始特征提取网络使用ImageNet的分类样本初始化,其余新增层随机初始化。
每个mini-batch包含从一张图像中提取的256个anchor,前景背景样本1:1.
前60K迭代,学习率0.001,后20K迭代,学习率0.0001。
momentum设置为0.9,weight decay设置为0.0005。

4. 共享特征

区域生成网络(RPN)和Fast RCNN都需要一个原始特征提取网络(下图灰色方框)。这个网络使用ImageNet的分类库得到初始参数 \(W_0\) ,但要如何精调参数,使其同时满足两方的需求呢?本文讲解了三种方法。

4.1 轮流训练

​ (1) 使用在ImageNet上预训练的模型初始化网络参数,微调RPN网络;
​ (2) 使用ImageNet上与训练的模型初始化Fast RCNN网络,使用(1)中RPN网络提取region proposal训练Fast R-CNN网络;
​ (3) 使用(2)的Fast R-CNN网络重新初始化RPN, 固定卷积层进行微调,即固定共有的卷积层参数来微调训练 (将学习率设置为0);
​ (4) 固定(2)中Fast R-CNN的卷积层,使用(3)中RPN提取的region proposal微调网络。

权值共享后的RPN和Fast R-CNN用于目标检测精度会提高一些。如Ross Girshick在ICCV 15年的讲座Training R-CNNs of various velocities中所述,采用此方法没有什么根本原因,主要是因为”实现问题,以及截稿日期“。需要注意的是,最新的版本已经将RPN网络和Fast R-CNN网络结合到了一起——将RPN获取到的proposal直接连到ROI pooling层,这才是一个真正意义上的使用一个CNN网络实现端到端目标检测的框架。

4.2 近似联合训练

直接在上图结构上训练。在backward计算梯度时,把提取的ROI区域当做固定值看待;在backward更新参数时,来自RPN和来自Fast RCNN的增量合并输入原始特征提取层。
此方法和前方法效果类似,但能将训练时间减少20%-25%。公布的python代码中包含此方法。

4.3 联合训练

直接在上图结构上训练。但在backward计算梯度时,要考虑ROI区域的变化的影响。推导超出本文范畴,请参看15年NIP论文。

5. 实验

除了开篇提到的基本性能外,还有一些值得注意的结论

  • 与Selective Search方法(黑)相比,当每张图生成的候选区域从2000减少到300时,本文RPN方法(红蓝)的召回率下降不大。说明RPN方法的目的性更明确
    这里写图片描述
  • 使用更大的Microsoft COCO库训练,直接在PASCAL VOC上测试,准确率提升6%。说明Faster RCNN迁移性良好,没有over fitting。
    这里写图片描述

6. Reference