简介
FPN——Feature Pyramid Networks for Object Detection,其是CVPR 2017年的论文,在多尺度目标检测领域很强!很多多尺度的目标检测算法都采用了FPN作为backbone,很强很常见。
作者提出的多尺度的object detection算法:FPN(feature pyramid networks)。原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。
常见的几种多尺度目标检测算法的backbone结构图大致如下:
额。。。其实我觉得放上这张图之后,FPN基本就讲完了。。。。。。。。。。。。。。。
框架解析
利用FPN构建Faster R-CNN检测器
- 首先,选择一张需要处理的图片,然后对该图片进行预处理操作;
- 然后,将处理过的图片送入预训练的特征网络中(如ResNet等),即构建所谓的bottom-up网络;(前馈)
- 接着,如下图所示,构建对应的top-down网络(即对层4进行上采样操作(2×),先用1x1的卷积对层2进行降维处理,然后将两者相加(对应元素相加),最后进行3x3的卷积操作);(3*3的卷积是为了消除上采样和特征融合后的一下混乱)
- 接着,在图中的4、5、6层上面分别进行RPN操作,即一个3x3的卷积后面分两路,分别连接一些1x1的卷积用来进行分类和回归操作;(参考Faster R-CNN)
- 接着,将上一步获得的候选ROI分别输入到4、5、6层上面分别进行ROI Pool操作(固定为7x7的特征);
- 最后,在上一步的基础上面连接两个1024层的全连接层,然后分两个支路,连接对应的分类层和回归层;
为什么FPN能够很好地处理多尺度目标
- FPN可以利用经过top-down模型后的那些上下文信息(深层feature map的语义信息);
- 对于小目标而言,FPN增加了特征映射的分辨率(即在更大的feature map上面进行操作,这样可以获得更多关于小目标的有用信息),其次这个大分辨率的feature map还融合了深层feature map的语义信息,即现在的feature map(如上图6)中位置信息和语义信息都有了,所以效果会好。
ResNet-FPN + Fast R-CNN
ps:上图来自知乎文章
将ResNet-FPN和Fast RCNN进行结合,实际上就是改进版的Faster RCNN了,但与最初的Faster RCNN不同的是,FPN产生了特征金字塔 [ P 2 , P 3 , P 4 , P 5 , P 6 ] \left[P2, P3, P4, P5, P6\right] [P2,P3,P4,P5,P6],而并非只是一个feature map。金字塔经过RPN之后会产生很多region proposal。这些region proposal是分别由 [ P 2 , P 3 , P 4 , P 5 , P 6 ] \left[P2, P3, P4, P5, P6\right] [P2,P3,P4,P5,P6]经过RPN产生的,但用于输入到Fast RCNN中的是 [ P 2 , P 3 , P 4 , P 5 ] \left[P2, P3, P4, P5\right] [P2,P3,P4,P5],也就是说要在 [ P 2 , P 3 , P 4 , P 5 ] \left[P2, P3, P4, P5\right] [P2,P3,P4,P5]中根据region proposal切出ROI,再进行后续的分类和回归预测。问题来了,我们要选择哪个feature map来切出这些ROI区域呢?实际上,我们会选择最合适尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽 w w w和高 h h h的ROI到底要从哪个 P k P_k Pk来切,如下:
k = ⌊ k 0 + log 2 ( w h / 224 ) ⌋ k=\left\lfloor k_{0}+\log _{2}(\sqrt{w h} / 224)\right\rfloor k=⌊k0+log2(wh/224)⌋
这里 224 224 224表示用于预训练的ImageNet图片的大小。 k 0 k_0 k0表示面积为 w × h = 224 × 224 w \times h = 224 \times 224 w×h=224×224的ROI所应该在的层级。作者将 k 0 k_0 k0设置为4,也就是说 w × h = 224 × 224 w \times h = 224 \times 224 w×h=224×224的ROI应该从 P 4 P_4 P4中切出来。假设ROI的scale小于224(比如说是 112 ∗ 112 112 * 112 112∗112), k = k 0 − 1 = 4 − 1 = 3 k = k_0 - 1 = 4 - 1 = 3 k=k0−1=4−1=3,就意味着要从更高分辨率的 P 3 P_3 P3中产生。另外, k k k值会做取整处理,防止结果不是整数。
这种做法很合理,大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的feature map上切,有利于检测小目标。
总结
总之目前在多尺度目标检测和图像分割等领域非常常用,效果提升明显,且速度依旧很快。FPN的总结如下:
- FPN 构架了一个可以进行端到端训练的特征金字塔;
- 通过CNN网络的层次结构高效的进行强特征计算;
- 通过结合bottom-up与top-down方法获得较强的语义特征,提高目标检测和实例分割在多个数据集上面的性能表现;
- FPN这种架构可以灵活地应用在不同地任务中去,包括目标检测、实例分割等;
以下是FPN网络的架构细节图:
done~