FPN应该是2017年CV顶会的优秀论文,基于目标检测做的研究,在小物体检测方面较为具有吸引力。
1.FPN
源论文:feature pyramid networks for object detection
参考代码:FPN
同时利用低层特征高分辨率和高层特征的高语义信息,融合不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同。(caffe源代码包含merge和share两种形势。)
2.PANet
2018年CVPR,实例分割,COCO2017实例分割比赛的冠军,目标检测比赛的第二名
PANet是用来分割的网络,但一样也适用目标检测,总览图:
创新a:Bottom-up Path Augmentation:建立了一条从低层到高层的干净的横向连接路径(简单来讲就是再加一层由底向上的FPN)
创新b:Adaptive Feature Pooling:主要是考虑将某个proposal分配给某个level这一操作,虽然是通过公式计算,但其实并不能与其他层切割,所以,对每个proposal的所有层每个池化特征都进行预测。(记得AugFPN也有这一操作。)
创新c:Fully-connected Fusion,这是一个mask分支,在mask rcnn上的改进,不做分割,这一部分不是很了解。
源论文:Path Aggregation Network for Instance Segmentation
3. NAS-FPN
目标:更好的学习可扩展特征金字塔结构,用于目标检测。
在一个覆盖所有交叉尺度连接的可扩展搜索空间中,采用神经网络结构搜索,发现了一种新的特征金字塔结构。架构名为NAS-FPN,由自顶向下和自下而上的连接组合而成,可以跨范围地融合特性。
说到这里,不得不说到,NAS,神经网络架构搜索,强化学习训练一个控制器在给定的搜索空间选择最好的模型结构,优化FPN结构。
方法是基于RetinaNet ,两个组成部件是backbone和FPN,如上图所示。中间的FPN是需要优化的部分。怎么优化呢,就是在给定的搜索空间内选择最佳的模型架构,‘控制器使用搜索空间中的子模型的准确性作为更新其参数的奖励信号。 因此,通过反复试验,控制器可以学习如何随着时间的推移生成更好的架构。’。
搜索空间:FPN的众多跨连结构组成了一个完整的搜索空间,许多mergeing cells组成一个FPN,合并来自不同的层融合的特征表示,(一个cell融合两个层),组成了FPN的元结构,从而构成了模块化的搜索空间,结构如下:
merging cell融合两个层的操作是sum和global pooling,输入特征层首先经过最近邻采样或者max-pooling调整输出分辨率,每个merge特征层后跟一个RCB操作,即relu,conv,bn,常规操作。
NAS 利用强化学习训练控制器在给定的搜索空间中选择最优的模型架构。控制器利用子模型在搜索空间中的准确度作为奖励信号来更新参数。因此,通过反复试验,控制器逐渐学会了如何生成更好的架构。由于不知道 FPN 的跨连接情况,NAS-FPN 采用 RNN 作为控制器,使用该控制器来产生一串信息,用于构建不同的连接。其宏观结构如下图所示:
搜索得到的最优 FPN 结构如下图,其控制器收敛得到的最终 FPN 结构如 (f) 所示,并且其精度最高。从中可得训练时间越长其轨迹越曲折混乱,(每个点代表一个特征层。同一行的特征层具有相同的分辨率。分辨率在自底向上下降。箭头表示内部层之间的连接。图中左侧是输入层。金字塔网络的输入用绿色圆圈标记,输出用红色圆圈标记):
最终收敛的 FPN 网络结构:
直观感觉:搜索结构中做了一些改动,比如GP,RCB,Sum。最终结果确实上升明显,但是为什么论文中没有写原始FPN加上这些操作或者直接将FPN结构固定所得的对比实验是什么样子。存疑。
NAS综述:NAS(神经结构搜索)综述
源论文:NAS-FPN
4. AugFPN
在经典FPN结构的基础上做了改进,结构如下:
经典的FPN,有三个缺陷(文章说的):
缺陷1:before feature fusion,FPN在特征混合之前,backbone的不同stage学习到的特征需要先经过1*1卷积进行一个降维,降到通道数相同才能进行特征相加。然而不同stage学习到的特征感受野是不一样的,包含的语义信息也不同。把两个语义信息差距较大的特征直接相加,势必会减弱多尺度特征的表达能力。简言之:特征求和前不同层次特征之间的语义差异。
缺陷2:top- down feature fusion,自顶向下的特征融合过程就是将顶层的高级特征和底层的低级特征相融合的过程,这样虽然底层的特征得到了来自顶层的高级特征的加强,然而由于顶层的特征经过1*1降维,势必会造成信息损失。简言之:金字塔顶层层次特征的信息丢失。
缺陷3:after feature fusion,FPN中每个候选区域(ROI)的特征都是根据proposal的尺度来决定相应的特征图从哪一层选择,然而那些忽略的层也是包含着丰富信息的,它们对最终的分类和回归结果也有着影响。直接忽略了其它层的特征势必会影响到最终的检测结果。简言之:RoIs的启发式分配策略。即用所有的层上的roi作为回归分类的依据。
针对这三个缺陷,AugFPN做了三个改进:
改进1:Consistent Supervision(一致性监督):缩小特征融合前不同尺度特征之间的语义差距
对混合之后的特征图M2-M5做一个监督。具体做法:对RPN网络得到的每一个候选区域都分别映射到M2~M5上得到相应的feature map,然后直接对这些feature map做分类和回归,可以得到一个损失函数。将这一损失和网络本身的损失做一个加权求和。由于在测试阶段,这个分支是不参与计算的,所以Consistent Supervision对模型最终的参数和计算量没有影响。(个人理解:就是根据混合之后的特征图上的分类结果,判断混合的信息是不是较优的)
改进2:Residual Feature Augumentation (残差特征增强):通过残差特征增强提取比率不变的上下文信息,减少特征映射在最高金字塔层次的信息丢失
由于FPN特征融合之前需要先进行1x1的特征降维,这会导致M5的信息损失。为了避免这种信息损失,作者提出了一种很巧妙的办法。因为C5的信息是没有损失的,如果能够将C5的信息融合到M5上,就可以有效减少这种信息损失了。为此作者提出了ASF的结构,如Figure 3(a)所示。首先按照比例不变,对C5进行自适应池化操作,然后对每个尺度的特征图进行1*1降维,然后对降维后的特征进行上采样,对上采样之后的特征按照学习到的权重进行相加,把相加完之后的特征称之为M6,再将M6和M5进行相加作为最终的没有损失的M5。
改进3:Soft ROI Selection(软RoI选择):自适应地学习更好的RoI特征
FPN中ROI对应的特征是根据ROI的尺度选择对应提取的层,一般小的ROI对应低级特征,大的ROI对应高级特征(我的理解,高级感受野更大,负责检测大的目标)。然而事实上,这并不是一种最优的办法。因为有时候两个相同大小的ROI可能会被分到不同层的特征,即使某个ROI被分到了某一层,但其实其它层的特征也包含着描述这个ROI的信息。因此,论文提出了一种Soft RoI Selection的办法。具体做法是,对于任意一个ROI,我们都会提出它在不同层的特征图上所对应的特征,然后利用网络本身学习权重参数,将这些不同层上的特征进行求和作为这个ROI最终的特征,这一结构和Residual Feature Augmentation中使用的自适应求和操作是一样的。(这一点与PANet很像,先后不作争辩,想想确实有道理。但这样计算也会相应增加吧。)
源论文:AugFPN
源代码:AugFPN源码
5. BiFPN
谷歌团队,与前面NAS-FPN一样,都是想要寻找有效的BLOCK,重复叠加,对比如图:
BiFPN具体结构:
不得不说,这个和PANet差不并不大,主要是,作者说可以重复很多次(?),至于重复多少次就是速度与精度的权衡了,源论文笔者还没有细读,单从结构上来说就是多了一个向上的结构。另外一个小细节,特征融合是带权重进行融合的,权重生成方式是softmax,但是比较费时,于是去掉指数运算,简化为一个快速方式(fast normalized fusion)。简化了参数量,顺带优化了PANet,
源论文:BiFPN
6.Recursive-FPN(递归FPN)
递归FPN的DetectoRS是目前物体检测(COCO mAP 54.7)、实体分割和全景分割的SOTA。
idea很好理解:套娃,将传统FPN的融合后的输出,再输入给Backbone,进行二次循环:
展开看看,一目了然:
源论文:Recursive FPN
7. FPT(Transformer)
源论文:FPT
源代码:FPT源码pytorch
其次还有很多FPN变体,可谓数不胜数。。。Fully-FPN,Simple-PAN,Libra R-CNN等等等等,有空再更
最后,记录一下一些特征融合方式: CV中的特征融合SFAM、ASFF、BiFPN、Hyper column