Coordinate Attention for Efficient Mobile Network Design(CA模块)

Coordinate Attention for Efficient Mobile Network Design

这篇文章提出了一个新的注意力机制,和其他注意力机制不同的是,这篇文章的注意力机制是专门为mobile networks提出的。该注意力机制将位置信息嵌入通道信息,命名为“coordinate attention”,简称CA.
CA将通道注意分解为两个一维特征编码过程,分别沿两个空间方向聚合特征。通过这种方式,可以沿一个空间方向捕获长距离依赖关系,同时可以沿另一个空间方向保留精确的位置信息。
官方代码链接
在这里插入图片描述

1. 介绍

SE通过2D全局池化计算通道注意力,在低计算量的情况下获得不错的表现;BAM、CBAM尝试通过减少输入特征向量的通道维度来获得位置信息。但是卷积只能获得局部的关系,不能获得长距离的依赖关系。
为了计算由2D全局池化引起的位置信息损失,我们将通道注意力机制进行分解为两个平行的1D的特征编码过程,来有效的整合空间坐标信息到生成的注意力maps。
CA的优点:

  1. 可以获得不仅跨通道,而且有方向意识、位置敏感的信息。
  2. 灵活、轻量级、可以轻易插入mobile networks中。
  3. 在mobile networks的down-stream tasks中表现优秀。
    在这里插入图片描述

2. Coordinate Attention

2.1 Revisit Squeeze-and-Excitation Attention

构建通道间依赖关系可以增加模型对信息通道的敏感性,使用全局平均池还可以帮助模型捕获全局信息,这是卷积所缺乏的。
SE可以看成两步,squeeze和expectitation,分别设计用于通道关系的全局信息嵌入和自适应重新校准。

  1. squeeze
    在这里插入图片描述

  2. expectitation
    在这里插入图片描述
    在这里插入图片描述
    但是,SE它始终只考虑通过建模通道关系来重新权衡每个通道的重要性,而忽略了位置信息。

2.2 Coordinate Attention Blocks

我们的坐标注意力机制(CA)通过两个步骤来编码通道关系和长期依赖关系,即坐标信息嵌入和坐标注意力生成

2.2.1 Coordinate Information Embedding

具体来说,给定输入 X,我们使用池化核的两个空间范围(H,1)或(1,W)分别沿水平坐标和垂直坐标对每个通道进行编码。
在这里插入图片描述

以上两种变换分别沿着两个空间方向聚合特征,得到一对方向感知特征图。

2.2.2 Coordinate Attention Generation

具体来说,给定由上述公式4和公式 5生成的聚合特征映射,我们首先将它们concatenate,然后将它们送入共享的1 × 1卷积变换函数F1:
在这里插入图片描述

其中 r为控制块大小的减小比例,比如在SE块中。

然后,我们沿着空间维度将 f 分成两个单独的张量: f h ∈ R C / r × H f_h ∈ R^{C/r}×H fhRC/r×H and f w ∈ R C / r × W f_w ∈ R^{C/r}×W fwRC/r×W.另外两个 1 × 1 卷积变换 F h F_h Fh F w F_w Fw用于将 f h f^h fh f w f^w fw分别转换为具有相同通道数的张量到输入 X:
在这里插入图片描述
然后,输出 g h g^h gh g w g^w gw 被扩展并分别用作注意力权重。最后,我们的坐标注意块Y的输出可以写成:
在这里插入图片描述

3 .实验

3.1 Importance of coordinate attention.

在这里插入图片描述
在这里插入图片描述

但是,当同时合并水平注意和垂直注意时,我们获得最佳结果,如表1所示。

	其实。。。效果不大

3.2 The impact of reduction ratio r.

在这里插入图片描述
这表明,通过减小减小比r来增加参数对提高模型性能至关重要.

3.3 Comparison with Other Methods

在这里插入图片描述
在这里插入图片描述

4. 结论

本文提出了一种新的轻量级的移动网络注意机制——坐标注意力机制。
我们的坐标注意继承了通道注意方法(例如,SE注意)的优势,该方法对通道间关系进行建模,同时通过精确的位置信息捕获远程依赖关系。


博主有话说:
其实就是结合SE和CBAM,但是提升不高,并且文章局限于移动网络,文章说SE和CBAM不是专门为移动网络设计的注意力机制,但是文章实验结果表明SE和CBAM对移动网络也有一定的效果,且作者提出的CA机制用在移动网络上的效果在前两种机制上并未提升多少精确度,而且参数量和计算量也相应提升了。

5. 实验

用CA模块测试,在yolov5模型中加入CA模块,效果有一点点提升。
在这里插入图片描述

6.代码

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))#池化核(H,1)沿水平坐标对每个通道进行编码。
        self.pool_w = nn.AdaptiveAvgPool2d((1, None))##池化核(1,W)沿垂直坐标对每个通道进行编码。

        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()#x*sigmoid
        
        self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)#改变h方向上张量的通道
        self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)#改变w方向上张量的通道
        

    def forward(self, x):
        identity = x
        #w、h方向进行池化,沿着两个空间方向聚合特征,得到一对方向感知特征图。
        n,c,h,w = x.size()
        x_h = self.pool_h(x)
        x_w = self.pool_w(x).permute(0, 1, 3, 2)

        #池化结果拼接,进行1x1卷积
        y = torch.cat([x_h, x_w], dim=2)
        y = self.conv1(y)
        y = self.bn1(y)
        y = self.act(y) 
        #沿着空间维度将 y 分成两个单独的张量
        x_h, x_w = torch.split(y, [h, w], dim=2)
        x_w = x_w.permute(0, 1, 3, 2)

        #通过1x1卷积将调整通道数与x相同
        a_h = self.conv_h(x_h).sigmoid()
        a_w = self.conv_w(x_w).sigmoid()

        out = identity * a_w * a_h

        return out

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值