Dynamic Head: Unifying Object Detection Heads with Attentions
Dynamic Head CVPR 2021
论文链接: https://arxiv.org/abs/2106.08322
一、 Problem Statement
设计一个好的目标检测头应该有三个准则:
- scale-aware
- spatial-aware
- task-aware
目前的检测头都只关注其中一个,因此需要解决把三个统一结合起来。
二、 Direction
设计一个结合了scale-awareness, spatial-awareness和task-awareness的检测头。如果考虑backbone的输入维度为3维度的Tensor: l e v e l × s p a c e × c h a n n e l level \times space \times channel level×space×channel,那么统一的检测头可以被认为是一个注意力机制的问题。因此,对不同层级融合的特征图的每个维度提出了level-wise,spatial-wise和channel-wise attention module。
- Scale-aware attention
这个模块用在维度level上,可以学习相对重要的多种语义信息,来增强特征学习。 - Spatial-aware attention
这个模块用在维度space(heigh × \times × width)上,可以学习空间位置中的有判别性的表征。 - task-aware attention
这个模块用在维度channel上,它根据对象的不同卷积核响应,指示不同的特征通道分别支持不同的任务(例如,分类、盒回归和中心/关键点学习)。
三、 Method
先来看一下整体的网络框架:
可以看出来,经过Backbone网络之后,每层特征图输入到含有三个attention模块的detection head之中。因此下面分别讲一下这三个模块。
首先,从Backbone输出不同层级的特征图进行融合,形成 F i n = { F i } i = 1 L F_{in} = \{F_i\}_{i=1}^L Fin={Fi}i=1L,维度为 F ∈ R L × H × W × C F \in \R^{L \times H \times W \times C} F∈RL×H×W×C, L L L代表层级的个数, H , W , C H, W, C H,W,C分别代表宽度,高度和通道数。然后定义 S = H × W S=H\times W S=H×W,使得 F ∈ R L × S × C F \in \R^{L \times S \times C} F∈RL×S×C
- 物体尺度的差异与不同层次的特征有关。提升不同 F F F层级的表征学习能力可以提高目标检测的尺度感知能力。
- 不同物体形状的各种几何变换与不同空间位置的特征相关。提升 F F F在不同空间位置的表征学习有利于目标检测的空间感知。
- 不同的对象表示和任务可能与不同通道的特征相关。提升 F F F的不同通道的表征学习可以提高目标检测的任务意识。
给定一个特征
F
∈
R
L
×
S
×
C
F \in \R^{L \times S \times C}
F∈RL×S×C,self-attention通常可以表示为:
W
(
F
)
=
π
(
F
)
⋅
F
W(F) = \pi(F) \cdot F
W(F)=π(F)⋅F
其中, π ( ⋅ ) \pi(\cdot) π(⋅)是self-attention function。通过直接诶学习所有维度是计算消耗很大的,而且实际上对于维度高的tensor是很难实现的。因此,作者就將其分为三个attention模块,依次连接,而且每一个模块只关注一个维度,具体如下:
W ( F ) = π C ( π S ( π L ( F ) ⋅ F ) ⋅ F ) ⋅ F W(F)= \pi_C(\pi_S(\pi_L(F)\cdot F)\cdot F)\cdot F W(F)=πC(πS(πL(F)⋅F)⋅F)⋅F
其中, π C , π S , π L \pi_{C}, \pi_{S} , \pi_L πC,πS,πL分别对应三个attention functions,分别作用于维度 L , S , C L, S, C L,S,C
1. Scale-aware Attention
首先引入的是scale-aware attention模块,融合不同尺度的特征:
π
L
(
F
)
⋅
F
=
σ
(
f
(
1
S
C
∑
S
,
C
F
)
)
⋅
F
\pi_L(F) \cdot F = \sigma(f(\frac{1}{SC} \sum_{S,C} F)) \cdot F
πL(F)⋅F=σ(f(SC1S,C∑F))⋅F
其中, f ( ⋅ ) f(\cdot) f(⋅)是1x1卷积层, σ ( x ) = m a x ( 0 , m i n ( 1 , x + 1 2 ) ) \sigma(x)=max(0, min(1, \frac{x+1}{2})) σ(x)=max(0,min(1,2x+1))是hard-sigmoid函数。
2. Spatial-aware Attention
spatial-aware模块关注于spatial locations和feature levels之间一致存在的明显区分区域。这个
模块分为两个步骤:
- 使用deformable convolution,使得attention学习稀疏性能。
- 在同一个空间位置融合不同层级的特征。
π S ( F ) ⋅ F = 1 L ∑ l = 1 L ∑ k = 1 K w l , k ⋅ F ( l ; p k + Δ p k ; c ) ⋅ Δ m k \pi_S(F) \cdot F = \frac{1}{L} \sum_{l=1}^L \sum_{k=1}^K w_{l,k} \cdot F(l;p_k+\Delta p_k; c) \cdot \Delta m_k πS(F)⋅F=L1l=1∑Lk=1∑Kwl,k⋅F(l;pk+Δpk;c)⋅Δmk
其中 K K K是稀疏采样位置的个数, p k + Δ p k p_k + \Delta p_k pk+Δpk是加了offset后的位置,关注于明显区分的区域。 Δ m k \Delta m_k Δmk是位置 p k p_k pk的scalar。
3. Task-aware Attention
为了共同学习表征,在最后部署了task-aware attention。它动态地打开和关闭功能通道,以支持不同的任务:
π
C
(
F
)
⋅
F
=
m
a
x
(
α
1
(
F
)
⋅
F
c
+
β
1
(
F
)
,
α
2
(
F
)
⋅
F
c
+
β
2
(
F
)
)
\pi_C(F) \cdot F = max(\alpha^1(F) \cdot F_c + \beta^1(F), \alpha^2(F)\cdot F_c + \beta^2(F))
πC(F)⋅F=max(α1(F)⋅Fc+β1(F),α2(F)⋅Fc+β2(F))
其中
F
c
F_c
Fc表示在
c
t
h
c_{th}
cth通道上的特征切片。
[
α
1
,
α
2
,
β
1
,
β
2
]
T
=
θ
(
⋅
)
[\alpha^1, \alpha^2, \beta^1, \beta^2]^T = \theta(\cdot)
[α1,α2,β1,β2]T=θ(⋅) 是hyper function,学习控制激活函数的阈值。
θ
(
⋅
)
\theta(\cdot)
θ(⋅)类似于dynamic ReLU,首先对
L
×
S
L \times S
L×S维度使用global average pooling,然后使用两个FCL和BN层,最后使用shifted sigmoid function来标准化输出到
[
−
1
,
1
]
[-1, 1]
[−1,1]。
看一下这三个attention module性能的表现:
4. 使用方法
对于One-stage检测器来说,直接在头部进行串联多个dynamic head。而对于Two-stage检测器来说,需要在RoI Pooling前添加。
经过实验,串联6个是能得到比较好的trade-off。
5. 性能表现
四、 Conclusion
表现比Deformable DETR和RepPoints等性能要好。但是感觉,参数量会很大。 作者也留了future work,如何使全注意力模型易于学习和高效地计算,以及如何系统地考虑更多的注意方式进入头部设计以获得更好的性能?