Learning Spatial Fusion for Single-Shot Object Detection one-stage-yolo优化
paper:https://arxiv.org/abs/1911.09516
code:https://github.com/ruinmessi/ASFF
此篇文章在coco上基于yolov3的baseline将精度刷到0.44,且fps为29,仍然可以做到超实时,主要还是一种新的特征融合方法+相当强大的baseline(yolov3++测试ap0.38),asff模块之外加入了可变形卷积,编译起来有点麻烦,在voc上作者称可以达到0.82左右,总体来说,在yolov4和yolov5没有出来之前,是当年的one-stage的sota算法,本文将按照论文结构解读。
Abstract
特征金字塔是解决对象检测中尺度变化不一的常用方法。然而,对于基于特征金字塔的single-shot检测器而言,不同尺度之间的特征不一致限制了检测器精度和性能。 在这项工作中,我们提出了一种新颖的,数据驱动的金字塔特征融合策略,称为自适应空间特征融合(ASFF)。 它是一种能够学习如何在空间上过滤信息冲突以抑制特征尺度不一致的方法,从而改善了特征的比例不变性,引入的推理开销几乎没有,当年的sota之一,如下图所示。

Introdeuction
文中指出,与图像金字塔相比,特征金字塔的主要缺点之一就是不同尺度的feature是不一致或者冲突的,具体来说,当使用特征金字塔来检测对象时,将采用启发式引导的特征选择;大实例通常与深层特征图相关联,小实例通常与浅层特征图相关联,当某个对象在某个级别的特征图中被指定为正时,它在其它层的相应区域被视为背景(yolo在计算positive example的时候应该是每一层特征都有各自的anchor,然后利用anchor与gt的iou计算正样本,那冲突的情况具体在哪个地方体现?本文的意思应该是,当一个目标在3层feature上都有正样本那当然是理想情况,但是最常见情况的是feature1上有 ,其他层没有,这个时候就造成了不一致、冲突),当图像同时包含大对象和小对象时,不同级别的特征之间冲突往往会占据特征金字塔的主要部分,这种不一致干扰了训练期间的梯度计算,并降低特征金字塔的有效性。
基于此,本文提出自适应空间特征融合(ASFF)模块,已解决single-shot检测器中的特征金字塔中特征冲突问题,ASFF能够是网络直接学习如何在其他级别对特征进行空间滤波,从而仅保留有效的信息以进行组合,对于某个级别的特征,首先将其他级别的特征进行积分,然后将其他级别的特征调整为相同的分辨率,然后进行训练以找到最佳的融合方式,在每个空间位置(其实就可以理解为像素点或者featuremap点),将不同级别的特征自适应的融合在一起,也就是说,通过训练,干掉那些带有尺度不一致、矛盾的特征,留下不同层融合后那些更具有识别度的特征。
总体来说,ASFF具有以下优点:
1、由于搜索最佳融合的操作时可微分的,因此反向传播中可以方便的学习(其实这就是本文的最核心,特征融合并不是简单的concat,而是通过学习来进行融合,融合的操作是通过积分操作的,同样可微可导,则保证了整体的学习和优化过程,充分体现了一个端到端的神经网络本身凸优化的原理)
2、对主干模型敏感,适应于具有特征金字塔结构的single-shot检测器
3、实现简单、计算量小
Method
3.1 strong baseline
首先,本文利用近两年的优化tricks将baseline(yolov3)的coco的map优化至0.38,如下图所示:

我们可以看到,经过优化后,fps在tesla v100上面可以做到50fps,可以理解为一种实时。其中主要优化手段:anchor-free分支+guide anchor、iou loss、BoF(mixup、label smooth等等)。
3.2 Adaptively spatial feature fusion(自适应特征融合)
ASFF的关键思想是自适应地学习每个比例下特征图的融合空间权重(重点:这个权重是可学习的,这就是我上文说的对应凸优化部分)。 如figure2所示,它包括两个步骤:相同地缩放和自适应融合。当然,模型预测和训练都是类似于yolov3,多级预测+yolo坐标回归方式+nms,本文不详细展开后处理,只讨论特征融合ASFF。

