了解了SE和CBAM之后,Coordinate Attention(坐标注意)指出了前两者的一些缺点,并做出了一些改进,该篇论文发表于2021年CVPR
最近关于mobile network设计的研究已经证明了通道注意(例如the Squeeze-and-Excitation attention)对于提升模型性能的显著有效性,但是它们通常忽略了位置信息,这对于生成空间选择性注意映射很重要。在本文中,我们提出了一种新的mobile network注意机制,将位置信息嵌入到通道注意中,我们称之为“坐标注意”。与通过2D global pooling将特征张量转换为单个特征向量的通道注意不同,坐标注意将通道注意分解为两个一维特征encoding过程,分别沿两个空间方向聚合特征。然后,将得到的特征图分别编码为一对方向感知和位置敏感的注意映射,这些注意映射可以互补地应用于输入特征映射,以增强感兴趣对象的表示。我们的坐标注意力很简单,可以灵活地插入经典mobile network,如MobileNetV2、MobileNeXt和EfficientNet,几乎不需要计算开销。大量实验表明,我们的坐标注意不仅有利于ImageNet分类,而且更有趣的是,它在下游任务中表现得更好,如目标检测和语义分割。代码可在https://github.com/Andrew-Qibin/CoordAttention.
注意力机制,用于告诉模型“什么”和“在哪里”参加,已被广泛研究[47,29],并被广泛应用于提高现代深层神经网络的性能[18,44,3,25,10,14]。然而,它们在mobile network(模型尺寸有限)上的应用明显落后于大型网络[36,13,46]。这主要是因为大多数注意力机制带来的计算开销对于mobile network来说是无法承受的。
[29] V olodymyr Mnih, Nicolas Heess, Alex Graves, et al. Recurrent models of visual attention. InAdvances in neural information processing systems, pages 2204–2212, 2014.
[47] Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron Courville, Ruslan Salakhudinov, Rich Zemel, and Yoshua Bengio. Show, attend and tell: Neural image caption generation with visual attention. InICML, pages 2048–2057,2015.
图1:三种经典视觉任务中不同注意方法的表现。从左到右的y轴标签分别为top-1精度、mean IoU和AP。显然,我们的方法不仅在针对SE-block[18]和CBAM[44]的ImageNet分类[33]中取得了最好的结果,而且在下游任务中表现得更好,如语义分割[9]和COCO对象检测[21]。结果基于MobileNetV2[34]。
考虑到mobile network的计算能力有限,迄今为止,mobile network最流行的注意力机制仍然是Squeeze-and-Excitation (SE)注意[18]。它借助2D global pooling计算通道注意,并以相当低的计算成本提供显著的性能提升。然而,SE注意只考虑encoding通道间信息,而忽略了位置信息的重要性,位置信息对于在视觉任务中捕获对象结构至关重要[42]。后来的工作,如BAM[30]和CBAM[44],试图通过减少输入张量的通道维数,然后使用卷积计算空间注意,来利用位置信息,如图2(b)所示。然而,卷积只能捕获局部关系,但无法建模对视觉任务[48,14]至关重要的远距离的依赖关系。
在本文中,除了第一项工作之外,我们还提出了一种新颖有效的注意机制,通过将位置信息嵌入到信道注意中,使mobile network能够在大范围内参与,同时避免产生显著的计算开销。为了缓解2D global pooling造成的位置信息丢失,我们将通道注意分解为两个并行的一维特征encoding过程,以有效地将空间坐标信息集成到生成的注意映射中。
具体来说,我们的方法利用两个1D global pooling操作,分别沿垂直和水平方向将输入特征聚合为两个单独的方向感知特征映射。这两个具有嵌入方向特定信息的特征映射随后分别encoding为两个注意映射,每个注意映射捕获输入特征图沿一个空间方向的远距离依赖关系。因此,位置信息可以保存在生成的注意映射中。然后,通过乘法将两个注意力映射应用于输入特征映射,以强调兴趣的表示。我们将提出的注意方法命名为coordinate attention,因为其操作区分空间方向(即coordinate)并生成坐标感知的注意映射。
我们的坐标注意提供了以下优势。
为了证明所提出的方法相对于以前mobile network的注意方法的优势,我们在ImageNet分类[33]和流行的下游任务(包括目标检测和语义分割)中进行了广泛的实验。通过相当数量的可学习参数和计算,我们的网络在ImageNet上实现了0.8%的性能增益,分类精度位居前1。在目标检测和语义分割方面,我们还观察到,与具有其他注意机制的模型相比,有显著的改进,如图1所示。我们希望我们简单高效的设计能够促进未来mobile network注意力机制的发展。
在本节中,我们简要回顾了本文的相关文献,包括关于高效网络体系结构设计和注意或非本地模型的前期工作。
最近最先进的mobile network大多基于深度可分离卷积[16]和inverted residual block[34]。
[16] Andrew G Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, and Hartwig Adam. Mobilenets: Efficient convolutional neural networks for mobile vision applications.arXiv preprint arXiv:1704.04861, 2017.
[34] Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. Mobilenetv2: Inverted residuals and linear bottlenecks. InCVPR, pages 4510–4520,2018.
HBONet[20]在每个inverted residual block内引入下采样操作,以建模代表性空间信息。ShuffleNet V2[27]在inverted residual block块前后使用 channel split module和channel shuffle module。后来,MobileNetV3[15]结合神经架构搜索算法[50],搜索最佳激活函数和不同深度inverted residual block的expansion ratio。此外,MixNet[39]、EfficientNet[38]和ProxylessNAS[2]也采用不同的搜索策略来搜索深度可分离卷积的最佳卷积核大小或控制网络在expansion ratio、输入分辨率、网络深度和宽度方面的权重标量。最近,Zhou等人[49]重新思考了利用深度可分离卷积的方法,并提出了MobileNeXt,它采用了移动网络的经典bottleneck结构。
注意力机制[41,40]已被证明在各种计算机视觉任务中有用,如图像分类[18,17,44,1]和图像分割[14,19,10]。其中一个成功的例子是SENet[18],它简单地压缩每个2D特征图,以有效地建立通道之间的相互依赖关系。CBAM[44]通过引入大尺寸核卷积的空间信息编码,进一步推进了这一想法。后来的工作,如GENet[17]、GALA[22]、AA[1]和TA[28],通过采用不同的空间注意机制或设计高级注意块来扩展这一思想。
Non-local/self-attention网络最近非常流行,因为它们能够建立空间或逐通道注意。典型的例子包括NLNet[43]、GCNet[3]、A2Net[7]、SCNet[25]、GSoP Net[11]或CCNet[19],所有这些都利用非局部机制来捕获不同类型的空间信息。然而,由于自关注模块内部的计算量很大,它们通常被用于大型模型[13,46](Resnet和ResNeXt),但不适用于mobile networks。
与这些利用昂贵且沉重的non-local or self-attention blocks的方法不同,我们的方法考虑了一种更有效的捕获位置信息和通道关系的方法,以增强mobile networks的特征表示。通过将2D global pooling操作分解为两个一维encoding过程,我们的方法比其他具有轻量级属性的注意方法(例如,SENet[18]、CBAM[44]和TA[28])表现得更好。
坐标注意块可以看作是一个计算单元,旨在增强mobile networks学习功能的表达能力。它可以采用任何中间特征张量 X = [ x 1 , x 2 , . . . , x C ] ∈ R C × H × W \bf X=[x_1,x_2,...,x_C]\in\mathbb R^{C\times H\times W} X=[x1,x2,...,xC]∈RC×H×W作为输入并将具有相同size的增广表示的变换张量 Y = [ y 1 , y 2 , . . . , y C ] \bf Y=[y_1,y_2,...,y_C] Y=[y1,y2,...,yC]输出到 X {\bf X} X。为了清晰地描述所提出的坐标注意,我们首先回顾在mobile network中广泛使用的SE注意。
如[18]所示,标准卷积本身难以对通道关系建模。显式地构建通道相互依赖关系可以提高模型对信息通道的敏感性,这些信息通道对最终分类决策的贡献更大。
[18] Jie Hu, Li Shen, and Gang Sun. Squeeze-and-excitation networks. InCVPR, pages 7132–7141, 2018.
此外,使用global average pooling还可以帮助模型捕获全局信息,这是一个卷积的缺陷。
在结构上,SE block可以分解为两个步骤:squeeze和excitation,分别用于全局信息嵌入和通道关系的自适应重新校准。给定输入 X X X,第 c c c个通道的squeeze步骤可公式化如下: z c = 1 H × W ∑ i = 1 H ∑ j = 1 W x c ( i , j ) , − − − ( 1 ) z_c=\frac{1}{H\times W}\sum^H_{i=1}\sum^W_{j=1}x_c(i,j),---(1) zc=H×W1i=1∑Hj=1∑Wxc(i,j),−−−(1)
其中 z c z_c zc是与第 c c c个通道相关联的输出。输入 X X X直接来自具有固定卷积核大小的卷积层,因此可以视为局部描述符的集合。squeeze操作使收集全局信息成为可能。
第二步,excitation,,旨在完全捕获通道依赖性,其可表述为: X ^ = X ⋅ σ ( z ^ ) , − − − ( 2 ) {\bf\hat X}={\bf X}\cdot\sigma({\bf\hat z}),---(2) X^=X⋅σ(z^),−−−(2)
式中 ⋅ \cdot ⋅表示通道乘法, σ \sigma σ表示sigmoid函数, z ^ \hat z z^表示由变换函数生成的结果,公式如下: z ^ = T 2 ( R e L U ( T 1 ( z ) ) ) . − − − ( 3 ) {\bf\hat z}=T_2(ReLU(T_1({\bf z}))).---(3) z^=T2(ReLU(T1(z))).−−−(3)
这里, T 1 T_1 T1和 T 2 T_2 T2是两个线性变换(全连接层),可以学习它们来捕获每个通道的重要性。
SE块已在最近的mobile network中广泛使用[18,4,38],并被证明是实现最先进性能的关键组件。然而,它只考虑通过建模通道关系来重新评估每个通道的重要性,而忽略了位置信息,正如我们将在第4节中通过实验证明的那样,位置信息对于生成空间选择性注意映射非常重要。接下来,我们将介绍一种新的注意块,它同时考虑了通道间关系和位置信息。
我们的坐标注意encodes通道关系和有精确位置信息的远程依赖,远程依赖分为两步:坐标信息嵌入和坐标注意生成。建议的坐标注意块的示意图可以在图2的右侧找到。在下面,我们将详细描述它。
在通道注意中,通常使用global pooling对空间信息进行全局编码,但它将全局空间信息压缩到通道描述符中,因此很难保留位置信息,这对于在视觉任务中捕获空间结构至关重要。为了鼓励注意块通过精确的位置信息在空间上捕捉远程交互,我们将global pooling分解为等式中的公式(1)变成一对1D 特征encoding 操作。具体来说,给定输入 X X X,我们使用两个空间范围的pooling核 ( H , 1 ) (H,1) (H,1)或 ( 1 , W ) (1,W) (1,W)分别沿水平坐标和垂直坐标对每个通道进行编码。因此,第 c c c通道在高度 h h h的输出可以公式化为: z c h ( h ) = 1 W ∑ 0 ≤ i < W x c ( h , i ) . − − − ( 4 ) z_c^h(h)=\frac{1}{W}\sum_{0\leq i
类似地,宽度为 w w w的第 c c c个通道的输出可以写为: z c w ( w ) = 1 H ∑ 0 ≤ j < H x c ( j , w ) . − − − ( 5 ) z_c^w(w)=\frac{1}{H}\sum_{0\leq j
上述两种变换分别沿两个空间方向聚合特征,生成一对方向感知特征映射。这与产生单一特征向量的通道注意方法中的squeeze操作(公式(1))大不相同。这两种变换还允许我们的注意块沿着一个空间方向捕获长距离依赖关系,并沿另一个空间方向保留精确的位置信息,这有助于网络更准确地定位感兴趣的对象。
读到上述黑体段,疑惑不解,这两种变换如何允许捕获long-range和location信息了
如上所述,公式(4) 和公式(5) 启用全局感受野并encode精确的位置信息。为了利用产生的表达表征,我们提出了第二种变换,称为坐标注意生成。我们的设计参考了以下三个标准。
具体地说,给定由公式(4)和公式(5)生成的聚合特征映射,我们首先将它们concatenate起来,然后将它们传到共享的1×1卷积变换函数 F 1 F_1 F1,得到 f = δ ( F 1 ( [ z h , z w ] ) ) , − − − ( 6 ) {\bf f}=\delta(F_1([{\bf z}^h,{\bf z}^w])),---(6) f=δ(F1([zh,zw])),−−−(6)
其中, [ ⋅ , ⋅ ] [\cdot,\cdot] [⋅,⋅]表示沿空间维度的concatenation操作, δ \delta δ是一个非线性激活函数, f ∈ R C / r × ( H + W ) {\bf f}\in\mathbb R^{C/r\times (H+W)} f∈RC/r×(H+W)是在水平方向和垂直方向对空间信息进行编码的中间特征映射。这里, r r r是控制block大小的缩减率,如SE-block中所示。然后我们将 f f f沿空间维度拆分为两个独立的张量 f h ∈ R C / r × H {\bf f}^h\in\mathbb R^{C/r\times H} fh∈RC/r×H和 f w ∈ R C / r × W {\bf f}^w\in\mathbb R^{C/r\times W} fw∈RC/r×W。另外两个 1 × 1 1\times1 1×1卷积变换 F h F_h Fh和 F w F_w Fw被分别用于转换 f h {\bf f}^h fh和 f w {\bf f}^w fw为与输入 X \bf X X具有一样通道数的张量,得到: g h = σ ( F h ( f h ) ) , − − − ( 7 ) g w = σ ( F w ( f w ) ) . − − − ( 8 ) {\bf g}^h=\sigma(F_h({\bf f}^h)),---(7)\\{\bf g}^w=\sigma(F_w({\bf f}^w)).---(8) gh=σ(Fh(fh)),−−−(7)gw=σ(Fw(fw)).−−−(8)
其中, σ \sigma σ是sigmoid函数。为了降低模型开销的复杂性,我们通常使用适当的缩减率 r r r(例如,32)来减少通道数。我们将在实验部分讨论不同缩减率 r r r对性能的影响。输出 g h {\bf g}^h gh和 g w {\bf g}^w gw分别展开并用作注意权重。最后,坐标注意块 Y \bf Y Y的输出可以写成: y c ( i , j ) = x c ( i , j ) × g c h ( i ) × g c w ( j ) . − − − ( 9 ) y_c(i,j)=x_c(i,j)\times g_c^h(i)\times g^w_c(j).---(9) yc(i,j)=xc(i,j)×gch(i)×gcw(j).−−−(9)
Discussion: 与只关注不同通道重要性的通道注意(SE)不同,我们的坐标注意块还考虑编码空间信息。如上所述,沿水平和垂直方向的注意力同时应用于输入张量。两个注意力映射中的每个元素都反映了相应行和列中是否存在感兴趣的对象。这种编码过程允许我们的坐标注意力更准确地定位感兴趣对象的确切位置,从而帮助整个模型更好地识别。我们将在实验部分详细演示这一点。
由于本文的目标是研究一种更好的方法来增强mobile network的卷积特性,因此我们采用了两种具有不同类型Residual block的经典轻型体系结构(即MobileNet v2[34]和MobileNeXt[49])作为示例,演示了所提出的坐标注意块相对于其他著名的轻型注意块的优势。图3显示了我们如何将注意力块插入MobileNetV2中的反向Residual block和MobileNeXt中的 sandglass block。
表1:结果比较了不同实验设置下所提出的坐标注意。这里, r r r是缩减率且baseline结果基于MobileNetV2 模型。可以看出,添加水平(X)注意或垂直(Y)注意的模型与添加SE注意的模型具有相同的性能。然而,当同时考虑水平和垂直注意(空间注意)时,我们的方法得到了最好的结果。延迟数据在Google Pixel 4设备上进行测试得出的。
在本节中,我们首先描述我们的实验设置,然后进行一系列消融实验,以证明所提出的坐标注意中的每个组件对性能的贡献。接下来,我们将我们的方法与一些基于注意的方法进行比较。最后,我们报告了该方法与其他基于注意的目标检测和语义分割方法的比较结果。
我们使用PyTorch toolbox[31]来实现我们的所有实验。在训练期间,我们使用衰减和动量为0.9的标准SGD优化器来训练所有模型。权重衰减一直设置为 4 × 1 0 − 5 4\times 10^{-5} 4×10−5。采用初始学习率为0.05的余弦学习schedule。我们使用四个NVIDIA GPU进行培训,批量大小设置为256。在没有额外声明的情况下,我们将MobileNet V2作为baseline,并针对200个epoch对所有模型进行训练。对于数据扩充,我们使用与MobileNet V2相同的方法。我们在分类中报告了ImageNet数据集[33]的结果。
Importance of coordinate attention: 为了证明所提出的坐标注意的性能,我们进行了一系列消融实验,相应的结果都列在表1中。我们从坐标注意中移除水平注意或垂直注意,以了解编码坐标信息的重要性。如表1所示,沿任一方向注意的模型与SE注意的模型具有相当的性能。
然而,当水平注意和垂直注意都结合在一起时,我们得到了最佳结果,如表1所示。实验结果表明,在可学习参数和计算量相当的情况下,坐标信息嵌入更有利于图像分类。
Different weight multipliers: 在这里,我们以两个经典mobile network(包括带 inverted residual blocks的MobileNet v2[34]和带sandglass bottleneck block的MobileNeXt[49])为baseline,对比不同权重乘数下SE attention[18]和CBAM[44]的性能。在本实验中,我们采用了三种典型的权重乘数,包括{1.0,0.75,0.5}。如表2所示,当以MobileNetV2网络为基baseline时,使用CBAM的模型与使用SE注意的模型具有相似的结果。然而,在每种设置下,具有建议的坐标注意的模型都会产生最佳结果。如表3所示,当使用MobileNeXt网络时,也可以观察到类似的现象。这表明,无论考虑哪个sandglass bottleneck block或inverted residual blocks,也无论选择哪个权重乘数,我们的坐标注意都表现最佳,因为同时编码位置和通道间信息的先进方法。
The impact of reduction ratior: 为了研究不同的注意块缩减率 r r r对模型性能的影响,我们尝试减小缩减率 r r r的大小,并观察性能的变化。如表4所示,当我们减少 r r r到original size的一半时(original size=64,一半便是32),模型尺寸会增加,但可以产生更好的性能。这表明,通过降低缩减率 r r r(以 r r r=original size作为降低起点)来添加更多参数对于提高模型性能非常重要。更重要的是,在本实验中,我们的坐标注意仍然比SE注意和CBAM表现得更好,这反映了所提出的坐标注意对缩减率 r r r的鲁棒性。
这里引用SE-block关于reduction ratio的解释:
上表引用自SE-block论文6.4.Analysis and Interpretation
其中original ratio r为64,在SE的意义是指提取通道依赖性的FC层中的线性层和非线性层之间的缩减比。简单理解这个original size就是一个64的数字。
Here original refers to ResNet-50的源头还没搞清楚,翻看了ResNet-50的论文,并没有理解关于这个参数在ResNet-50意义,有明白的朋友可以留言在评论区。
Attention for Mobile Networks: 我们将我们的坐标注意与mobile network的其他轻量级注意方法进行比较,包括表2中广泛采用的SE注意[18]和CBAM[44]。可以看出,添加SE注意已经将分类性能提高了1%以上。对于CBAM,与SE注意相比,图2(b)所示的CBAM空间注意模块在mobile network中似乎没有贡献(表4也有体现)。然而,当考虑到建议的坐标注意时,我们会获得最佳结果。在图4中,我们还可视化了具有不同注意方法的模型生成的特征映射。显然,我们的坐标注意比SE注意和CBAM更有助于定位感兴趣的对象。
我们认为,所提出的位置信息编码方式比CBAM具有双重优势。
Stronger Baseline: 为了进一步证明在更强大的mobile network中,建议的空间注意优于SE注意,我们将EfficientNet-b0[38]作为baseline。EfficientNet基于架构搜索算法。并包含了SE注意。为了研究建议的空间注意在EfficientNet上的性能,我们简单地用建议的空间注意替换SE注意。对于其他设置,我们遵循原始论文。结果如表5所示。与包括SE注意在内的原始EfficientNet-b0以及与EfficientNet-b0具有可比参数和计算的其他方法相比,我们的网络与空间注意实现了最佳结果。这表明所提出的空间注意在功能强大的移mobile network中仍然可以表现良好。
表5:采用强大的EfficientNet-b0[38]为baseline的实验结果。我们还与其他具有可比参数和计算效率的方法进行了比较。
在本小节中,我们对目标检测任务和语义分割任务进行了实验,以探索所提出的空间注意相对于其他注意方法的转移能力。
Implementation Details: 我们的代码基于PyTorch和SSDLite[34,26]。依照[34],我们将SSDLite的第一层和第二层分别连接到输出步长为16和32的最后一个逐点卷积,并将其余SSDLite层添加到最后一个卷积层的顶部。在COCO上进行训练时,我们将batch size设置为256,并使用同步批标准化。使用余弦学习schedule,初始学习率为0.01。我们训练了总共1600000次迭代的模型。在Pascal VOC上进行训练时,batch size设置为24,所有模型都经过240000次迭代的训练。权重衰减设置为0.9。初始学习率为0.001,然后在160000次迭代时除以10,再在200000次迭代时除以10。对于其他设置,读者可参考[34,26]。
Results on COCO: 在本实验中,我们遵循了大多数以前的工作,并分别报告了 A P 、 A P 50 、 A P 75 、 A P S 、 A P M AP、AP_{50}、AP_{75}、AP_S、AP_M AP、AP50、AP75、APS、APM和 A P L AP_L APL方面的结果。在表6中,我们展示了COCO 2017验证集上不同网络设置产生的结果。很明显,在MobileNet V2中添加坐标注意显著提高了检测结果(24.5 v.s.22.3),只需0.5 m的参数开销和几乎相同的计算成本。与其他轻量级注意方法(如SE注意和CBAM)相比,我们版本的SSDLite320在所有指标上都取得了最佳效果,参数和计算量几乎相同。
此外,我们还显示了以前基于SSDLite320的最先进模型产生的结果,如表6所示。请注意,一些方法(如MobileNetV3[15]和MnasNet-A1[37])是基于神经架构搜索方法的,但我们的模型并非如此。显然,与其他参数和计算量相近的方法相比,我们的检测模型在AP方面取得了最好的结果。
Results on Pascal VOC: 在表7中,我们展示了采用不同注意方法时Pascal VOC 2007测试集的检测结果。我们观察到SE注意和CBAM不能改善baseline结果。然而,增加建议的坐标注意可以将平均AP从71.7提高到73.1。在COCO和Pascal VOC数据集上的检测实验均表明,与其他注意方法相比,采用该方法的分类模型具有更好的可转移性。
我们还进行了语义分割实验。继MobileNetV2[34]之后,我们以经典的DeepLabV3[6]为例,将所提出的方法与其他模型进行比较,以证明所提出的空间注意在语义分割中的可转移能力。具体来说,我们丢弃最后一个线性算子,并将ASPP连接到最后一个卷积算子。在ASPP中,我们将标准的3×3卷积算子替换为深度可分离卷积算子,以减少考虑移动应用的模型尺寸。ASPP中每个分支的输出通道设置为256,ASPP中的其他组件保持不变(包括1×1卷积分支和图像级特征编码分支)。我们报告了两个广泛使用的语义分割基准测试的结果,包括Pascal VOC 2012[9]和Cityscapes[8]。对于实验设置,除了设置为4e-5的重量衰减外,我们严格遵循DeeplabV3论文。当输出步幅设置为16时,ASPP中的扩张率为{6,12,18},而当输出步幅设置为8时{12,24,36}。
Results on Pascal VOC 2012: Pascal VOC 2012分割benchmark共有21个类,包括一个背景类。正如原论文所建议的,我们使用1464张图像的分割进行训练,使用1449张图像的分割进行验证。此外,正如在大多数以前的工作[6,5]中所做的那样,我们通过添加[12]中的额外图像来扩充训练集,从而总共生成10582张用于训练的图像。
我们在表8中显示了以不同模型为backbone时的分割结果。我们在两种不同的输出步长下报告结果,即16和8。请注意,此处报告的所有结果并非基于COCO预训练。根据表8,配备了我们的坐标注意的模型比vanilla MobileNetV2和其他注意方法的表现要好得多。
Results on Cityscapes: Cityscapes[8]是最流行的城市街道场景分割数据集之一,共包含19个不同类别。按照官方的建议,我们使用2975张图片进行训练,500张图片进行验证。只有经过精细注释的图像才用于训练。在训练中,我们将原始图像随机裁剪为768×768。在测试过程中,所有图像均保持原始大小(1024×2048)。
在表9中,我们展示了在Cityscapes数据集上使用不同注意方法的模型产生的分割结果。与vanilla MobileNetV2和其他注意方法相比,我们的坐标注意可以在相当数量的可学习参数的情况下大幅度提高分割结果。
Discussion: 我们观察到,与ImageNet分类和对象检测相比,我们的坐标注意在语义分割方面产生了更大的改进。我们认为这是因为我们的坐标注意力能够捕捉到具有精确位置信息的远程依赖关系,这对于具有密集预测的视觉任务(如语义分割)更为有利。
在本文中,我们提出了一种新的mobile network轻量级注意机制,称为坐标注意。我们的坐标注意继承了通道注意方法(例如,the Squeeze-and-Excitation attention)的优点,该方法模拟通道间的关系,同时利用精确的位置信息捕获远程依赖关系。在ImageNet分类、目标检测和语义分割方面的实验证明了我们坐标注意的有效性。
Acknowledgement: 本研究部分得到了AISG-100E-2019-035、MOE2017-T2-2-151、NUSECRAFY17P08和CRP20-2017-0006的支持。
关于论文中对远程依赖的提取原理,本人还待总结,推荐一篇发表于2020年IEEE刊的论文:ORDNet_Capturing_Omni-Range_Dependencies_for_Scene_Parsing
该论文讲述了远程依赖,短程依赖,中程依赖的原理,并设计了一个注意力机制捕获这三种依赖,实现捕获良好的多尺度特征。本人还未读过上述论文,只是有大概了解,待读完之后总结该CA的一些原理。
个人将Coordinate Attention翻译成“坐标注意力”,也有翻译成“协同注意力”。
import torch
import torch.nn as nn
import math
import torch.nn.functional as F
class h_sigmoid(nn.Module):
def __init__(self, inplace=True):
super(h_sigmoid, self).__init__()
self.relu = nn.ReLU6(inplace=inplace)
def forward(self, x):
return self.relu(x + 3) / 6
class h_swish(nn.Module):
def __init__(self, inplace=True):
super(h_swish, self).__init__()
self.sigmoid = h_sigmoid(inplace=inplace)
def forward(self, x):
return x * self.sigmoid(x)
class CoordAtt(nn.Module):
def __init__(self, inp, oup, reduction=32):
super(CoordAtt, self).__init__()
self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
self.pool_w = nn.AdaptiveAvgPool2d((1, None))
mip = max(8, inp // reduction)
self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(mip)
self.act = h_swish()
self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
def forward(self, x):
identity = x
n,c,h,w = x.size()
x_h = self.pool_h(x)
x_w = self.pool_w(x).permute(0, 1, 3, 2)
y = torch.cat([x_h, x_w], dim=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