tags: 单阶段;多尺度特征金字塔
代码: https://github.com/qijiezhao/M2Det
地址:https://arxiv.org/abs/1811.04533
前言
FPN现在已经是目标检测的标配,其利用自底向上的特征金字塔搭建成自顶向下的特征,从而利用这些特征进行预测,在一定程度上解决了不同尺度目标的检测。然而,卷积层的金字塔形式最原始的设计是用来解决分类问题,与检测问题有所区别。
本文尝试搭建更为有效的用于检测的特征金字塔:
- 将不同卷积层的特征进行融合,作为基础特征。
- 将基础特征送入类似U型的模块中进行编解码,并与基础特征进行融合,产生多层多尺度特征
- 最终将多层、多尺度特征进行聚合,构建检测金字塔进行密集采样检测。
提出缘由
现有的基础网络的目标都是针对图像分类而言的,因此对于检测任务并不是十分友好。而且现有的金字塔基本上都是从础框架中的某一特征层建立的,缺乏足够信息。深层次的特征对于分类而言,更具有说服力;而浅层次的特征对于目标的位置更友好。而且,浅层特征对于描述目标的简单特征更有力,深层特征对于描述目标的复杂特征更有力。然而,对于比如远处的人和近处的交通标志而言,其在某个特征层可能具有同样大小,但其特征复杂性却完全不同。所以,对于单层特征来说,要么对简单特征有很好的表达能力,要么对复杂特征有很好的表达能力,两者之间是不能同时满足的。因此如何解决这个问题就是本文算法的思路。
M2Det
网络同样是密集采样的形式,一共包含三个模块:
- 特征融合模块(Feature Fusion Module, FFM)
- U型模块(Thinned U-shape Module,TUM)
- 基于尺度的特征增强模块(Scale-wise Feature Aggregation Module, SFAM)
从上图中可以看到,FFMv1将主干网络中的语义特征进行了融合,得到了基础特征(base feature);TUM和FFMv2模块交替 ,前者从基础特征中提取多尺度特征,后者将基础特征与TUM产生的特征进行融合,最终将这些多尺度特征送入SFAM模块中,构建了基于不同尺度特征的金字塔,并进行了多层次的划分。
以VGG为例,具体如下:
- FFMv1将conv4_3,conv5_3的特征进行融合,产生基础特征
- 每个TUM都产生若干个不同尺度的特征图,而FFMv2负责将TUM产生的这些特征图与基础特征进行融合,然后送入下一个TUM中进行特征提取,反复交替。用公式表示如下:
第一个TUM只接受基础特征作为输入,后面TUM接受的是FFMv2的处理结果,而FFMv2要将基础特征和第一个TUM的处理结果相融合。
- SFAM模块将前面TUM产生的多层次、多尺度的特征进行融合,采用的方式是:尺度层面的特征拼接和通道层面的注意力机制
该结构中,conv5_3经过conv之后变为20x20x512,上采样之后变为40x40x512;conv4_3经过conv之后,变为40x40x256,然后将这两个结果特征图进行拼接,最终产生的维度为768x40x40,也就是基础特征图
768x40x40大小的基础特征经过conv之后,变为40x40x128,与TUM产生的128x40x40特征进行拼接后,变为256x40x40
TUM接收FFMv2的结果作为输入,经过内部的一个类似U型的编码-解码操作,产生了不同尺度的分支,这些分支用来预测不同大小的目标。上面的TUM负责预测小目标,中间的为中等目标,下面的为大目标。
该层是为了将前面各个TUM模块的结果进行汇合,从而产生多尺度,多层次的特征金字塔。聚合的过程如上图:因为前面的每个金字塔都有6中不同大小的尺度,分别为1x1,3x3,5x5,10x10,20x20,40x40,那么在该层中,通过将三种TUM模块中尺度对应的特征图进行拼接,这样就形成了6种拼接之后的特征图,其大小不变,厚度却增加了。然而,仅仅通过增加厚度还不够理想,所以通过了一个SE模块,使金字塔各层更关注于与自己更适应的目标尺度。
训练问题
太耗时!太耗内存!
实验结果
数据集coco
总结
本文提出了新的构建特征金字塔的方式,比FPN使用的基础层少,而且效果还不错。虽然整体框架看着很复杂,但是不难理解,佩服作者的脑洞。等硬件资源充足了,可以试试!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:M2Det目标检测 - Python技术站