CVPR 2024 即插即用! CA:新注意力机制,助力分类 检测 分割涨点!

。为了更加清晰的描述CA注意力,这里先对SE block进行讨论。

3.1 Revisit SE Block

在结构上,SE block可分解为SqueezeExcitation 2步,分别用于全局信息嵌入和通道关系的自适应Re-weight。

Squeeze

在输入

的条件下,第

通道的squeeze步长可表示为:

式中,

是与第

通道相关的输出。

输入

来自一个固定核大小的卷积层,因此可以看作是局部描述符的集合。Sqeeze操作使模型收集全局信息成为可能。

Excitation

Excitation的目的是完全捕获通道之间的依赖,它可以被表述为:

其中

为通道乘法,

激活函数,

为变换函数生成的结果,公式如下:

这里,

是2个线性变换,可以通过学习来捕捉每个通道的重要性。

为什么SE Block不好?

SE Block虽然近2年来被广泛使用;然而,它只考虑通过建模通道关系来重新衡量每个通道的重要性,而忽略了位置信息,但是位置信息对于生成空间选择性attention maps是很重要的。因此作者引入了一种新的注意块,它不仅仅考虑了通道间的关系还考虑了特征空间的位置信息。

3.2 Coordinate Attention Block

Coordinate Attention通过精确的位置信息对通道关系和长期依赖性进行编码,具体操作分为Coordinate信息嵌入Coordinate Attention生成2个步骤。

3.2.1 Coordinate信息嵌入

全局池化方法通常用于通道注意编码空间信息的全局编码,但由于它将全局空间信息压缩到通道描述符中,导致难以保存位置信息。为了促使注意力模块能够捕捉具有精确位置信息的远程空间交互,本文按照以下公式分解了全局池化,转化为一对一维特征编码操作:

具体来说,给定输入

,首先使用尺寸为(H,1)或(1,W)的pooling kernel分别沿着水平坐标和垂直坐标对每个通道进行编码。因此,高度为

的第

通道的输出可以表示为:

同样,宽度为

的第

通道的输出可以写成:

上述2种变换分别沿两个空间方向聚合特征,得到一对方向感知的特征图。这与在通道注意力方法中产生单一的特征向量的SE Block非常不同。这2种转换也允许注意力模块捕捉到沿着一个空间方向的长期依赖关系,并保存沿着另一个空间方向的精确位置信息,这有助于网络更准确地定位感兴趣的目标。

3.2.2 Coordinate Attention生成

通过3.2.1所述,本文方法可以通过上述的变换可以很好的获得全局感受野并编码精确的位置信息。为了利用由此产生的表征,作者提出了第2个转换,称为Coordinate Attention生成。这里作者的设计主要参考了以下3个标准:

  • 首先,对于Mobile环境中的应用来说,新的转换应该尽可能地简单;
  • 其次,它可以充分利用捕获到的位置信息,使感兴趣的区域能够被准确地捕获;
  • 最后,它还应该能够有效地捕捉通道间的关系。

通过信息嵌入中的变换后,该部分将上面的变换进行concatenate操作,然后使用

卷积变换函数

对其进行变换操作:

式中

为沿空间维数的concatenate操作,

为非线性激活函数,

为对空间信息在水平方向和垂直方向进行编码的中间特征映射。这里,

是用来控制SE block大小的缩减率。然后沿着空间维数将

分解为2个单独的张量

。利用另外2个

卷积变换

分别将

变换为具有相同通道数的张量到输入

,得到:

这里

是sigmoid激活函数。为了降低模型的复杂性和计算开销,这里通常使用适当的缩减比

(如32)来减少

的通道数。然后对输出

进行扩展,分别作为attention weights。

最后,Coordinate Attention Block的输出

可以写成:

3.2.3 CA Block的PyTorch实现
import torch
from torch import nn


class CA_Block(nn.Module):
    def __init__(self, channel, h, w, reduction=16):
        super(CA_Block, self).__init__()

        self.h = h
        self.w = w

        self.avg_pool_x = nn.AdaptiveAvgPool2d((h, 1))
        self.avg_pool_y = nn.AdaptiveAvgPool2d((1, w))

        self.conv_1x1 = nn.Conv2d(in_channels=channel, out_channels=channel//reduction, kernel_size=1, stride=1, bias=False)

        self.relu = nn.ReLU()
        self.bn = nn.BatchNorm2d(channel//reduction)

        self.F_h = nn.Conv2d(in_channels=channel//reduction, out_channels=channel, kernel_size=1, stride=1, bias=False)
        self.F_w = nn.Conv2d(in_channels=channel//reduction, out_channels=channel, kernel_size=1, stride=1, bias=False)

        self.sigmoid_h = nn.Sigmoid()
        self.sigmoid_w = nn.Sigmoid()

    def forward(self, x):

        x_h = self.avg_pool_x(x).permute(0, 1, 3, 2)
        x_w = self.avg_pool_y(x)

        x_cat_conv_relu = self.relu(self.conv_1x1(torch.cat((x_h, x_w), 3)))

        x_cat_conv_split_h, x_cat_conv_split_w = x_cat_conv_relu.split([self.h, self.w], 3)

        s_h = self.sigmoid_h(self.F_h(x_cat_conv_split_h.permute(0, 1, 3, 2)))
        s_w = self.sigmoid_w(self.F_w(x_cat_conv_split_w))

        out = x * s_h.expand_as(x) * s_w.expand_as(x)

        return out


if __name__ == '__main__':
    x = torch.randn(1, 16, 128, 64)    # b, c, h, w
    ca_model = CA_Block(channel=16, h=128, w=64)
    y = ca_model(x)
    print(y.shape)

4. 实验

4.1 消融实验

当水平注意力和垂直注意力结合时得到了最好的结果,如表1所示。实验结果表明,Coordinate Information Embedding在图像分类中,可以在保证参数量的情况下提升精度。

4.2 与其他Attention进行比较

可以看出,添加SE attention已经使分类性能提高了1%以上。对于CBAM与SE注意相比,似乎在Mobile Network中没有提升。然而,当使用本文所提出的CA注意力时,取得了最好的结果。

在上图中,作者还将使用不同注意力方法的模型生成的特征图进行了可视化。显然,CA注意力比SE和CBAM更有助于目标的定位。

4.3 Stronger Baseline

为了检验所提CA注意力在EfficientNet上的表现,作者简单地用CA注意力代替SE。对于其他设置遵循原始文件。结果如表5。与原有的含SE的EfficientNet-b0方法以及其他与EfficientNet-b0的方法相比,CA注意力络获得了最好的结果。这也所提出的CA注意力在强大的Mobile Network中仍然具有良好的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值