CBAM: Convolutional Block Attention Module

 1、引言

        论文链接:CBAM: Convolutional Block Attention Module | SpringerLink

        Sanghyun Woo[1] 等将注意力过程分解为互相独立的通道注意力和空间注意力而得到CBAM(convolutional block attention module)[1]。这样不仅可以节约参数和计算量,而且使 CBAM 能无缝地集成到现有的网络架构中去,并可以和被集成网络一起端到端训练。CBAM 对各种模型的分类和检测性能都有一致的改进,即 CBAM 的适用性非常广泛,是混合注意力机制的代表模型。

2、方法

图1  CBAM

        CBAM 依次由通道注意力模块和空间注意力模块组成。如图 1 所示,对于输入特征 F,先使用通道注意力模块得到的通道权重 Mc 调整 F 的通道特征(F*Mc)得到 F',再将 F' 输入空间注意力模块得到空间权重 Ms,使用 Ms 调整 F' 的空间特征(F‘*Ms)得到 F'',F'' 就是 CBAM 的输出。

图2  通道注意力模块

        CBAM 中的通道注意力模块可以看作是在 SE(Squeeze and Excitation) block[2] 的基础上增加了一个 AdaptiveMaxPool 分支,只是这两个分支共享一个 MLP(multiple layer perceptronz)。即对于 shape=(C, H, W) 的输入特征 F,分别使用 AdaptiveAvgPool 和 AdaptiveMaxPool 各得到一个 shape=(C, 1, 1) 的特征图;再将 AdaptiveAvgPool 和 AdaptiveMaxPool 的结果分别送入一个共享的只有一个隐藏层的 MLP 中学习,各得到 1 个 shape=(C, 1, 1) 的特征,这里使用的 MLP 和 SE block 中的完全相同;最后对这 2 个 MLP 的输出结果执行 Add 操作,然后使用 Sigmoid 激活得到 F 的通道权重 Mc。如图 2 所示。

图3  空间注意力模块

        CBAM 中的空间注意力模块如图 3 所示。对于 shape=(C, H, W) 的输入特征 F’(在 CBAM 中 F’ 是使用通道权重 Mc 调整后的特征),先分别进行通道维度的全局最大池化和全局平均池化各得到一个 shape=(1, H, W) 的特征;再将全局最大池化和全局平均池化的结果沿通道维度拼接得到一个 shape=(2, H, W) 的特征;最后经过一个 kernel_size=(7, 7) 的卷积层得到一个 shape=(1, H, W) 的特征,然后使用 Sigmoid 激活得到 F‘ 的空间权重 Ms。

图4  ResBlock+CBAM

        CBAM 和某个网络的结合方式和 SE block 完全一样,例如将 ResNet[3] 和 CBAM 结合时,CBAM 位于每个 ResBlock 的最后一个卷积层(实际上是最后一个 BatchNorm)的后面,CBAM 的输出加上恒等映射就是 ResBlock+CBAM 的输出,具体如图 4 所示。

3、总结

        [1] 提出了能提高网络表示能力的 CBAM,CBAM 依次由通道注意力模块和空间注意力模块组成,能在保持开销很小的同时实现可观的性能改进。通道注意力模块使用了最大池化特征和平均池化特征,从而能产生比 SE block 更精细的注意力,空间注意力的引入进一步提高了性能。CBAM 在 ImageNet-1K、MS COCO 和 VOC 2007 上优于所有 baseline。

        由于作者没有公开代码,故本人基于 Pytorch 实现了 CBAM 如下所示:

import torch
from torch import nn
from torch.nn import init

__all__ = ['CBAMBlock', 'ChannelAttention', 'SpatialAttention']


