【论文笔记】独属于CV的注意力机制CBAM-Convolutional Block Attention Module

目录

写在前面

一、基数和宽度

二、通道注意力模块(Channel Attention Module)

三、空间注意力模块(Spatial Attention Module)

四、CBAM(Convolutional Block Attention Module)

五、总结


写在前面

        CBAM论文地址:https://arxiv.org/abs/1807.06521

        CBAM(Convolutional Block Attention Module)是2018年被提出的,不同于ViT的Attention,CBAM是为CNN量身定做的Attention模块,实现简单、效果好,你值得拥有。

        为了提高CNN的性能,我们可以从深度(depth)、宽度(width)和基数(cardinality)三个方面入手。深度很好理解,就是模型的层数,层数越多模型越深。下面说一说基数和宽度的区别。

一、基数和宽度

基数(cardinality):指的是并行分支的数量。

宽度(width):指每一层卷积的卷积核数量(即输出特征图的通道数)。

举个GoogLeNet的例子:

        GoogLeNet 的设计中,Inception模块通过组合多个不同大小的卷积核(例如 1x1、3x3、5x5)和池化操作来提取不同尺度的特征。

        增加“宽度”的效果: 我们有一个 Inception 模块,包含 1x1、3x3 和 5x5 的卷积层,以及一个 3x3 的最大池化层。如果我们在该 Inception 模块中增加每个卷积操作的通道数,例如将 1x1 卷积层的输出通道数从 32 增加到 64,将 3x3 卷积层的输出通道数从 64 增加到 128,这种操作就增加了网络的“宽度”。增加“宽度”意味着每个 Inception 模块可以提取更多的特征信息,但同时也增加了计算成本。

        增加基数: 如果我们将每个卷积和池化操作进一步拆分为多个组,例如在每个卷积操作中使用组卷积(group convolution),那么这些并行组卷积操作的数量就类似于增加了“基数”。每个组卷积操作都是一个独立的路径,这些路径的数量增加就代表了基数的增加。基数不仅节省了参数的总数,而且比深度和宽度这两个因素具有更强的表示能力。

        可以看下图,蓝色的线表示模型的基数,红色的数字表示宽度。

        CBAM由两个顺序的子模块组成:通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)。CAM解决的问题是重要的信息是什么(‘what’ is meaningful given an input image)、SAM解决重要的信息在哪里(‘where’ is an informative part)。这两个模块都使用了增加基数的方式,提升模型的表达能力。

