和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,这样的操作确实很皮。
自底向上增强
如上图中所示,FPN是自顶向下,将高层的强语义特征传递下来,对整个金字塔进行增强,不过只增强了语义信息,对定位信息没有传递,而本文就是针对这一点,在FPN的后面添加一个自底向上的金字塔,可以说是很皮了。这样的操作是对FPN的补充,将低层的强定位特征传递上去,个人称之为”双塔战术“。
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的论文了。
- 论文地址:arxiv.org/abs/1803.01…
- 论文名称:Path Aggregation Network for Instance Segmentation
从图中可以看到,先有一个跟FPN相同的上采样过程,然后再从浅到深用stride为2的卷积完成下采样。用stride为2的卷积层把浅层的特征图P3下采样,然后尺寸和C4相同,两者拼接之后再用3x3的卷积层进行整理,生成P4特征图
此外还有很多复杂的双向融合的操作,这里不仔细介绍啦。
6 BiFPN
上面的PAnet是最简单的双向FPN,但是真正起名为BiFPN的是另外一个论文。
- BiFPN:2019年google团队提出的。
- 论文地址:arxiv.org/abs/1911.09…
- 论文名称:EfficientDet: Scalable and Efficient Object Detection
结构不难理解,其实就是在PAnet的结构上,做了一些小改进。但是这个论文的主要贡献还是EfficientDet的提出,所以BiFPN只是算是一个小贡献。
7 Recursive-FPN循环特征金字塔网络
- Recursive-FPN:效果之好令人惊讶,使用递归FPN的DetectoRS算是目标检测任务的SOTA了吧。(2020年的论文)
- 论文链接:arxiv.org/abs/2006.02…
- 论文名称: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层,把通道数恢复到要求的值就可以用了。