Faster R-CNN

0. 参考

从编程实现角度学习Faster R-CNN(附极简实现,超赞):https://zhuanlan.zhihu.com/p/32404424

从结构、原理到实现,Faster R-CNN全解析(还没看):https://zhuanlan.zhihu.com/p/32702387

1. 论文概况

1. Motivation

在region proposal + CNN分类的这种目标检测框架中,region proposal质量好坏直接影响到目标检测任务的精度。如果找到一种方法只提取几百个或者更少的高质量的预选窗口,而且召回率很高,这不但能加快目标检测速度,还能提高目标检测的性能(假阳例少)。

提速:有没有可能直接使用CNN直接产生region proposal并对其分类?

2. 解决什么问题?

region proposals耗时问题

3. 提出了什么方法?

  1. RPN(Region Proposal Networks)
  2. RPN与Fast R-CNN共享卷积层(交叉训练)

    共享卷积层,只是在末尾的几层分别实现各自的特定的目标任务,那么“候选框选择”和“候选框分类和bbox回归修正”只需一次前向卷积计算即可。

4. 效果如何?

  • 训练和测试更方便;
  • 精度提升;
  • 整个网络流程都能共享卷积神经网络提取的的特征信息,节约计算成本,且解决Fast R-CNN算法生成正负样本候选框速度慢的问题,同时避免候选框提取过多导致算法准确率下降。

5. 还存在什么问题?

速度还有待进一步提高

2. 整体算法流程

image

  1. CNN特征提取
  2. RPN进行候选框选择
  3. 从卷积特征图中取出候选框的卷积特征,接ROI池化,之后送入全连接层进行精确定位和分类;

    Faster R-CNN相当于RPN+Fast R-CNN

3. RPN

3.1 RPN整体思路

  • 先通过对应关系把feature map上的点映射回原图
  • 在每一个对应的原图位置处,设置anchor box
  • 根据该anchor box与ground truth的IOU给它正负标签
  • 让网络predict box,学习predict box里面是否有object

由于我们只需要找出大致的地方,无论是bbox位置和尺寸精确与否,后面Fast R-CNN都可以进行修正(refine),因此可以对bbox做了三个固定:固定尺度变化(三种尺度),固定scale ratio变化(三种ratio),固定采样方式(在feature map的每个点对应的原图中的位置处上采样),反正后面的工作能进行调整。

这相当于给了比较死的初始位置(三个固定),然后来大致判断是否是物体以及所对应的位置。

3.2 RPN算法流程

image

3.3 候选区域(anchors)位置计算

假如feature map是一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积、三种比例,这些候选窗口称为anchors;

计算anchor box位置的具体作法是:
把每个特征点映射回映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor。论文中设置了3个scale(128,256,512),3个aspect ratio(1:1,1:2,2:1)

anchor具体的尺度和ratio根据输入图像大小以及目标类型来设置;

下图示出51*39个anchor中心,以及9种anchor示例

image

3.4 RPN训练

3.4.1 训练方法:Fast R-CNN中的image-centric采样策略

从20000多个候选的anchor选出256个anchor进行分类和回归位置训练。选择过程如下:

  • 正样本:对于每一个ground truth bounding box(gt_bbox),选择与其IOU最高的一个anchor作为正样本;对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor作为正样本,正样本的数目不超过128个(==bbox负样本较多,需保持正负样本比例均衡,此处使正负样本比例为1:1==,如果正样本不足128,则用负样本补充)。
  • 负样本:随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。
  • 尺寸超过图像边界的anchor弃去不用,不满足正负样本规定的anchor弃去不用;

正样本有两类,正样本选择中仍选择第一类的原因是考虑到极少数情况下,第二类会没有满足条件的正样本。

image

3.4.2 loss函数

如下所示的loss函数中,设置λ的值是为了使得loss中的两项在归一化后权重大致相等(可称作λ为权衡参数)
image

image