二、通道注意力模块(Channel Attention Module

        我们知道CNN的每个通道可以提取不同的特征(也就是Feature Map),通道注意力模块(Channel Attention Module)的主要作用是自适应地调整和增强输入Feature Map中每个通道的重要性。它通过学习每个通道对于当前任务的重要性权重,从而对不同通道进行加权,增强关键信息的表达,同时抑制不相关或冗余的特征。这种机制能够使神经网络更高效地利用信息,提高模型的性能和表达能力。

        通俗的说,CAM就是判断每个Feature Map的重要程度。即下图中相同颜色的部分会有一个标记重要程度的权重。

        CAM使用并行的平均池化和最大池化,每个池化分别经过两个卷积模块,然后相加经过sigmoid得到注意力概率图,公式如下:

        其中σ为Sigmoid型函数,MLP这里使用的是两个卷积层,权重W_0W_1是共享的。

        公式不直观,示意图如下,假设输入是一个32通道244x244的Feature Map,输出是32x1x1,表示32个Feature Map的重要程度。

        使用pooling可以捕获每个通道特征的强度。平均池化(Average Pooling) 能够捕获每个通道的整体激活分布信息。它反映了一个通道中所有特征点的平均响应,能够平滑地代表特征的整体强度。最大池化(Max Pooling) 捕获的是特征图中的最强激活信号。它能够突出特征图中最显著的特征,强调特征中的极端值。

        平均池化提供了特征分布的全局性信息,而最大池化提供了最显著特征的信息。通过结合这两种池化方法,通道注意力模块能够更好地理解哪些特征通道在给定输入图像中最重要。

        两种池化之后的卷积层共享参数,而且两个卷积层的中间维度使用in_planes//16,最大限度的减少参数,因为注意力模块只提供一个注意力概率图,提取特征并不是它的首要任务,所以不需要太多参数。

        代码示例:

class ChannelAttention(nn.Module):
    def __init__(self, in_planes):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
           
        self.fc = nn.Sequential(nn.Conv2d(in_planes, in_planes // 16, 1, bias=False),
                               nn.ReLU(),
                               nn.Conv2d(in_planes // 16, in_planes, 1, bias=False))
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)

        

三、空间注意力模块(Spatial Attention Module

        SAM首先沿着通道轴分别使用平均池化和最大池化操作,并将它们连接起来,然后经过一个7x7的卷积层将通道数变成1,最后是Sigmoid得到结果,是一个宽高和输入一致通道数为1的概率图。

        SAM就是判断Feature Map中每个部分(像素)的重要程度,需要综合每个部分所有通道的特征。即下图中相同颜色的部分会有一个标记重要程度的权重。

公式如下:

       其中,σ表示Sigmoid函数,f^{7*7}表示大小为7×7的卷积运算。

        补充一下,这里的卷积核大小是7x7,而上面CAM的是1x1,这是因为CAM关注的是整个特征图中的全局通道信息1x1 卷积核适合这种只需在通道维度上操作的情况。SAM关注的是特征图中的局部和全局空间信息7x7 卷积核适合捕捉空间维度上的局部和全局特征。

        示意图如下,仍然假设输入是一个32通道244x244的Feature Map,输出是1x244x244。

        同时使用平均池化和最大池化的原因和CAM类似,平均池化提供了特征分布的全局性信息,而最大池化提供了最显著特征的信息。通过结合这两种池化方法,SAM能够更好地理解Feature Map中哪些区域最重要。

四、CBAM(Convolutional Block Attention Module)

        有了CAM和SAM,就剩最后一个问题,这两个模块怎么摆放,是并行放置还是顺行方式呢?作者发现顺序排列比平行排列的效果更好。下面是CBAM完整的结构图,我们随意在CBAM之前放几个卷积层:

CBAM完整的代码:

import torch
import torch.nn as nn


class ChannelAttention(nn.Module):
    def __init__(self, in_planes):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
           
        self.fc = nn.Sequential(nn.Conv2d(in_planes, in_planes // 16, 1, bias=False),
                               nn.ReLU(),
                               nn.Conv2d(in_planes // 16, in_planes, 1, bias=False))
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)


class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)


class DemoNet(nn.Module):
    expansion = 1

    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(DemoNet, self).__init__()
        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)

        self.ca = ChannelAttention(planes)
        self.sa = SpatialAttention()

    def forward(self, x):
        out = self.conv1(x)
        out = self.relu(out)
        out = self.conv2(out)

        out = self.ca(out) * out
        out = self.sa(out) * out

        out = self.relu(out)

        return out


if __name__ == '__main__':
    input = torch.randn(1, 3, 224, 224)
    demo_net = DemoNet(inplanes=3, planes=32)
    output = demo_net(input)
    print(output)

        这里还有一个CBAM应用到ResNet的完整例子:https://github.com/luuuyi/CBAM.PyTorch

五、总结

1.CBAM是一个轻量级和通用的模块,它可以无缝地集成到任何CNN架构中,而开销可以忽略不计,并且可以与基础CNN一起进行端到端训练;

2.通道注意力模块(Channel Attention Module)关注每个通道的Feature Map的重要程度;

3.空间注意力模块(Spatial Attention Module)关注Feature Map每个部分(像素)的重要程度;

4.CBAM由通道注意力模块和空间注意力模块两个模块组成,同时兼顾了通道与空间特征的表达,相比传统的卷积层参数更少、效果更好。

        CBAM就介绍到这里,关注不迷路(*^▽^*)

  关注订阅号了解更多精品文章

交流探讨请加微信

### 回答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等,以提高整个网络中的特征提取能力和分类性能。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殊小殊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值