CA注意力机制 (附代码)

文章介绍了CoordinateAttention,一种在轻量级网络中利用精确位置信息的注意力机制,它在编码通道关系和长程依赖性方面优于SENet和CBAM。CoordinateAttention通过捕获方向感知和位置感知信息,增强特征表示,特别适用于密集预测任务,如语义分割。

1.是什么?

Coordinate attention是一种注意力机制,用于将精确的位置信息编码到神经网络中,以便对通道关系和长期依赖性进行建模。它由两个步骤组成:Coordinate信息嵌入和Coordinate Attention生成。在Coordinate信息嵌入步骤中,位置信息被嵌入到输入特征图中。在Coordinate Attention生成步骤中,利用位置信息生成注意力图,并将其应用于输入特征图以强调感兴趣的表示。Coordinate attention的优势在于能够在移动网络中参与大区域的建模,并避免大量的计算开销。

2.为什么?

在轻量级网络上的研究表明,通道注意力会给模型带来比较显著的性能提升。但是在这之前主流的注意力机制是SENet和CBAM,都有一定的缺点。

SE模块只考虑了通道间信息的编码而忽视了位置信息的重要性,而位置信息其实对于很多需要捕获目标结构的视觉任务至关重要。

CBAM通过减少通道数继而使用大尺寸卷积来利用位置信息,如下图所示。然而,卷积仅仅能够捕获局部相关性,建模对视觉任务非常重要的长程依赖则显得有些有心无力。

3.怎么样?

相比此前的轻量级网络上的注意力方法,coordinate attention存在以下优势。首先,它不仅仅能捕获跨通道的信息,还能捕获方向感知和位置感知的信息,这能帮助模型更加精准地定位和识别感兴趣的目标;其次,coordinate attention灵活且轻量,可以被容易地插入经典模块,如MobileNetV2提出的inverted residual block和MobileNeXt提出的 sandglass block,来通过强化信息表示的方法增强特征;最后,作为一个预训练模型,coordinate attention可以在轻量级网络的基础上给下游任务带来巨大的增益,特别是那些存在密集预测的任务(如语义分割)。

CA模块通过精确的位置信息对通道关系和长程依赖进行编码,类似SE模块,也分为两个步骤:坐标信息嵌入(coordinate information embedding)坐标注意力生成(coordinate attention generation),它的具体结构如下图。

 

3.1 coordinate information embedding 

全局池化常用于通道注意力中来全局编码空间信息为通道描述符,因此难以保存位置信息。为了促进注意力模块能够捕获具有精确位置信息的空间长程依赖,作者将全局池化分解为一对一维特征编码操作。具体而言,对输入X XX,先使用尺寸( H , 1 ) (H,1)(H,1)和( 1 , W ) (1,W)(1,W)的池化核沿着水平坐标方向和竖直坐标方向对每个通道进行编码,因此,高度为h hh的第c cc个通道的输出表述如下

类似,宽度为w ww的第c cc个通道的输出表述如下。
 

上面这两个变换沿着两个空间方向进行特征聚合,返回一对方向感知注意力图。这和SE模块产生一个特征向量的方法截然不同,这两种变换也允许注意力模块捕捉到沿着一个空间方向的长程依赖,并保存沿着另一个空间方向的精确位置信息,这有助于网络更准确地定位感兴趣的目标。这个coordinate information embedding操作对应上图的X Avg Pool和Y Avg Pool这个部分。

 

3.2 coordinate attention generation

为了更好地利用上面coordinate information embedding模块产生的具有全局感受野并拥有精确位置信息的表示,设计了coordinate attention generation操作,

它生成注意力图,遵循如下三个标准。

  • 首先,对于移动环境中的应用来说,这种转换应该尽可能简单高效;
  • 其次,它可以充分利用捕获到的位置信息,精确定位感兴趣区域;
  • 最后,它还应该能够有效地捕捉通道之间的关系,这是根本

首先级联之前模块生成的两个特征图,然后使用一个共享的1x1卷积进行变换F_{1} ,表述如下式,生成的f \epsilon \mathbb{R}^{C/r*(H+W)} 是对空间信息在水平方向和竖直方向的中间特征图,这里的r表示下采样比例,和SE模块一样用来控制模块的大小。

接着,沿着空间维度将f切分为两个单独的张量f^{h} \epsilon \mathbb{R}^{C/r*(H+W)} 和f^{^{w}} \epsilon \mathbb{R}^{C/r*(H+W)},再利用两个1x1卷积F_{h}F_{w}将特征图f^{h}f^{w}变换到和输入X同样的通道数,得到下式的结果。

然后对g^{h}​和g^{w} 进行拓展,作为注意力权重,CA模块的最终输出可以表述如下式。

3.3 代码
class CoordAtt(nn.Module):
    def __init__(self, inp, oup, groups=32):
        super(CoordAtt, self).__init__()
        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
        self.pool_w = nn.AdaptiveAvgPool2d((1, None))

        mip = max(8, inp // groups)

        self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
        self.bn1 = nn.BatchNorm2d(mip)
        self.conv2 = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
        self.conv3 = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
        self.relu = h_swish()

    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.relu(y) 
        x_h, x_w = torch.split(y, [h, w], dim=2)
        x_w = x_w.permute(0, 1, 3, 2)

        x_h = self.conv2(x_h).sigmoid()
        x_w = self.conv3(x_w).sigmoid()
        x_h = x_h.expand(-1, -1, h, w)
        x_w = x_w.expand(-1, -1, h, w)

        y = identity * x_w * x_h

        return y

 参考:

注意力机制-CA注意力-Coordinate attention

CA-用于轻型网络的坐标注意力 | CVPR2021

github:https://gitcode.net/mirrors/houqb/coordattention?utm_source=csdn_github_accelerator

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值