写在前面
看过的论文自己不整理或实现一下理解和印象很浅,突然提起还有种陌生的感觉。前段时间看了FPN(Feature Pyramid Networks),该网络主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量情况下,大幅度提升了小物体检测的性能。论文发表时,Faster R-CNN+FPN的结构,在COCO数据集上取得了最高的单精度模型,下面做个简单整理。
基本思想
检测出不同尺度下的目标是计算机视觉面临的很大挑战。下图中的(a)、(b)、(c)是大多数人使用的已有策略。作者充分利用卷积网络内在的多尺度性质,并融合了不同层次的语义信息,设计了FPN结构(图d),很好的解决了问题。
下图是FPN的具体结构设计,通过Top-down结构和横向连接,融合具有高分辨率的浅层Layer和具有丰富语义信息的深层Layer,以此实现从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时不产生明显的代价。
具体的融合过程如下:首先上层上采样2倍(最近邻上采样),浅层进行1x1的卷积保证两层的维度相同,最后进行相加进行融合,得到更具有语义信息的浅层。最后,特征金子塔的每一级都进行3x3的卷积,免除上采样产生的混叠效应。
FPN和Faster R-CNN的结合
FPN分别在Faster R-CNN中的RPN和Fast RCNN 两步中起到作用。其中RPN和Fast RCNN 分别关注的是召回率和正检率。
RPN: 在RPN中,区别于原论文直接在最后的Feature Map上设置不同尺度和比例的 anchor,因为特征金字塔的不同层以及代表了不同的尺度(本文的尺度信息对应于相应的Feature Map、分别设置面积为 32^2, 64^2, 128^2, 256^2, 512^2),所以产生Anchor的时候,在特定层只考虑比例。比例用类似于原来的方式设置 {1:2, 1:1, 2:1} 三种。与RPN一样,FPN 每层Feature Map加入3x3的卷积及两个相邻的 1x1 卷积分别做分类和回归的预测。在 RPN 中,实验对比了FPN不同层 Feature Map卷积参数共享与否,发现共享仍然能达到很好性能,说明特征金字塔使得不同层学到了相同层次的语义特征。
Fast RCNN: Fast Rcnn就是一个基于区域的目标检测器。以往它的输入是单尺度的。现在考虑FPN多尺度。我们需要将将不同大小的ROI,对应到特征金字塔的不同的层(因为我们将CNN的特征金字塔看成是来自于Image Pyramid)。论文给出了计算公式:
$$k=\left \lfloor k_0 + \log_2(\sqrt{wh}/224) \right \rfloor$$
公式中224是ImageNet预训练的经典大小,$k_0$是224x224大小的ROI对应到的层,ResNet Faster RCNN中对应C4。如果有一个ROI大小是224x224的1/2,也就是更小的目标,应该对应到比C4更浅的层去。再根据池化的步长,很容易推测出对应到C3,那么检测112x112大小的ROI,就到C3层检测。
参考文献
[1] FPN-Feature Pyramid Networks for Object Detection.
[2] 特征金字塔FPN