Coordinate Attention 论文阅读
背景:研究表明通道注意力可以显著提升了模型性能,但是在以往的工作中通常忽略了位置信息,而位置信息对于生成空间注意力非常重要。为了利用位置信息,Coordinate Attention 将位置信息嵌入到了通道注意力中。不同于通过二维全局池化将特征张量转换为单个特征向量的通道注意力 (SENet),Coordinate Attention 的做法是将通道注意力分解为两个一维的特征编码过程,沿水平和垂直方向聚合特征,从而可以沿着一个方向捕获长程依赖,再通过另一个方向保留精确的位置信息。这样特征图就被编码为一对有方向且有位置信息的特征图,它们可以补充作用于输入特征图来增强感兴趣目标的表示。
Coordinate Attention Blocks
Coordinate Attention 用位置信息同时编码了通道间的关系和长程依赖,过程分为坐标信息嵌入和坐标注意力生成两个阶段。
![CABlock](https://img-blog.csdnimg.cn/5100218d538e41bf9c353017891e7072.png#pic_center)
由于全局池化难以保留空间信息,所以作者将全局池化分解成一对编码一维特征的操作,从而激励注意力块利用位置信息捕获远距离的空间交互。具体的做法是对每个通道在空间上沿垂直和水平方向用两个大小分别为
(
H
,
1
)
(H, 1)
(H,1) 和
(
1
,
W
)
(1, W)
(1,W) 池化核。因此,在通道
c
c
c,垂直坐标
h
h
h 处和水平坐标
w
w
w 处的输出分别可以公式化描述为
z
c
h
(
h
)
=
1
W
∑
0
≤
i
<
W
x
c
(
h
,
i
)
.
z_{c}^{h} (h) = \frac{1}{W} \sum_{0\le i<W }^{} x_{c} (h, i).
zch(h)=W10≤i<W∑xc(h,i).
z
c
w
(
w
)
=
1
H
∑
0
≤
i
<
H
x
c
(
w
,
j
)
.
z_{c}^{w} (w) = \frac{1}{H} \sum_{0\le i<H }^{} x_{c} (w, j).
zcw(w)=H10≤i<H∑xc(w,j).
上面两种变换分别沿着两个空间方向聚合特征,得到了一对方向上的特征图。这使得 Coordinate Attention Blocks 可以沿着一个方向捕获长程依赖,再通过另一个方向保留精确的位置信息,有助于网络更加精准定位感兴趣的目标。
这一步是为了利用上一步的得到的全局感受野和位置信息编码。具体的做法是,将上一步得到的聚合特征图拼接起来,送入一个共享的
1
×
1
1 \times 1
1×1 的卷积转换函数
F
1
F_{1}
F1,得到
f
=
δ
(
F
1
(
[
z
h
,
z
w
]
)
)
,
f = \delta (F_1([z^h, z^w])),
f=δ(F1([zh,zw])),
其中,
δ
\delta
δ 为非线性激活函数,
f
∈
R
C
/
r
×
(
H
+
W
)
f\in R^{C/r\times (H+W)}
f∈RC/r×(H+W) 为在水平和垂直方向上进行空间编码的中间特征图,
r
r
r 是用于控制块大小的缩减比例。
然后将
f
f
f 在空间维度上分解为
f
h
∈
R
C
/
r
×
H
f^{h} \in R^{C/r\times H}
fh∈RC/r×H 和
f
w
∈
R
C
/
r
×
W
f^{w} \in R^{C/r\times W}
fw∈RC/r×W 两个独立的张量。再用另外两个
1
×
1
1 \times 1
1×1 卷积转换函数
F
h
F_h
Fh 和
F
w
F_w
Fw 分别对
f
h
f^h
fh 和
f
w
f^w
fw 进行转换,得到
g
h
=
σ
(
F
h
(
f
h
)
)
g^h = \sigma (F_h(f^h))
gh=σ(Fh(fh))
g
w
=
σ
(
F
w
(
f
w
)
)
g^w = \sigma (F_w(f^w))
gw=σ(Fw(fw))
其中,
σ
\sigma
σ为
s
i
g
m
o
i
d
sigmoid
sigmoid 激活函数。
最终,Coordinate Attention Blocks 的输出
Y
Y
Y 可以写为
y
c
(
i
,
j
)
=
x
c
(
i
,
j
)
×
g
c
h
(
i
)
×
g
c
w
(
j
)
.
y_c(i, j) = x_c(i, j) \times g_c^h(i) \times g_c^w(j).
yc(i,j)=xc(i,j)×gch(i)×gcw(j).
代码
class CA_Block(nn.Module):
def __init__(self, in_channel, reduction=32):
super(CA_Block, self).__init__()
self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
self.pool_w = nn.AdaptiveAvgPool2d((1, None))
mip = max(8, in_channel // reduction)
self.conv1 = nn.Conv2d(in_channel, mip, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(mip)
self.act = nn.Hardswish()
self.conv_h = nn.Conv2d(mip, in_channel, kernel_size=1, stride=1, padding=0)
self.conv_w = nn.Conv2d(mip, in_channel, kernel_size=1, stride=1, padding=0)
def forward(self, x):
identity = x
n, c, h, w = x.shape
x_h = self.pool_h(x)
x_w = self.pool_w(x).permute(0, 1, 3, 2)
y = torch.concat([x_h, x_w], axis=2)
y = self.conv1(y)
y = self.bn1(y)
y = self.act(y)
x_h, x_w = torch.split(y, [h, w], dim=2)
x_w = x_w.permute(0, 1, 3, 2)
a_h = self.conv_h(x_h).sigmoid()
a_w = self.conv_w(x_w).sigmoid()
out = identity * a_w * a_h
return out
参考文献
Hou Q, Zhou D, Feng J. Coordinate attention for efficient mobile network design[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 13713-13722.