Faster RCNN论文解读
用了一段时间的Faster RCNN,现写下自己的理解,有不对的地方希望指正。
Faster RCNN是基于RCNN和Fast RCNN的基础上完成的,建议没有看过前两篇的先去了解一下。
论文首先说明,Fast RCNN如果不考虑region proposals的话它的检测时间接近实时,所以传统region proposal的算法(如Fast RCNN用的Seletive Search)的低效率已经成为了基于region这一类方法用时的瓶颈。同时,即使将传统算法使用GPU进行计算,虽然加快了region proposal的速度,但是由于无法进行参数共享,导致效率并不能得到提升。基于此,论文提出了Region Proposal Networks(RPN),通过共享网络的前几层参数可以和检测器共享计算,不仅减少了region proposal的时间,还增加了准确度。作者提出,RPN就像“注意力”机制一样,可以告诉检测器去哪里检测,如图1。
Region Proposal Networks(RPN):
RPN网络的作用就是输入任意大小的图像(论文中声明的,但是实践证明并不是任意大小,大概图像短边与长边的比例不要低于1/8)进入RPN,输出一系列的矩形框作为region proposal,并且每个矩形框伴随一个得分。由于最终的目标是为了让RPN和检测器的网络共享计算,所以在建立网络的时候,让图像先进行一系列的卷积和池化之后得到特征图,然后再对此特征图通过RPN网络得到region proposals,最终把这些proposals经过检测器检测,得到最终结果。
具体的操作如下(整体算法的结构如图2,以VGG16网络为例):
图像经过VGG16的主体网络卷积池化之后生成特征图feature map,在特征图上使用3x3的窗口进行滑动卷积,生成512维的rpn层(即图3中的intermediate layer),再对rpn层进行两次1x1的卷积,分别生成cls层和reg层(分类层和坐标回归层)。
anchor:
在特征图上进行3x3滑窗卷积的同时会在窗口的中心生成k个anchor(就是矩形框),如图3右边,所以reg层的维度是4k,对应着每个anchor具有4个坐标点;cls层的维度是2k,对应着每个anchor里关于是否有目标的得分。anchor的形状和大小是经过预先设定的,包含两个参数:scale和aspect ratios,论文中默认scale是[8²,16²,32²],aspect ratios是[1:2,1:1,2:1],这样每次滑窗中心就会产生9个anchor,即k=9。假设特征图的长宽是W、H的话,每次就会产生WHk个anchor。
这种方法的使用不仅使anchor和根据anchor产生的proposals具有转移不变形,并且能减少网络模型的体量。通过运用多种长宽比(aspect ratios)多种尺度的anchor,Faster RCNN只需要在单尺度图像上进行计算即可获得多尺度的proposals。
注意:这里的anchor的产生是在特征图上产生的,原始图经过resize到(600,X)或者(1000,Y)大小的时候,假设resize后的图像尺寸为[H,W],再经过VGG主体的4次池化缩小2^4=16倍,这时的特征图大小为[H/16,W/16]。而anchor的参数默认scale是[8²,16²,32²],aspect ratios是[1:2,1:1,2:1],这样就会产生[[5:10,8:8,10:5],[9:18,16:16,18:9],[18:36,32:32,36:18]](这里的数值是四舍五入的结果)这9个不同的anchor,若是映射到resize后的图像上,就是[[80:160,128:128,160:80],[162:324,256:256,324:162],[324:648,512:512,648:324]],可以看出产生的anchor的大小覆盖范围在80~648之间,基本上满足目标检测中的稍微小的目标及以上的检测。
Loss Fuction
在训练RPN的时候,论文指定每个anchor具有一个二元标签表示该anchor是否是目标,只在以下两种情况下指定anchor为正样本,也就是anchor是目标的情况:
1.当anchor与其中一个ground-truth框(即为人工标记的矩形框)具有最高的IoU时;
2.当anchor与任意ground-truth框的IoU高于0.7时。
(IoU:Intersection-over-Union,即两个矩形之间的交集与它们的并集的比例)
注意单个ground-truth框可能会标记多个anchor为正。通常情况下第二个条件已经足够产生合适的正样本了,但是为了防止第二个条件偶尔找不到正样本的情况发生,还是添加了第一个条件。论文把IoU低于0.3的样本赋为负样本(不是目标),其余的既不是正样本也不是负样本的anchor则对训练没有帮助,所以都摒弃了。
RPN的损失函数 L R P N L_{RPN} LRPN如下:
其中:
i是anchor的序号,
p i p_i pi是关于第i个anchor是否是目标的概率,
p i ∗ p_i^* pi∗代表真实值groud-truth的标签,如果是1的话代表anchor是正样本,如果是0则是负样本,
t i t_i ti是一个包含着预测目标边界框的4个坐标值的向量,
t i ∗ t_i^*