经典的two stage检测网络有:faster RCNN和SSD,它们用于做bbox regression的模型各有不同,faster RCNN是VGG,feature map经过不断地下采样,最后的feature map送入RPN层,这样不断地下采样使得小检测框的像素非常小,无法进行训练的到,得到很好的结果。而SSD则是分别对不同尺寸的feature map进行bbox regression,这就导致尺寸较大的feature map没有高级语义,对于全局语义没有很好地提取,无法判断出物体的位置和大小,同样对小检测框没有很好的检测效果。FPN则解决了这个问题。
(a)是图像金字塔,我记得MTCNN中用的就是这个,这个很占用时间;(b)是常规的卷积网络,faster RCNN用的是这个;(c)是SSD的结构,SSD为了避免使用low-level的特征,放弃了浅层的feature map,而是从conv4_3开始建立金字塔,而且加入了一些新的层。因此SSD放弃了重利用更高分辨率的feature map,但是这些feature map对检测小目标非常重要。这就是SSD与FPN的区别;(d)是FPN,FPN是为了自然地利用CNN层级特征的金字塔形式,同时生成在所有尺度上都具有强语义信息的特征金字塔。所以FPN的结构设计了top-down结构和横向连接,以此融合具有高分辨率的浅层layer和具有丰富语义信息的深层layer。这样就实现了从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时不产生明显的代价。
下面说一下长得很像的两个网络:
上面那张图并不是FPN,他只是用最后一张合成的feature map做预测,真实的feature map是每一层都用anchor做预测。事实证明,FPN的效果更好,因为在不同层使用anchor可以增加对于尺寸变化的鲁棒性。当然第一个也有anchor,它的数量即使远远大于FPN,效果也不如FPN,因为缺少鲁棒性。
下面说一下融合方式:
Bottom-up pathway
resnet的网络结构是这样的:他有4个stage,每个stage中的feature map尺寸都是一样的,stage之间用步长为2的3*3卷积做降采样。对于我们的特征金字塔,我们为每个stage定义了一个金字塔级别。我们选择每个stage的最后一层的输出作为我们的特征映射的参考集。因为每个阶段的最深层都应该具有最好的特征。具体来说,对于ResNets,我们使用每个stage最后一层的特征激活输出。对于conv2、conv3、conv4和conv5输出,我们将这些最后剩余块的输出表示为{C2、C3、C4、C5},并注意它们对输入图像的像素步长为{4、8、16、32}。由于conv1的内存占用很大,所以我们没有将它包括在金字塔中。
Top-down pathway and lateral connections.
自顶向下路径通过从更高的金字塔层次上采样,从而产生更高分辨率的特征。这些特征通过自下而上的连接得到增强。每一个横向连接都融合了自底向上和自顶向下路径上相同空间尺度的特征图。自底向上的特征映射具有较低的语义级别,但更有利于定位,因为它的子采样次数更少。
它的连接过程为:首先使用上采样(如最近邻),然后使用1*1卷积核,改变channel,然后进行像素间相加,最后用3*3的卷积核处理已经融合的特征图,解决上采样带来的混叠效应。为了后面的应用能够在所有层级共享分类层,这里固定了3*3卷积后的输出通道为d,这里设为256.因此所有额外的卷积层(比如P2)具有256通道输出。这些额外层没有用非线性(实验发现作用很小)。{C2, C3, C4, C5}层对应的融合特征层为{P2, P3, P4, P5},对应的层空间尺寸是相通的。
FPN for RPN
RPN是一个与类别无关的,滑动窗口的检测器,它通过一个33的滑动卷积核,完成二分类和bbox的回归。他首先是一个33的卷积核,然后再是两个1*1的卷积核。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。在每一个scale层,都定义了不同大小的anchor,对于 P 2 P_{2} P