FPN(Feature Pyramid Network)多尺度目标检测方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shenziheng1/article/details/82948131

参考论文:Feature Pyramid Networks for Object Detection

会议水平:CVPR 2017

开源代码:https://github.com/unsky/FPN

1. 多尺度目标检测问题

CNN网络对于位置变化的适应性很强,但是对尺度变化的表现很差,所以检测问题基本都要考虑尺度怎么处理。那么首先来看一幅非常具有代表性的图,这张图涵盖了目前很多检测问题在处理物体scale上的思路:

(a),在非深度的方法中非常常见,通过将图像缩放到不同大小,构成一系列的图像金字塔网络,这样一些类似于固定滑窗的方法就可以检测到大小不同的物体了。这个在深度检测中也不是没有应用,比如MTCNN,但是用得都不会很深,而且使用也不广泛,主要就是内存和时间上的巨大开销问题,因为CNN提取特征非常耗时。

(b)(c),思路更加常见,Faster RCNN其实就是(b)图的思路,用CNN网络的top层来进行预测,因为top层的语义化程度是最高的;但是CNN的卷积操作考察的是局部像素之间的关联性池化操作则对局部信息进行统计,因此CNN网络越top,feature map中的每个单元格的感受野就越大,相对的,就没有浅层那样精细,分辨率就会下降得比较厉害;这个问题在小目标上非常突出。(Comment: 卷积层越高,感受野越大,定位信息越不丰富,分辨率越差,但是语义信息越强)。也有研究人员尝试了类似图(c)的思路,比如SSD,在top层这种单元格感受野大的层上预测scales比较大的物体,而在浅层这种感受野小、分辨率比较高的层上预测scales比较小的物体。但是这样会导致的一个问题就是,浅层虽然分辨率提高了,语义化程度还是不够高,去预测小目标效果还是不好。

FPN就提出了一种解决思路,在top层得到了语义化程度比较高的特征后,再不断升采样,然后和CNN网络中那些浅层特征融合,融合后的特征既有较高的语义性,也有较高的分辨率,这样再去分别预测不同scales的物体就会有比较好的效果了。另外,在实际使用的时候,作者的特征是across scales的,换句话说,在预测某个scale目标的时候,其它scales的特征也会起到一定的作用,这个就是FPN的整体思路。

2. 作者的解决方案

作者采用的网络框架图如图所示:

可以看到网络整体上有三条线路,一个是左面的CNN网络,作者称之为Bottom-up pathway;另一条则是将CNN得到的高语义化不断升采样,作者称之为top-down pathway;最后是将它们融合起来的侧边通道,作者称之为lateral connections:

  • bottom-up路线:作者使用了ResNet作为基础网络;这里面还有一个细节就是每个scales在哪个层上建立的问题。作者将大小相同的层都认为是一个stage的,而作者选用了一个stage里面最后的那一层来建立anchor。作者选取了四个尺度,分别建立在ResNet的conv2,conv3,conv4和conv5的output上,构成了C2,C3,C4,C5四个尺度的特征。而对应的融合后的特征是P2,P3,P4,P5
  • top-donw路线与lateral connection:later connection是一个1x1 conv层,可以用来减少通道数(降维度)、并进行跨通道的信息融合;而top-down则是依次进行了x2的upsample(最临近插值);C5到P5则是直接用1x1的卷积层连接起来;另外,在叠加后,还会使用一个3x3的卷积核来消除混叠效应。这样子,就很好的将高卷积层的强语义特征与低卷积层的强分辨率结合起来,提高了目标检测的准确度。

3. 在Faster RCNN当中的使用

作者改变了Faster RCNN,将FPN的思路糅合了进去

  • RPN:作者一方面将FPN放在RPN网络中用于生成proposal,原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为32^2,64^2,128^2,256^2,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。特别要指出的是,作者额外添加了一个P6层(由P5层进行stride 2的subsample得到),用来预测512大小的物体;ratios还是和原版一样
  • RoI pooling与RCNN:原版的RoI pooling统一到同一个大小的feature map,但是这对FPN并不合适,因为FPN在RPN阶段抽取的候选框本来就含有不同的尺度,作者的方法是将不同尺度的候选框map into到不同大小的特征图,具体的公式这里就不贴了,可以参考论文;另外作者关于RoI pooling之后的网络结构也有一定不同,作者添加了两个1024的fc层在最终的分类与回归层前,作者认为这更加轻便
  • 权值共享问题:每个特征层进行预测的结构是和原版Head一样的,不过比较特殊的是,作者这里采用了权值共享的策略,我的理解是在预测某个尺度的时候,其它尺度的特征也会参与预测,而不是各个尺度完全独立的预测

4. 网络框架图

5. 效果总结

5.1 加入FPN的RPN网络的有效性

网络这些结果都是基于ResNet-50。评价标准采用AR,AR表示Average Recall,AR右上角的100表示每张图像有100个anchor,AR的右下角s,m,l表示COCO数据集中object的大小分别是小,中,大。feature列的大括号{}表示每层独立预测。

(a)(b)(c)对比可以看出FRN的作用确实很明显。另外(a)和(b)的对比可以看出高层特征并非比低一层的特征有效。
(d)表示只有横向连接,而没有自顶向下的过程,也就是仅仅对自底向上(bottom-up)的每一层结果做一个1*1的横向连接和3*3的卷积得到最终的结果。从feature列可以看出预测还是分层独立的。作者推测(d)的结果并不好的原因在于在自底向上的不同层之间的semantic gaps比较大。
(e)表示有自顶向下的过程,但是没有横向连接,即向下过程没有融合原来的特征。这样效果也不好的原因在于目标的location特征在经过多次降采样和上采样过程后变得更加不准确
(f)采用finest level层做预测,即经过多次特征上采样和融合到最后一步生成的特征用于预测,主要是证明金字塔分层独立预测的表达能力。显然finest level的效果不如FPN好,原因在于PRN网络是一个窗口大小固定的滑动窗口检测器,因此在金字塔的不同层滑动可以增加其对尺度变化的鲁棒性。另外(f)有更多的anchor,说明增加anchor的数量并不能有效提高准确率。

5.2 将FPN用于Fast R-CNN的检测

(a)(b)(c)的对比证明在基于区域的目标卷积问题中,特征金字塔比单尺度特征更有效。(c)(f)的差距很小,作者认为原因是ROI pooling对于region的尺度并不敏感。

6. 总结

作者的这篇论文主要研究的问题是:如何融合高卷积层的强语义特征,以及低卷积层的强定位/分辨特征,总结如下:

1. 卷积操作是具有感知域的,而池化作用是在统计局部信息。也就是说,随着卷积-池化操作的进行,特征图像具有越来越强的语义表达能力,这主要在于感知域的大大提升。然而,由于感知域的扩大,也带来的目标定位/分辨能力差,尤其是对于小目标。

2. 作者提出的横向连接,主要就是为了融合高卷积层的强语义信息与低卷积层的强分辨信息,基于这样的特征金字塔方法确实提高了目标检测子的性能,尤其是小目标的解决能力。

3. 针对融合后的hierarchy output和final output,个人认为还是值得去继续探索的,尤其是hierarchy output,这是涉及到不同尺度特征决策后的融合问题,也就是如何为他们分配权重,这值得考虑。

猜你喜欢

转载自blog.csdn.net/shenziheng1/article/details/82948131