常见特征金字塔网络FPN及变体

  • 好久没有写文章了(对不起我在划水),最近在看北京的租房(真真贵呀)。
  • 预告一下,最近无事,根据个人多年的证券操作策略和自己的浅显的AI时间序列的算法知识,还有自己Javascript的现学现卖,在微信小程序上弄了个简单的辅助系统。我先试试效果如何,不错的话将来弄个文章给大家介绍介绍。

感兴趣可以联系炼丹兄哦,WX:cyx645016617。

1 概述

FPN是Feature Parymid Network的缩写。

目标检测任务中,像是在YOLO1中那种,对一个图片使用卷积来提取特征,经过了多个池化层或者stride为2的卷积层之后,输出了一个小尺度的特征图。然后再这个特征图中来做目标检测

换句话说,最后得到的目标检测的结果,完全是依赖于这一个特征图,这种方法叫做单stage物体检测算法

可想而知,这种方法很难有效的识别出不同大小的目标,所以产生了多stage检测算法,其实就是要用到了特征金字塔FPN。

简单的说就是:一个图片同样是经过卷积网络来提取特征,本来是经过多个池化层输出一个特征图,现在是经过多个池化层,每经过一个池化层都会输出一个特征图,这样其实就提取出了多个尺度不同的特征图。

然后尺度不同的特征图,丢进特征金字塔网络FPN,做目标检测。

(如果还不明白,继续往下看就明白啦~)

2 FPN结构概述

从图中可以看到:

  • 左边的c1啊,c2啊表示不同尺度的特征图。原始的图像input的尺寸经过一个池化层或者stride为2的卷积层之后,尺寸减少一半,这样就变成了C1特征图;如果又经过一个池化层,那么就变成C2特征图。
  • C3,C4,C5,C6,C7这个四个尺度不同的特征图,进入FPN特征金字塔网络进行特征融合,然后再用检测头预测候选框。
  • 这里说一些个人的理解(如果有错误,请指正呀): 这里刚好区分一下多stage检测算法和特征金字塔网络的区别。
    • 多stage检测算法:从上图中我们可以看到P3,P4,P5,P6,P7这五个不同尺度的特征图进入一个检测头预测候选框,这个检测头其实就是一个人检测算法,不过这个神经网络的输入是多个不同尺度的特征图,输出则是候选框,所以这个多sgtage检测算法;
    • 特征金字塔网络:这个其实是让不同尺度的特征图之间互相融合,来增强特征图表征能力的一种手段。这个过程不是预测候选框,应该算进特征提取的过程。FPN神经网络的输入也是多个不同尺度的特征图,输出也是多个不同尺度的特征图,和输入的特征图是相同的。

所以呢,一个多stage检测算法其实是可以没有FPN结构,直接用卷积网络输出的C3,C4,C5,C6,C7放进检测头输出候选框的。

3 最简单的FPN结构

自上而下单向融合的FPN,事实上仍然是当前物体检测模型的主流融合模式。如我们常见的Faster RCNN、Mask RCNN、Yolov3、RetinaNet、Cascade RCNN等,自上而下的单向的FPN结构如下图所示

这个结构的精髓就是:C5的特征图,经过上采样,然后和C4的特征图拼接,然后把拼接之后的特征图经过卷积层和BN层,输出得到P4特征图。其中P4和C4的特征图的shape相同。

经过这样的结构,所以P4可以学到来自C5更深层的语义,然后P3可以学到来自C4更深层的语义。个人对此结构有效的解释,因为对于预测精度来说,肯定是越深层的特征提取的越好,所以预测的越准确,但是深层的特征图尺度较小,通过上采样和浅层的特征图融合,可以强化浅层特征图的特征表述。

4 无FPN的多stage结构

这是一个没有用FPN结构的结构图。无融合,又利用多尺度特征的典型代表就是2016年日出的鼎鼎有名的SSD,它直接利用不同stage的特征图分别负责不同scale大小物体的检测。

可以看到,卷积网络输出的特征图直接就放进了特征头输出候选框。

5 简单双向融合

原来的FPN是自深到浅单向的融合,现在是先自深到浅、再从浅到深双向的的融合。PANet是第一个提出从下向上二次融合的模型:

  • PAnet: Path Aggregation Network.2018年的CVPR的论文了。
  • 论文地址:https://arxiv.org/abs/1803.01534
  • 论文名称:Path Aggregation Network for Instance Segmentation

从图中可以看到,先有一个跟FPN相同的上采样过程,然后再从浅到深用stride为2的卷积完成下采样。用stride为2的卷积层把浅层的特征图P3下采样,然后尺寸和C4相同,两者拼接之后再用3x3的卷积层进行整理,生成P4特征图

此外还有很多复杂的双向融合的操作,这里不仔细介绍啦。

6 BiFPN

上面的PAnet是最简单的双向FPN,但是真正起名为BiFPN的是另外一个论文。

  • BiFPN:2019年google团队提出的。
  • 论文地址:https://arxiv.org/abs/1911.09070
  • 论文名称:EfficientDet: Scalable and Efficient Object Detection

    结构不难理解,其实就是在PAnet的结构上,做了一些小改进。但是这个论文的主要贡献还是EfficientDet的提出,所以BiFPN只是算是一个小贡献。

7 Recursive-FPN循环特征金字塔网络

  • Recursive-FPN:效果之好令人惊讶,使用递归FPN的DetectoRS算是目标检测任务的SOTA了吧。(2020年的论文)
  • 论文链接:https://arxiv.org/abs/2006.02334
  • 论文名称:DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution

个人在自身的目标检测任务中,也使用了RFN结构,虽然要求的算力提升了一倍,但是效果确实提升的比较明显,大概有3到5个点的提升。 下面来看结构图:

可以看到,这个有一个虚线和实线构成了一个特征图和FPN网络之间的一个循环。下面展示一个2-step的RFP结构,也就是循环两次的FPN结构。(如果是1-step,那就是一般的FPN结构)
可以看到,就是把之前的FPN结构中的P3,P4,P5这些,再拼接到卷积网络的对应的特征提取过程。拼接之后使用一个3x3卷积层和BN层,把通道数恢复到要求的值就可以用了。