目的
为什么使用特征金字塔呢,是因为CNN对物体的平移是保持不变的,而对于物体的尺度变换是无法处理的;而且高层的语义信息较丰富,但经过多层特征提取和压缩,缺少对于小尺度的细节信息,所以使用特征金字塔进行处理,下面进行介绍。
特征金字塔结构的演变
Featurized image pyramid
对图像做一个特征金字塔,在每一个图像上做CNN,进行预测,但 计算与内存开销太大。
Single feature map
对图像做一个CNN,相当于一个特征金字塔,不对图像做特征金字塔,在最高层做一个预测,但这存在感受野问题,越抽象感受野越大,对于小的特征可能检测不到,使用Single feature map的包括R-CNN、SPPNet、Fast R-CNN、Faster R-CNN、YOLOv1以及R-FCN系列。
Pyramidal feature hierarchy
在每一层特征做预测,问题在于越底层FeatureMap的语义信息越薄弱,底层大scale的feature map语义信息少,虽然框出了小物体,但小物体容易被错分,使用Pyramidal feature hierarchy的包括SSD。SSD没有上采样过程,因为是在原有特征图上预测的,所以也不会增加额外的计算开销,但作者认为SSD没有用到足够底层的特征,而越底层的特征对检测小物体越有利。SSD用的最底层的特征是conv4_3。
总结:上面abc这三种卷积方式都不是特征理想,那么怎么才能兼顾**准确率(检测小物体)和速度(开销)**呢?接下来就是FPN了。
FPN(Feature Pyramid Network)
为了解决以上三种结构的不足之处,这篇论文提出了FPN,即使每一层不同尺度的特征图都具有较强的语义信息。
这种网络结构,能够在增加较少计算量的前提下融合低分辨率语义信息较强的特征图和高分辨率语义信息较弱但空间信息丰富的特征图。
其实在这篇论文之前,也有人提到得出一张既具有高分辨率又具有较强语义信息的特征图进行预测,但FPN的独特之处在于,它是在以特征金字塔为基础结构上,对每一层级的特征图分别进行预测。
特征金字塔网络相当于
- 先进行传统的bottom-up自上而下的特征卷积(d图左侧),
- 然后FPN试图融合左侧特征图的相邻的特征图。
左侧模型叫bottom-up,右侧模型叫top-down,横向的箭头叫横向连接lateral connections。
这么做的目的是因为高层的特征语义多,低层的特征语义少但位置信息多。
左侧模型特征图大小相差1倍,但像AlexNet一样,其实是每在同样大小的feature上卷积几次才进行一次池化操作,我们把在同样大小feature上的卷积称之为一个stage。d图这里画的图是每个stage的最后一个卷积层,因为每个stage的最后一层feature语义信息最多。
具体做法是
- 高层的较小的特征图up 到 和上一stage特征图一样大(上采样方法很多,上采样几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素,总之是把feature大小扩大了一倍,up特征图大小时最好用常见的差值法,少用反卷积,因为想更好的保留原本那层的特征信息,反卷积会丢失一部分)。
- 较低层特征通过1×1卷积改变一下低层特征的通道数,然后简单地把将 高层上采样后的特征图 和 1×1卷积后的结果 对应元素相加。(为什么横向连接要使用1×1卷积呢,为什么不能原地不动地拿过来呢?原来在于作者想用1×1改变通道数,以达到各个level处理结果的channel都为256-d(通道数相同),便于后面对加起来的特征进行分类。)这段文字表述的即是下图。
- 最后把各个 stage的图都up到同样大小,concate在一起(通常按C通道合并),最后可以接个conv调整C通道数,后面接自己的任务分支。
下图中 右侧不是每个都predict,其实是把各个up后的各个特征图concate在一起在接prediect分支
FPN只是提取特征的一种方法而已,可以用在各种网络结构中,各种任务上。
实际模型结构示例
此模型backbone是resnet18+fpn结构,只展示fpn结构部分
更详细的可参考:知乎讲解