class ChannelAttention(nn.Module):
    def __init__(self, channel, reduction=16):
        super().__init__()
        self.maxpool = nn.AdaptiveMaxPool2d(1)
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.se = nn.Sequential(
            nn.Conv2d(channel, channel // reduction, 1, bias=False),
            nn.ReLU(),
            nn.Conv2d(channel // reduction, channel, 1, bias=False)
        )
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        max_result = self.maxpool(x)
        avg_result = self.avgpool(x)
        max_out = self.se(max_result)
        avg_out = self.se(avg_result)
        w = self.sigmoid(max_out + avg_out)
        return x * w


class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super().__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size=kernel_size, padding=kernel_size // 2)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        max_result, _ = torch.max(x, dim=1, keepdim=True)
        avg_result = torch.mean(x, dim=1, keepdim=True)
        result = torch.cat([max_result, avg_result], 1)
        w = self.conv(result)
        w = self.sigmoid(w)
        return x * w


class CBAMBlock(nn.Module):

    def __init__(self, channel, reduction=16, kernel_size=7):
        super().__init__()
        self.ca = ChannelAttention(channel=channel, reduction=reduction)
        self.sa = SpatialAttention(kernel_size=kernel_size)

    def init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, mode='fan_out')
                if m.bias is not None:
                    init.constant_(m.bias, 0)

    def forward(self, x):
        out = self.ca(x)
        out = self.sa(out)
        return out

参考文献

[1] Sanghyun Woo, Jongchan Park, Joon-Young Lee, and In So Kweon. CBAM: Convolutional Block Attention Module. In ECCV, 2018.

[2] Jie Hu, Li Shen, and Gang Sun. Squeeze-and-Excitation Networks. In CVPR, 2018.

[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep Residual Learning for Image Recognition. In CVPR, 2016.

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CBAM是卷积块注意力模块的缩写,是一种用于交替堆叠到深度卷积神经网络(CNNs)中的模块。它包含两个子模块:通道注意力模块和空间注意力模块。通道注意力模块用来对每个通道进行加权,确定哪些通道最重要。空间注意力模块在每个通道中对所有空间位置进行加权,可以捕捉不同位置的重要性,从而更好地定位物体。 CBAM的优点在于,它能够提高CNNs的性能,减少了过度拟合的情况。CBAM结构的输入任意大小、任意通道数、任意深度,因此可以适用于各种计算机视觉任务,包括图像分类,物体检测和语义分割等。 总之,CBAM是一种具有高灵活性和高性能的卷积块注意力模块,能够极大地增强CNNs的表达能力,提高计算机视觉任务的准确性。 ### 回答2: CBAMConvolutional Block Attention Module),是一种用于图像分类的Attention模块,它主要是用于增强卷积神经网络(CNN)的特征表达能力,使得CNN能够更好地区分不同种类的图像。 CBAM结构由两部分组成,分别是CBAM-Channel和CBAM-Spatial。在CBAM-Channel中,它通过引入注意力机制,对每个通道的特征进行加权求和,并且使用全局平均池化操作,计算其重要性参数,进而对特征进行修正,从而提升模型的表达能力。CBAM-Spatial则通过空间注意力机制对图像中的区域进行注意力分配权重,进一步优化模型的性能。 CBAM在图像分类方面的性能表现非常卓越。实验证明,在对比原始ResNet和ResNeXt网络,以及加入CBAM的ResNet和ResNext网络进行图像分类时,加入CBAM的ResNet和ResNeXt网络具有更强的表达能力和更高的分类准确性,同时,它在训练过程中的收敛速度也有所提升。 总的来说,CBAM是一种非常有效的图像分类模块,利用注意力机制对CNN的特征进行增强,为图像分类任务提供了更好的性能表现。随着人工智能的迅速发展,CBAM在图像识别、物体检测等领域将具有广阔的应用前景。 ### 回答3: CBAM是卷积块注意力模块的缩写,它是一种用于图像分类和目标检测的神经网络模型。CBAM模块通过将通道和空间注意力机制组合在一起,从而有效地提高了模型的性能。 CBAM模块分为两个部分:通道注意力机制空间注意力机制通道注意力机制是针对图像特征中的通道信息进行关注,它可以基于每个通道的特征图来计算权重,然后对于每个通道进行信息的调整和加权。这样,在网络中的每个层次上都能更好地利用有用的通道信息,减少无用信息对网络性能的影响。 空间注意力机制是针对图像特征中的空间信息进行关注。它能够自适应地计算每个像素点的权重,然后对于每个像素点进行信息的调整和加权。这样,网络中的每个空间位置都能更好地利用有用的空间信息,提高目标检测和分类的准确率。 通过组合这两种注意力机制CBAM模块能够区分有用和无用的特征,从而在图像分类和目标检测任务中取得更好的性能。CBAM模块通常被用在深度卷积神经网络中,例如ResNet以及MobileNet等,以提高整个网络中的特征提取能力和分类性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值