如下图所示,==学习的目标是:ground truth bounding box与anchor box之间的4个offset值(并没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正,相当于是回归4个offset值),预测坐标的偏移是为了使网络更容易学习==;

image

3.4.3 RPN的inference:生成ROIs

RoI:region of interest,候选框。RoI不是单纯的从anchor中选取一些出来作为候选框,它还会利用回归位置参数,微调anchor的形状和位置。
可以这么理解:在RPN阶段,先穷举生成千上万个anchor,然后利用Ground Truth Bounding Boxes,训练这些anchor,而后从anchor中找出一定数目的候选区域(RoIs)。RoIs在下一阶段用来训练Fast R-CNN(RoIHead),最后生成Predict Bounding Boxes。

RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。

RPN生成RoIs的过程(ProposalCreator)如下:

  • 对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。
  • 选取概率较大的12000个anchor
  • 利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
  • 利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs

注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300(取top-N个ROIs)

注意:这部分的操作不需要进行反向传播,因此可以利用numpy/tensor实现。

RPN的输出:RoIs(形如2000×4或者300×4的tensor)

3.5 对RPN的理解

RPN实际上延续了基于滑动窗进行目标定位的思路,不同之处在于候选区域网络在卷积特征而不是在原图上进行滑动。由于这是非常高层的feature map,其本身size就不大且感受野很大,因此即使使用3×3的滑动窗,也能对应于很大的原图区域。

RPN目的是进行候选框的选择,输出候选框的概率值和位置坐标;分类部分可看成是一个二分类网络,目的是分开前景(不包含有ROI的部分)和背景(包含有ROI的部分)。

在最后的卷积层上,通过两层卷积(3×3和1×1卷积),输出两个分支。其中,一个分支用于判断每个锚盒是否包含了目标,另一个分支对每个锚盒输出候选区域的4个坐标。

全卷积网络,不需要输入图像resize到固定尺寸;

4. Fast R-CNN(也可叫RoIHead)

RPN只是给出了2000个候选框,RoI Head在给出的2000候选框之上继续进行分类和位置参数的回归。

4.1 网络结构

image

最后两个全连接层,分别是:

  • FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)
  • FC 84 用来回归位置(21个类,每个类都有4个位置参数)

4.2 训练

由于RoIs给出的2000个候选框,分别对应feature map不同大小的区域,挑选出top-N个(如128个)ROIs来训练Fast R-CNN,选择规则如下:

  • RoIs和gt_bboxes 的IoU大于0.5的,选择一些(比如32个)
  • 选择 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的选择一些(比如 128-32=96个)作为负样本

5. RPN与Fast R-CNN共享卷积该如何训练?

  1. 第一步:用ImageNet模型初始化,独立训练一个RPN网络;
  2. 第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
  3. 第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络(即将r-cnn卷积层部分的权重作为RPN网络卷基层的初始化权重),但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
  4. 第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

image

6. 总的模型inference

测试的时候对所有的RoIs(大概300个左右) 计算概率,并利用位置参数调整预测候选框的位置。然后再用一遍极大值抑制(之前在RPN中生成proposals就用过)。

注意:

  • 在RPN的时候,已经对anchor做了一遍NMS,在RCNN测试的时候,还要再做一遍
  • 在RPN的时候,已经对anchor的位置做了回归调整,在RCNN阶段还要对RoI再做一遍
  • 在RPN阶段分类是二分类,而Fast RCNN阶段是21分类

6. Ablation experiment(对比实验)

Ablation experiment就是用来研究整个流程里面的关键部分到底起了多大作用,就像Faster R-CNN中将RPN换成SS进行对比实验,以及与不共享主干网络进行对比

对比研究Fast R-CNN中的检测框回归层(reg)和检测框分类层(cls)的影响:

  1. 移除cls层,我们从没有计算得分的区域随机抽取N个proposals

结论:cls得分是排名最高的proposals准确的原因

  1. 移除reg层(这样的proposals就直接是anchor框了)

结论:高品质的proposals主要归功于回归后的位置,单是anchor框不足以精确检测