本篇文章最大的创新点是提出了一种新的特征融合的方式ASFF,通过学习权重参数的方式将不同层的特征融合到一起,作者证明了这样的方法要优于通过concatenation或者element-wise的方式。
代码:https://github.com/ruinmessi/ASFF
其实整篇文章能取得如此优秀的效果并不仅仅在于加入了ASFF这种自适应特征融合方式,作者在YOLOv3的基础上吸取了很多优秀的经验,构建了一个非常强劲的目标检测baseline,这个baseline的mAPJ就达到了38,其中包括:
Guided Anchoring
Bags of Tricks
Additional IoU loss
可以看到,这个baseline将yolov3的AP从33%提升到了38%,高达5个点之多。
自适应特征融合方式ASFF
为了充分利用高层特征的语义信息和底层特征的细粒度特征,很多网络结构都会采用FPN的方式输出多层特征,但是无论是类似于YOLOv3还是RetinaNet他们多用concatenation或者element-wise这种直接衔接或者相加的方式,作者认为这样并不能充分利用不同尺度的特征,于是提出了Adaptively Spatial Feature Fusion的自适应特征融合方式:
以ASFF-3为例,图中的绿色框描述了如何将特征进行融合,其中X1,X2,X3分别为来自level,level2,level3的特征,与为来自不同层的特征乘上权重参数α3,β3和γ3并相加,就能得到新的融合特征ASFF-3,如下面公式所示:
因为采用相加的方式,所以需要相加时的level1~3层输出的特征大小相同,且通道数也要相同,需要对不同层的feature做upsample或downsample并调整通道数。对于需要upsample的层,比如想得到ASFF3,需要将level1调整至和level3尺寸一致,采用的方式是先通过1×1卷积调整到与level3通道数一致,再用插值的方式resize到相同大小;而对于需要downsample的层,比如想得到ASFF1,此时对于level2到level1只需要用一个3×3,stride=2的卷积就可以了,如果是level3到level1则需要在3×3卷积的基础上再加一个stride=2的maxpooling,这样就能调整level3和level1尺寸一致。
对于权重参数α,β和γ,则是通过resize后的level1~level3的特征图经过1×1的卷积得到的。并且参数α,β和γ经过concat之后通过softmax使得他们的范围都在[0,1]内并且和为1:
为什么要ASFF
文章通过梯度和反向传播来解释为什么ASFF会有效。首先以最基本的YOLOv3为例,加入FPN后通过链式法则我们知道在backward的时候梯度是这样计算的:
其中因为不同尺度的层之间的尺度变换无非就是up-sampling或者down-sampling,因此
这一项通常为固定值,为了简化表达式我们可以设置为1,
,则上面的式子变成了:
进一步的,
这一项相当于对输出特征的activation操作,导数也将为固定值,同理
,我们可以将他们的值简化为1,则表达式进一步简化成了:
假设level1(i,j)对应位置feature map上刚好有物体并且为正样本,那其他level上对应(i,j)位置上可能刚好为负样本,这样反传过程中梯度既包含了正样本又包含了负样本,这种不连续性会对梯度结果造成干扰,并且降低训练的效率。而通过ASFF的方式,反传的梯度表达式就变成了:
我们可以通过权重参数来控制,比如刚才那种情况,另α2和α3=0,则负样本的梯度不会结果造成干扰。另外这也解释了为什么特征融合的权重参数来源于输出特征+卷积,因为融合的权重参数和特征是息息相关的。
结果分析
实验证明,asff比concat和sum的方式更有效,在baseline的基础上提升了map2个点之多。
并且作者对asff做了可视化分析:
可视化结果进一步解释了ASFF的有效性,比如对于第一个斑马的图,可以看到其实最终斑马是在level1这个feature上被检测到的(明显标红),并且观察level1这一层的α,β和γ权重可以发现,对于图中斑马这种大物体,更容易被高层的特征捕捉到,因为对于大物体我们往往更需要语义特征。
而对于第二个羊群图来说,可以看到羊更多的是被level2和level3检测到,这也说明了对于小物体,我们更需要底层特征中的细粒度特征来辨别。