目标检测中因为定位和分类分支合并的复杂性而产生了许多算法,这些方法从不同角度出发提升了算法性能,但难以进行统一度量。论文采用多个注意力机制将不同的目标检测头进行统一,主要有特征层次的注意力、空间位置的注意力、通道间的注意力,分别对应于尺度感知、空间感知和任务感知。该方法可以在不增加计算量的情况下明显地提升模型性能。
给定一个从特征金字塔(即backbone)中\(L\)个不同层抽取的特征图组成的集合\(F_{in} = \lbrace F_i\rbrace^L_{i=1}\),将集合中的特征图通过上采样或下采样到中间大小,得到一个特征张量\(F\in R^{L\times H\times W\times C}\),其中\(L\)表示抽取的层数,\(H\)、\(W\)、\(C\)表示高、宽、和通道数。令\(S=H\times W\),将特征转为\(F\in R^{L\times S\times C}\)。这三个维度分别对应了三种作用:
- 目标尺度的差异对应了不同尺度的特征;
- 不同目标形状的不同集合变换对应了特征的不同空间位置;
- 目标表达与任务的多样性对应了不同的通道特征
直接在所有维度上学习注意力函数会产生大量的计算,所以论文将注意力函数转换为对应3个维度的序列注意力,每个注意力只关注它当前的维度:
\[ W(F) = \pi_C(\pi_S(\pi_L(F)\cdot F)\cdot F)\cdot F \]
尺度感知注意力(Scale-aware Attention)
首先引入尺度上的注意力基于语义重要性来动态融合来自不同尺度的特征:
\[ \pi_L(F)\cdot F = \sigma\left(f\left(\frac{1}{SC}\sum_{S,C}F\right)\right)\cdot F \]
\(f(\cdot)\)是线性函数,这里用\(1\times 1\)卷积层来近似。\(\sigma(\cdot)\)是hard-sigmoid函数,如下:
\[ \sigma(x) = \max (0,\min (1,\frac{x+1}{2})) \]
空间感知注意力(Spatial-aware Attention)
接下来使用空间感知注意力来提升模型不同空间位置的判别能力。由于\(S\)维度较大,论文对其进行解藕:首先采用形变卷积对注意力学习稀疏化,然后进行特征跨尺度集成:
\[ \pi_S(F)\cdot F = \frac{1}{L}\sum^L_{l=1}\sum^K_{k=1}w_{l,k}\cdot F(l;p_k+\Delta p_k;c)\cdot \Delta m_k \]
其中\(K\)为稀疏采样位置数,其余参数与形变卷积中的参数类似。
任务感知注意力(Task-aware Attention)
为促进联合学习与目标表达能力的泛化性,论文还设计了一种任务感知注意力。它可以动态开关特征通道以辅助不同任务:
\[ \pi_C(F)\cdot F = \max(\alpha^1(F)\cdot F_c+\beta^1(F),\alpha^2(F)\cdot F_c+\beta^2(F)) \]
其中\([\alpha^1,\alpha^2,\beta^1,\beta^2]^T = \theta(\cdot)\)是超参数,用于控制激活阈值,而\(\theta(\cdot)\)的实现与动态ReLU类似。
结构
将上述的注意力机制按序列使用,同时还可以进行多次堆叠,DynamicHead结构图大致如下:
任意类型的backbone均可用于提取特征金字塔并进一步缩放到统一尺度构建特征张量,然后将其作为DynamicHead的输入,再经过多个包含尺度感知、空间感知以及任务感知的DyHead模块串行堆叠运算。DyHead的输出可以用于不同的任务,比如分类、中心/方框回归等等。
one stage:单阶段检测器通过在特征图上密集采样来获取目标位置,简化了目标检测器的设计。DynamicHead与单阶段检测器的集成如下所示:
two stage:两阶段检测器通过RPN层和ROI池化层从特征金字塔中提取中间表达。为了耦合这种特性,论文在ROI池化前使用尺度感知和空间感知,用任务感知替换原始的全连接层,具体如下:
致谢
Dynamic Head: Unifying Object Detection Heads with Attentions