FPN实验总结

这个实验虚拟环境踩了一些坑(版本问题),不过在notebook上体验了一下retinanet的实验结果,参考的是FAIR最新视觉论文集锦,机器之心论文解读。
在物体检测里面,有限计算量情况下,网络的深度(对应到感受野)与 stride 通常是一对矛盾的东西,常用的网络结构对应的 stride 一般会比较大(如 32),而图像中的小物体甚至会小于 stride 的大小,造成的结果就是小物体的检测性能急剧下降。传统解决这个问题的思路包括:(1)多尺度训练和测试,又称图像金字塔,如图 1(a) 所示。目前几乎所有在 ImageNet 和 COCO 检测任务上取得好成绩的方法都使用了图像金字塔方法。然而这样的方法由于很高的时间及计算量消耗,难以在实际中应用。(2)特征分层,即每层分别预测对应的 scale 分辨率的检测结果。如图 1(c) 所示。SSD 检测框架采用了类似的思想。这样的方法问题在于直接强行让不同层学习同样的语义信息。而对于卷积神经网络而言,不同深度对应着不同层次的语义特征,浅层网络分辨率高,学的更多是细节特征,深层网络分辨率低,学的更多是语义特征。金字塔结构的优势是其产生的特征每一层都是语义信息加强的,包括高分辨率的低层把低分辨率、高语义信息的高层特征和高分辨率、低语义信息的低层特征进行自上而下的侧边连接,高层的特征往下传补充了低层的语义,使得所有尺度下的特征都有丰富的语义信息。这样就可以获得高分辨率、强语义的特征,有利于小目标的检测。
FPN实验总结_第1张图片
FPN的top-down(右边)结构把每一层的channels都改成了256d,然后每一层经过一个3x3的卷积消除上采样带来的混叠效应。
虚线框可以理解成特征融合的操作,1x1的卷积的作用:使bottom-up对应层降维至256;缓冲作用,防止梯度直接影响bottom-up主干网络,更稳定;组合特征。上采样2x up作者采用的是nearest neighbor。加号是elementwise sum。
FPN模型结构(tensorflow)
FPN实验总结_第2张图片
网络直接在原来的单网络上做修改,每个分辨率的 feature map 引入后一分辨率缩放两倍的 feature map 做 element-wise 相加的操作。通过这样的连接,每一层预测所用的 feature map 都融合了不同分辨率、不同语义强度的特征,融合的不同分辨率的 feature map 分别做对应分辨率大小的物体检测。这样保证了每一层都有合适的分辨率以及强语义特征。同时,由于此方法只是在原网络基础上加上了额外的跨层连接,在实际应用中几乎不增加额外的时间和计算量。作者接下来实验了将 FPN 应用在 Faster RCNN 上的性能,在 COCO 上达到了 state-of-the-art 的单模型精度。

具体而言,FPN 分别在 RPN 和 Fast RCNN 两步中起到作用。其中 RPN 和 Fast RCNN 分别关注的是召回率和正检率,在这里对比的指标分别为 Average Recall(AR) 和 Average Precision(AP)。分别对比了不同尺度物体检测情况,小中大物体分别用 s,m,l 表示。

在 RPN 中,区别于原论文直接在最后的 feature map 上设置不同尺度和比例的 anchor,本文的尺度信息对应于相应的 feature map(分别设置面积为 32^2, 64^2, 128^2, 256^2, 512^2),比例用类似于原来的方式设置 {1:2, 1:1,, 2:1} 三种。与 RPN 一样,FPN 每层 feature map 加入 3*3 的卷积及两个相邻的 1*1 卷积分别做分类和回归的预测。在 RPN 中,实验对比了 FPN 不同层 feature map 卷积参数共享与否,发现共享仍然能达到很好性能,说明特征金字塔使得不同层学到了相同层次的语义特征。
tensorflow版的是Fast RCNN实验,作者将模型分为share net、rpn、Fast RCNN(检测器)、Summary。
share net:每一层的heads都共享参数,作者认为共享参数的效果也不错就说明FPN中所有层的语义都相似。
rpn:在上图右侧的predict处加上RPN的head,即加上一个3x3的卷积和两个1x1的卷积预测类别和位置信息。然后在每一层分配不同scale的anchor boxes{32,64,128,256,512},宽高比是{1:2,1:1,2:1},也就是说负责预测的每一层的每一个位置都放置了15个anchors。FPN的top-down(右边)结构把每一层的channels都改成了256d,然后每一层经过一个3x3的卷积消除上采样带来的混叠效应。
Fast RCNN:每一层都加上predictor head(即分类器和bb回归器)。结构是:RoI pooling提取7x7的特征,然后经过两个1024-d fc层,然后是最终的分类和回归。实验需要固定 FPN+RPN 提取的 proposal 结果。在 Fast RCNN 里,FPN 主要应用于选择提取哪一层的 feature map 来做 ROI pooling。假设特征金字塔结果对应到图像金字塔结果。定义不同 feature map 集合为 {P2, P3, P4, P5},对于输入网络的原图上 w*h 的 ROI,选择的 feature map 为 Pk,其中(224 为 ImageNet 输入图像大小):
这里写图片描述
类似于 RPN 的实验,对比了原有网络,以及不同改变 FPN 结构的 Fast RCNN 实验,实验结果为:
FPN实验总结_第3张图片
实验发现 FPN 筛选 ROI 区域,同样对于 Fast RCNN 的小物体检测精度有大幅提升。同时,FPN 的每一步都必不可少。
注:
1.训练中,把重叠率(IoU)高于0.7的作为正样本,低于0.3的作为负样本(RPN:iou>=0.7 is positive box, iou< 0.3 is negative)。特征金字塔网络之间有参数共享,其优秀表现使得所有层级具有相似程度的语义信息。
2.横向连接:如果不进行特征的融合(也就是说去掉所有的1x1侧连接),虽然理论上分辨率没变,语义也增强了,但是AR下降了10%左右!作者认为这些特征上下采样太多次了,导致它们不适于定位。Bottom-up的特征包含了更精确的位置信息。
3.不同深度的 feature map 为什么可以经过 upsample 后直接相加?
作者解释说这个原因在于我们做了 end-to-end 的 training,因为不同层的参数不是固定的,不同层同时给监督做 end-to-end training,所以相加训练出来的东西能够更有效地融合浅层和深层的信息。
4.为什么 FPN 相比去掉深层特征 upsample(bottom-up pyramid) 对于小物体检测提升明显?(RPN 步骤 AR 从 30.5 到 44.9,Fast RCNN 步骤 AP 从 24.9 到 33.9),如果没有top-down的语义增强分支(仍然从不同的层输出),那么RPN的AR(average recall)会下降6%左右。
对于小物体,一方面我们需要高分辨率的 feature map 更多关注小区域信息,另一方面,如图中的挎包一样,需要更全局的信息更准确判断挎包的存在及位置。
5. 如果不考虑时间情况下,image pyramid 是否可能会比 feature pyramid 的性能更高?
作者觉得经过精细调整训练是可能的,但是 image pyramid 主要的问题在于时间和空间占用太大,而 feature pyramid 可以在几乎不增加额外计算量情况下解决多尺度检测问题。

福利:
CVPR 2018 Best Paper Taskonomy 作者解读
在TASKONOMY官网上有2018最佳论文的3D效果,可以在手机中体验(amazing),感觉里面的汗水跟脑细胞都不少。。。

你可能感兴趣的:(FPN实验总结)