3.2.1 feature resizeing:假定将级别I的feature表示为xi,此时,首先我们将另外一个级别N的feature(xn)调整为与xl同样的shape,由于yolov3每个级别具有不同的分辨率和channels,此时需要相应的对每种情况修改上采样和下采样策略。
整个ASFF的结构如下图代码所示,相当清晰,如下图左图所示,level=2时,即最浅层feature,level=1时,中间层feature,level=0时,最深层feature。
上采样:首先将1*1的conv压缩到与级别I相同的channel,然后基于级别I分辨率进行插值。
1/2比例下采样:使用stride=2的3*3的conv来同时修改channels和分辨率。
1/4比例下采样:先使用stride=2的conv进行计算,然后再使用stride=2的max-pool下采样
变换流程(见下图code,很清晰):
feature1、2 -> feature0:feature1使用 1/2比例下采样方式。feature2使用1/4比例下采样
feature0、2 -> feature1:feature1使用 上采样方式。feature2使用1/2比例下采样
feature0、1 -> feature2:feature0使用 上采样方式(scale_factor=4)。feature2使用1/2比例下采样


3.2.2 adaptive fusion:上面部分提到了如何将不同分层次的feature变换成相同的shape,本节解析如何将其进行自适应学习融合。如figure 2所示,不同级别的特征需要融合,令Xnij→l表示从n层调整为l层的特征图上位置(i,j)处的特征向量。 我们建议在相应级别l融合功能,如下所示:

具体公式如式1所示,当选取某一层时,其他层的特征都被resize到相同的shape,再使用式1进行融合,对于权重参数α,β和γ,代表着不同级别的feature的空间的重要性,这些值是也是网络自适应学习到的(网络需要学习2点:1、特征resize时的卷积权重;2、层级特征融合的比例权重),并且参数α,β和γ经过concat之后通过softmax使得他们的范围都在[0,1]内并且和为1(式2),code如下图所示。

3.3 consistency property(一致性属性)
文章进一步的通过梯度和反向传播来解释ASFF为什么会有效,将梯度分析聚焦在一个level的feature上,梯度根据链式求导规则,梯度计算公式如下(公式看不懂就算了,直接从公式下面开始看,我写的很好理解了):

其中由于上面不同层尺度变换时使用的是上采样和下采样,假定
可以将公式5进一步简化为下式:

假定将level 1的位置(i,j)存在anchor与正样本IOU>门限,则此时level 1的位置的梯度
来自正样本,而其他level上对应(i,j)位置刚好为负样本,这样反向传播过程中梯度既包含了正样本又包含了负样本,这种不一致性会干扰
的梯度计算,并且降低了训练的效率(本文也提到参考文献中是使讲这些negative example区域直接忽视,不让他反向传播,尽管消除了本层的冲突,但是对其余层的会造成影响)。此时使用ASFF的方式,反向传播的梯度变成了下式:

其中中α1ij,α2ij,α3ij∈[0,1]。 利用这三个系数,如果α2ij→0和α3ij→0,则可以解决梯度不一致的问题。由于可以通过标准的反向传播算法学习融合参数,因此,经过一定的训练过程可以产生这种效果(参见figure 4的可视化结果)。
以上就是特征融合的流程、代码和原理(数学计算)了,基于特征冲突,利用这种融合方式,在各个数据集上产生了良性的效果。

实验结果:


可以看到,ASFF可以称之为sota了,ASFF800达到了43.9%的ap值,且fos可以达到29.4在tesla v100上。
就是有一个小问题,除了ASFF模块以外,用到其他的模块有点多,就是前面将yolov3的baseline堆上38.8%的时候,包括RFB、deform conv等。导致一个小问题,注意运行code时,一定要注意预训练模型和可选参数的对应,官方代码使用的模块太多,配合不同的可选参数来配置,但预训练模型或者训练时没有详细说明,很容易弄错,所以我经常弄混,一定要注意配合使用
