CBAM:Convolutional Block Attention Module流程详解及Pytorch实现

广告位:

图像拼接论文精读专栏 —— 图像拼接领域论文全覆盖(包含数据集),省时省力读论文,带你理解晦涩难懂的论文算法,学习零散的知识和数学原理,并学会写图像拼接领域的论文(介绍、相关工作、算法、实验、结论、并附有参考文献,不用一篇一篇文章再找)

图像拼接论文源码精读专栏 —— 图像拼接有源码的论文全覆盖(有的自己复现),帮助你通过源码进一步理解论文算法,助你做实验,跑出拼接结果,得到评价指标RMSE、SSIM、PSNR等,并寻找潜在创新点和改进提升思路。

超分辨率重建专栏 —— 从SRCNN开始,带你读论文,写代码,复现结果,找创新点,完成论文。手把手教,保姆级攻略。帮助你顺利毕业,熟练掌握超分技术。

有需要的同学可以点上面链接看看。



CBAM:Convolutional Block Attention Module
论文地址:https://arxiv.org/pdf/1807.06521.pdf

前言

CBAM是轻量级的卷积块注意力模型,它可以添加到任何CNN架构中,提升模型的性能。它总结了之前做过的关于注意力机制应用到图像领域的工作,链接如下:
1.Residual Attention Network for Image Classification
2.SENet:Squeeze-and-Excitation Network
3.SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning

其中,受到SENet的启示(不了解SENet的朋友可以看我的文章SENet重点干货及Pytorch实现),CBAM将空间注意力和通道注意力结合起来,实现了两全其美的办法,CNN加入CBAM后能显著提高图像分类和目标检测的准确率。


一、什么是CBAM?

CBAM整体结构
如图所示,CBAM是针对feature map进行操作的,通过通道注意力模块和空间注意力模块,使提取到的特征更加精炼,提升模型的表现力。

Channel attention module

在这里插入图片描述
通道注意力模块:通道维度不变,压缩空间维度。该模块关注输入图片中有意义的信息(分类任务就关注因为什么分成了不同类别)。

操作流程如下:

输入特征图F,经过两个并行的最大值池化和平均池化将C×H×W的特征图变成C×1×1的大小,然后经过一个Shared MLP(Conv/Linear,ReLU,Conv/Linear),压缩通道数C/r (reduction=16),再扩张回C,得到两个激活后的结果。最后将二者相加再接一个sigmoid得到channel_out,channel_out再乘以最初的输入,大小变回了C×H×W,完成通道注意力操作。

此步骤与SENet不同之处是加了一个并行的最大值池化,提取到的高层特征更全面,更丰富。

Spatial attention module

在这里插入图片描述

空间注意力模块:空间维度不变,压缩通道维度。该模块关注的是目标的位置信息。

操作流程如下:

将上一步得到的结果通过最大值池化和平均池化分成两个大小为H×W×1的张量,然后通过Concat操作将二者堆叠在一起(C为2),再通过卷积操作将通道变为1同时保证H和W不变,经过一个sigmoid得到spatial_out,最后spatial_out乘上一步的输入变回C×H×W,完成空间注意力操作

如果看到这还是没有详细理解流程,那就上一张笔者自己画的CBAM详细的流程图供大家参考:

在这里插入图片描述

二、Pytorch实现CBAM

CBAM模块完整代码:

import torch
import torch.nn as nn

class CBAMLayer(nn.Module):
    def __init__(self,channel,reduction = 16,spatial_kernel = 7):
        super(CBAMLayer,self).__init__()
        
        #channel attention 压缩H,W为1
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        
        #shared MLP
        self.mlp = nn.Sequential(
            #Conv2d比Linear方便操作
            #nn.Linear(channel, channel // reduction, bias=False)
            nn.Conv2d(channel,channel//reduction,1,bias = False),
            #inplace=True直接替换,节省内存
            nn.ReLU(inplace=True),
            #nn.Linear(channel // reduction, channel,bias=False)
            nn.Conv2d(channel//reduction,channel,1,bias = False)
        )
        
        #spatial attention
        self.conv = nn.Conv2d(2,1,kernel_size = spatial_kernel,
                              padding = spatial_kernel//2,bias=False)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self,x):
        
        max_out = self.mlp(self.max_pool(x))
        avg_out = self.mlp(self.avg_pool(x))
        channel_out = self.sigmoid(max_out+avg_out)
        x = channel_out * x
        
        max_out,_ = torch.max(x,dim = 1,keepdim=True)
        avg_out = torch.mean(x,dim = 1,keepdim=True)
        spatial_out = self.sigmoid(self.conv(torch.cat([max_out,avg_out],dim = 1)))
        x = spatial_out * x
        return x

测试网络结构代码:

x = torch.randn(1,16,64,64)
net = CBAMLayer(16)
y = net.forward(x)
y.shape

总结

  1. CBAM中作者对两个注意力机制使用的先后顺序做了实验,发现通道注意力在空间注意力之前效果最好。
  2. 作者在实验中应用了grad-CAM来可视化feature map,是个非常有用的可视化手段,在图像分类任务中可以观察feature map的特征,解释了为什么模型将原图分类到某一类的结果。原文链接:Grad-CAM。该系列方法还有其他改进的方法,感兴趣的朋友可以看一下。
  3. 加入CBAM模块不一定会给网络带来性能上的提升,受自身网络还有数据等其他因素影响,甚至会下降。如果网络模型的泛化能力已经很强,而你的数据集不是benchmarks而是自己采集的数据集的话,不建议加入CBAM模块。笔者亲自做实验发现用自己的数据集训练的网络加入CBAM后性能会下降。CBAM性能虽然改进的比SE高了不少,但绝不是无脑加入到网络里就能有提升的。也要根据自己的数据、网络等因素综合考量。总之,就很玄学。。。

没有硬件条件,需要云服务的同学可以扫码看看:
请添加图片描述

  • 52
    点赞
  • 226
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答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等,以提高整个网络中的特征提取能力和分类性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十小大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值