感兴趣可以联系炼丹兄哦,WX:cyx645016617。
FPN是Feature Parymid Network的缩写。
目标检测任务中,像是在YOLO1中那种,对一个图片使用卷积来提取特征,经过了多个池化层或者stride为2的卷积层之后,输出了一个小尺度的特征图。然后再这个特征图中来做目标检测。
换句话说,最后得到的目标检测的结果,完全是依赖于这一个特征图,这种方法叫做单stage物体检测算法。
可想而知,这种方法很难有效的识别出不同大小的目标,所以产生了多stage检测算法,其实就是要用到了特征金字塔FPN。
简单的说就是:一个图片同样是经过卷积网络来提取特征,本来是经过多个池化层输出一个特征图,现在是经过多个池化层,每经过一个池化层都会输出一个特征图,这样其实就提取出了多个尺度不同的特征图。
然后尺度不同的特征图,丢进特征金字塔网络FPN,做目标检测。
(如果还不明白,继续往下看就明白啦~)
从图中可以看到:
所以呢,一个多stage检测算法其实是可以没有FPN结构,直接用卷积网络输出的C3,C4,C5,C6,C7放进检测头输出候选框的。
自上而下单向融合的FPN,事实上仍然是当前物体检测模型的主流融合模式。如我们常见的Faster RCNN、Mask RCNN、Yolov3、RetinaNet、Cascade RCNN等,自上而下的单向的FPN结构如下图所示 :
这个结构的精髓就是:C5的特征图,经过上采样,然后和C4的特征图拼接,然后把拼接之后的特征图经过卷积层和BN层,输出得到P4特征图。其中P4和C4的特征图的shape相同。
经过这样的结构,所以P4可以学到来自C5更深层的语义,然后P3可以学到来自C4更深层的语义。个人对此结构有效的解释,因为对于预测精度来说,肯定是越深层的特征提取的越好,所以预测的越准确,但是深层的特征图尺度较小,通过上采样和浅层的特征图融合,可以强化浅层特征图的特征表述。
这是一个没有用FPN结构的结构图。无融合,又利用多尺度特征的典型代表就是2016年日出的鼎鼎有名的SSD,它直接利用不同stage的特征图分别负责不同scale大小物体的检测。
可以看到,卷积网络输出的特征图直接就放进了特征头输出候选框。
原来的FPN是自深到浅单向的融合,现在是先自深到浅、再从浅到深双向的的融合。PANet是第一个提出从下向上二次融合的模型:
从图中可以看到,先有一个跟FPN相同的上采样过程,然后再从浅到深用stride为2的卷积完成下采样。用stride为2的卷积层把浅层的特征图P3下采样,然后尺寸和C4相同,两者拼接之后再用3x3的卷积层进行整理,生成P4特征图
此外还有很多复杂的双向融合的操作,这里不仔细介绍啦。
上面的PAnet是最简单的双向FPN,但是真正起名为BiFPN的是另外一个论文。
个人在自身的目标检测任务中,也使用了RFN结构,虽然要求的算力提升了一倍,但是效果确实提升的比较明显,大概有3到5个点的提升。 下面来看结构图:
可以看到,这个有一个虚线和实线构成了一个特征图和FPN网络之间的一个循环。下面展示一个2-step的RFP结构,也就是循环两次的FPN结构。(如果是1-step,那就是一般的FPN结构)
可以看到,就是把之前的FPN结构中的P3,P4,P5这些,再拼接到卷积网络的对应的特征提取过程。拼接之后使用一个3x3卷积层和BN层,把通道数恢复到要求的值就可以用了。
原文:https://www.cnblogs.com/PythonLearner/p/13946595.html