将位置信息嵌入通道注意力!NUS提出新机制,显著提升卷积特征表达|CVPR2021
共 5918字,需浏览 12分钟
·
2021-03-05 22:04
![](https://filescdn.proginn.com/c4ee676e70ce7278e2b230646dcb3d7b/f2da64a7a5a5fb0149c91be5a54b6344.webp)
极市导读
通道注意力机制对于提升模型性能极为有效,但是忽略了位置信息,这对于生成空间选择注意力图非常重要,本文将位置信息嵌入到通道注意力中,针对如何有效提升移动网络的卷积特征表达能力提出了一种的新型的注意力机制。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
![](https://filescdn.proginn.com/34b9489fce1b6a3c3bd8604ff75fbe5c/ccc03adf94951f7eaecd0554b466a719.webp)
paper: https://arxiv.org/abs/2103.02907
code: https://github.com/Andrew-Qibin/CoordAttention(待开源)
本文是新加坡国立大学Qinbin Hou&Jiashi Feng等人在注意力机制方面的一次探索,针对如何有效提升移动网络的卷积特征表达能力,以及通道注意力(如SE)机制能够有效建模通道间相关性但忽视了位置信息的问题,提出了一种的新颖的注意力机制:Coordinate Attention。
Coordinate Attention通过水平与垂直方向注意力图捕获特征的远程依赖关系,而且水平与垂直注意力还可以有效保持精确的位置信息。所提注意力集中的精确位置信息无论对于分类,还是检测与分割而言都是一种非常重要的性能,因而所提注意力机制在图像分类、目标检测以及语义分割方面均取得了显著的性能提升,尤其需要注意的是,所提注意力尤其适合于语义分割等稠密预测任务。
Abstract
移动网络设计的近期研究表明:通道注意力(如Squeeze-and-Excitation)机制对于提升模型性能极为有效,但是忽略了位置信息,这对于生成空间选择注意力图非常重要。
针对通道注意力机制存在的上述问题,我们提出了一种用于移动网络的新颖注意力机制:它将位置信息嵌入到通道注意力中,我们将其称之为Coordinate Attention
。不同于通道注意力将特征张量通过GAP转换为特征向量,坐标注意力将通道注意力拆分为两个1D特征编码过程,分别沿着两个空间方向集成特征。
通过这种处理,远程相关性可以通过空间方向捕获,于此同时,精确的位置信息可以通过另一个空间方向得以保持。所得到的特征图分辨编码为成对的方向相关注意力图与通道注意力图(两者具有互补性),并用于增强输入特征以增广目标的表达能力。
所提坐标注意力机制极为简单,可以灵活嵌入到现有移动网络(比如MobileNetV2, MobileN2Xt, EfficientNet)中,且几乎不会导致额外的计算负载。
我们通过实验证实:坐标注意力不仅有助于ImageNet分类,在下游任务(比如目标检测、语义分割)上表达更佳。下图给出了所提注意力与SE/CBAM在不同任务上的性能对比。
![](https://filescdn.proginn.com/2a80c7cbe6db9c7b96a3d01560de13d4/3ac9dc5437cd8385d2f9a6c7b5fe87e9.webp)
Method
注意力模块可以视为一种增强移动网络特征表达能力的计算单元。假设它的输入为,输出为增强的特征。为更好的介绍本文所提的坐标注意力,我们先从通道注意力出发进行介绍,然后再介绍坐标注意力。
Revisit SE Attention
正如SE一文所提到的,标准卷积很难对通道相关性进行建模。显式的构建通道之间的相关性可以提升模型对于通道信息的敏感性,进而印象最终的分类决策。更进一步,采用GAP可以辅助模型捕获全局信息,而这是卷积所缺乏的。
从结构上来讲,SE可以分解为两步:Squeeze与Excitation,分别用于全局信息集成与通道相关性的自适应校正。给定输入X,Squeeze可以描述如下:
Excitation旨在捕获通道相关性,可以描述如下:
其中, 表示Sigmoid操作,而则是通过对前述Squeeze结果的变换所得:
其中,表示线性变换,它们有助于捕获每个通道的重要性。
SE注意力机制已被广泛应用于现有移动网络设计(如EfficientNet)中,并作为关键模块取得了SOTA性能。然而SE仅仅考虑通道的重加权而忽视了位置信息,在后面会说明其对于空间选择注意力的重要性。
Coordinate Attention Blocks
针对通道注意力存在的问题,我们提出了坐标注意力:它同时进行通道相关性与远程依赖性建模,类似地,它采用了两步进行精确的位置信息建模:Coordinate Information Embedding(CIE)与Coordinate Attention Generation(CAG)。所设计的坐标注意力图如下图所示。
![](https://filescdn.proginn.com/9277e857d66f9de305570a095ed23c7f/c02fdddf3fda32eec73c8f03cd93d038.webp)
全局池化通常被用在通道注意力中以编码全局空间信息,但它将全局空间信息压缩为一个通道描述子,因而难以保持位置信息(这对于视觉任务中的空间结构捕获尤为重要)。
为促使注意力模块能够以精确的位置信息捕获远程依赖性,我们将全局池化拆分成两个1D特征编码操作。具体来说,给定输入X,我们采用两个池化核的空间扩展对每个通道沿着水平与垂直坐标进行编码,因此输出可以描述如下:
上述两个变换可以沿着两个空间方向集成特征,并生成方向-相关特征图。这两种变换使得所提注意力模块可以更好的捕获远程依赖性,有助于进行更精确的目标定位。
Coordinate Attention Generation
正如前面所介绍的,CIE具有全局感受野,同时编码了精确的位置信息。为充分利用所提表达能力,我们提出了第二个变换,称之为Coordinate Attention Generation
。该设计主要参考了如下三个准则:
新的变换应当尽可能的简单以适配移动端应用; 它可以充分利用所捕获的位置信息,以促进ROI区域更精确定位; 它应当有助于捕获通道相关性(现有研究已证实了通道相关性的重要性)。
具体来说,给定CIE所得特征,我们首先对其进行拼接,然后送入到共享卷积并得到:
表示编码空间信息的中间特征,r表示用于控制SE模块大小的压缩比例参数。然后,我们将沿着空间维度拆分为两个独立张量;然后采用两个额外的卷积对其进行分离为具有与X相同维度的张量:
接下来,我们对输出进行扩展并作为注意力权重,并作用于输入得到该注意力模块的输出Y:
讨论: 不同于通道注意力仅仅聚焦于不同通道的重要性,本文所提坐标注意力模块同时还考虑了空间信息。如前所述,所提注意力同时对输入的水平于垂直相关进行注意力编码,它有助于反应ROI区域目标在两个方向上存在与否。这种特性使得该注意力机制可以进行更精确的目标定位,进而有助于更好的识别决策。
Implementation
由于本文的主要目标在于探索一种更好的方式增强移动网络的卷积特征,在这里我们采用了两种不同类型的残差模块(如MobileNetV2,MobileNeXt)作为样例去说明所提坐标注意力的优势。下图给出了我们如何将坐标注意力嵌入到MobileNetV2中的逆残差模块与MobileNeXt的SandGlass模块中:需要将Attention链接到通道数更多的特征后面。
![](https://filescdn.proginn.com/00fd9467b7d71d1ba41b59218037dabd/1d699094acce1e0910cb2bb3d06624e7.webp)
Experiments
在实验方面,我们先基于ImageNet分类对所提注意力模块进行了系统性的分析,并与其他注意力进行了对比;最后我们将其与其他注意力模型在目标检测、语义分割任务上进行了对比。
实验配置
我们基于Pytorch框架进行所有实验,SGD(lr=5e-2, momentum=0.9, weight_decay=4e-5),cosine学习率调制机制,4个GPU用于训练,batch=256。如无额外说明,我们均采用MobileNetV2作为基线,所有模型均训练200epoch。在数据增广方面,我们采用与MobileNetV2相同的方法。
Ablation Studies
![](https://filescdn.proginn.com/9e74a3252f506a2677245c693d146e0a/0f18ef8edca00b645721df19b1267280.webp)
Importance of coordinate attention
为说明所提坐标注意力的有效性,我们进行了一系列消融实验,结果见上表。可以看到:(1) 仅仅采用单一方向注意力时,其性能与SE基本相当;(2) 当同时采用两个方向注意力时,模型可以取得最佳结果。
![](https://filescdn.proginn.com/474b40a15afa0f66c1a64f6ff7839108/138139e5956e038d01e7fe5fb8336dd2.webp)
![](https://filescdn.proginn.com/cce372317e44a18031eece89b85910cb/15c6b4b115bc838da1b351624bc3929d.webp)
Different weight multipliers
在这里,我们采用MobileNetV2与MobileNeXt的不同配置进行基线模型,将所提注意力与SE注意力、CBAM进行对比,结果见Table2与Table3。从中可以看到:
当采用MobileNetV2作为基线时,CBAM就具有与SE相似的性能,而所提注意力则可以取得更优的性能(相比SE,CA有提升0.6-0.8%top1精度); 当采用MobileNeXt作为基线时,CA同样取得了比SE更有的性能。这无疑说明:由于坐标注意力可以同时编码位置与通道信息的优势使得其具有更加性能。
![](https://filescdn.proginn.com/9ae8e69bb5d3b3bf55fa6b1f93be8aa9/75ff3032168552dfe7a84f26d9897dd9.webp)
Impact of reduction ratio
我们还探索不同因子r对于性能的影响,结果见上表。可以看到:当r从32降到16时,模型的参数量提升的同时取得了更佳的性能。这说明:通过降低r添加更多参数可以进一步提升模型性能。更重要的是,无论在哪种配置下,所提注意力机制均取得了最佳性能,这无疑反应了所提注意力对于超参r的鲁棒性。
![](https://filescdn.proginn.com/41711eead88ab66a251fbf90fdebae29/358f3e033fe638bcf869aa77a64ae67c.webp)
Stronger Baseline
为进一步说明所提注意力在更强有力移动网络上的优势,我们采用EfficientNet-B0作为基线进行了对比,结果见上表。可以看到:相比SE,所提方法取得了更佳的结果。
Applications
接下来,我们在目标检测与语义分割等下游任务上进行了对比分析。我们先来看一下COCO数据集上的检测性能对比,结果见下表。可以看到:基于MobileNetV2,坐标注意力仅仅需要额外的0.5M参数即可取得2.2(24.5 vs 22.3)的性能提升,且计算量基本相当;相比其他注意力机制,所提方案SSDLite320取得了最佳的结果,且具有几乎相同的参数量和计算量。
![](https://filescdn.proginn.com/3840005dc721c2902f3615ba2177b58f/3d335e9bb9e25167755cdc9212401a34.webp)
此外,我们还基于VOC2007数据进行了对比分析,结果见下表。可以看到:(1) SE与CBAM无法有效提升基线模型的性能;(2) 所提注意力可以将基线模型的性能从71.7提升到73.1。
![](https://filescdn.proginn.com/872038407e525395ac57fac2de3aea0c/333a3e5d6bbeea5d93eb54c2421e7b2e.webp)
最后,我们基于VOC2012与Cityscape数据集在语义分割任务上进行了性能对比。结果见下表Table8与Table9。
![](https://filescdn.proginn.com/9c07e6ae089b46a3b034814926cc553b/3f432d85adc21f86b79ad430f2bddca7.webp)
![](https://filescdn.proginn.com/0c86149817a7302b5b368487f39f6f66/54ab95dcb8d5bde730dabb735cfa29fd.webp)
从Table8与Table9的对比可以看到:通过集成所提注意力模块,基线模型均取得显著的性能提升。于此同时,我们可以看到:相比图像分类与目标检测任务,所提注意力机制在语义分割任务方面取得的性能提升更大。我们认为这是因为:所提坐标注意力有助于通过精确的位置信息捕获远程依赖关,而精确的位置信息对于语义分割等稠密预测非常重要。
参考实验
class CoordAtt(nn.Module):
def __init__(self, channels, reduction=16):
super(CoordAtt, self).__init__()
self.fc1 = nn.Sequential(
nn.Conv2d(channels, channels//reduction, 1),
nn.BatchNorm2d(channels//reduction),
nn.ReLU(inplace=True)
)
self.xfc = nn.Conv2d(channels//reduction, channels, 1)
self.yfc = nn.Conv2d(channels//reduction, channels, 1)
def forward(self, x):
B, _, H, W = x.size()
xap = F.adaptive_avg_pool2d(x, (H, 1))
yap = F.adaptive_avg_pool2d(x, (1, W))
mer = torch.cat([xap.transpose_(2, 3), yap], dim=3)
fc1 = self.fc1(mer)
xat, yat = torch.split(fc1, (H, W), dim=3)
xat = torch.sigmoid(self.xfc(xat))
yat = torch.sigmoid(self.yfc(yat))
out = x * xat * yat
return out
推荐阅读
2020-06-11
![](https://filescdn.proginn.com/cd18a4c44200d5f4e2c638d3b952a9fc/7dfd13867f97f29240ccc3980e1a94f8.webp)
2020-08-30
![](https://filescdn.proginn.com/029f69e71f455dadd4df5c54cd4327b5/c5a76fbf721d69c747339083d0692f1c.webp)
2020-11-24
![](https://filescdn.proginn.com/ac0afb4afb34af7964741126bb2c1687/d8b50f01646bd8ddaeb5d35317c89ce4.webp)
![](https://filescdn.proginn.com/d0e5448cdd72293163042b9bc791754e/76066e68f5cea94886eb8d2491234fe1.webp)
# 极市原创作者激励计划 #
![](https://filescdn.proginn.com/b05be92778a6047f1ada6e3b2483ab80/67854aef051c5a5a8704b62a10df9110.webp)