继SPP-Net和Fast R-CNN之后,两篇论文的作者又联手实现了一个对R-CNN更快加速的算法,即Faster R-CNN。论文首先分析下之前的Fast R-CNN,它使用了Softmax代替了SVM的二分类,然后把多阶段变成了多任务的算法,但是由于产生region proposal算法是selective search,只能在CPU上运行,而且由于其不是CNN网络,所以Fast R-CNN并不是真正意义上的end-to-end网络。我们既然知道了这个缺点,那么在Faster R-CNN中作者就提出来能不能把region proposal用一个CNN网络产生,这样既可以在GPU下运行又可以完全实现end-to-end?事实证明可以的,作者提出了RPN网络,使得检测算法在VGG16的模型中实现了5ps,做到了实时检测,源码见GitHub。
一、RPN(区域建议网络)
Faster R-CNN摒弃了selective search算法,使用RPN网络去生成候选框,首先让输入图像经过CNN网络,得到一个feature map,利用RPN网络去产生候选框,把候选框在feature map的区域经过RoI pooling产生一个尺度固定的特征向量,接着进入全连接层做分类以及边框回归。并且,使得RPN和Fast R-CNN共享了CNN特征。
RPN的输入为一个feature map,输出有两个分支,一个是cls层,用来判断是否有目标,另一个是reg层,用来产生一系列的目标建议框。在RPN中,我们会使用nxn的滑动窗口来遍历整个feature map,每个滑动窗口会产生K个不同尺度,不同比例的建议区域,称为Anchors,文中K=9,n=3,所以每个anchor在clf层会产生2k的分数(目标与非目标),而在reg层产生4k个位置信息。
在实现faster R-CNN时,设置了每张图片的最大尺寸为1000x600,如果小于这个尺寸,用padding去填充,如果大于这个尺寸,等比例缩放至小于该尺寸,然后进行padding,这样就保证了输入图片比例的基本不变,也就保证了目标的比例不变。这样最后的feature map的W*H大约为2400,即产生WHk个anchors。
而faster R-CNN中,anchor有以下性质:
- 位移不变性:作者使用滑动窗口生成anchor,而不是像MultiBox使用K-mean的聚类算法,这样的话如果目标在一幅图中进行平移或其他变换,仍然可以检测出,由于K-mean的聚类算法依赖于起始点,不具有位移不变形
- 多尺度anchor:作者对比了图像金字塔,这种方法图像在多个尺度上进行resize进行检测,然后进入到CNN网络,但比较费时间,于是使用了多尺度的anchor在一个特征图上进行滑动窗口检测,更加高效
二、网络结构
共享卷积层为VGG-16或者是ZF网络
三、损失函数
文中对每个anchor赋予二值(是目标或非目标)类标签。对两种anchors赋予正标签:1. 和真值框有最高交并比的anchor/anchors;2. 和任何一个真值框的IoU高于0.7。对和所有真值框IoU都低于0.3的anchor赋予负标签。其他的anchors不作为训练目标。损失函数如下:
该loss函数对RPN网络进行训练,类似Fast R-CNN算法。i表示mini-batch的序号,其中Pi是anchor被预测为目标的概率,而标签Pi*在正标签为1,负标签为0。在reg层使用的是L1损失,cls层为两类的log损失,由于Ncls为mini-batch的数量,本文为256,但是经过计算一个feature map要产生大约2400个anchor,所以我们设置λ为10以平衡两者的权重,从而达到了归一化。
四、RPN和Fast R-CNN共享特征
这里作者给出了一些方法,如下:
1.交替训练:首先训练RPN,使用proposals训练Fast R-CNN。网络使用Fast R-CNN微调,然后用来初始化RPN,迭代这个过程,这也是作者实验时用的方法!
2.近似联合训练:在每次SGD迭代时,前馈计算生成区域推荐,看作训练Fast R-CNN检测器的预计算推荐。反馈传播中共享层传播RPN和Fast R-CNN结合的损失。这种方式忽略了关于推荐框坐标的导数。
3.非近似联合训练:Fast R-CNN中的 RoI pooling层接收卷积特征和预测的bounding boxes作为输入,这时反向传播会涉及到box corrdinates.这时需要RoI poling层关于box coordinates是可微的。
4.细节
第一步:我们使用上面的loss去训练RPN,并使用预训练的Imagenet模型初始化卷积网络,端到端的微调RPN。
第二步:我们使用第一步产生的建议区域,分离的训练一个Fast R-CNN网络,也是对卷积网络进行预训练的Imagenet模型初始化,这两步不共享卷积层
第三步:使用检测网络初始化去单独的进行RPN训练,固定卷积层,只对RPN进行微调
第四步:固定共享卷积层,微调Fast R-CNN的分支层,这样就可以形成了一个统一的网络了
五、算法总结
优点:
- 优化了建议区域的产生方式,使其真正实现了end-to-end训练
- 在GPU上达到了实时,5fps based VGG & 17fps based ZF
- 精度提高,COCO检测42.1%,而Fast R-CNN为39.3%
缺点:
- 速度有待于进一步提升
参考
【AI】目标检测第二话:Fast R-CNN和Faster R-CNN https://zhuanlan.zhihu.com/p/55495520