【CBAM】Convolutional Block Attention Module-即插即用的注意力模块,可多方面改进

目录

🍓🍓1.CBAM简介 

🍀🍀2.CBAM网络结构 

💖💖3.详细计算过程

🌷3.1Channel attention module

🌷3.2Spatial attention module

🍋🍋4.应用示范

🍇🍇5.实验

🍉5.1对比不同池化操作效果

🍉5.2对比不同空间注意力方法

🍉5.3对比通道、空间维度注意力对结果的影响

🍉5.4图像分类任务

🍉5.5特征图可视化

 🍉5.6目标检测任务

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


出处:ICCV2018

代码:code

论文:paper

        CBAM模块的主要目标是:通过在CNN中引入通道注意力和空间注意力来提高模型的感知能力,从而在不增加网络复杂性的情况下改善性能。


🍓🍓1.CBAM简介 

        简介:我们提出卷积块注意力模块(CBAM),一个简单而有效的前馈卷积注意力模块神经网络。 给定一个中间特征图,我们的模块自动沿着两个独立的维度通道和空间,潜在地推断注意力图,然后将注意力图乘以输入特征用于自适应特征细化的特征图。 因为 CBAM 是一种轻量级的通用模块,它可以集成到任何 CNN 架构中,额外的计算量可以忽略不计,并且可以进行端到端的训练CNN。 我们通过广泛的实验验证我们的 CBAM在ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上的表现。我们的实验表明各种模型的分类和检测性能均得到了一致改进,证明了 CBAM 的广泛适用性。

        CBAM既然可以在图像分类、目标检测等多任务上表现良好,性能提升,那么我们是不是就可以将其插入到任何图像分类、目标检测等CNN神经网络模型中呢,答案是当然可以,因为CBAM模块的输入就是隐层特征图,输出的是同样尺寸大小的隐层特征图,在不改变网络结构的情况下,这种即插即用的模块是最方便使用的。接下来,我们就对CBAM里的具体操作一探究竟吧!

🍀🍀2.CBAM网络结构 

        首先来看CBAM网络结构图。

        设特征图F为输入,1D通道注意图Mc ,2D空间注意图Ms,注意力计算过程如下:

 

💖💖3.详细计算过程

 

🌷3.1Channel attention module

        通道注意力聚焦在输入图像“什么”是有意义的。采用平均池化层和最大池化层压缩了输入特征图的空间维度,然后前向传给一个共享多层感知机网络,最后将两个输入加起来,通过一个激活函数,产生了通道注意力图Mc。

        通道注意力计算过程可描述如下:

        值得注意的是,共享多层感知机(shared MLP)(包含一个隐藏层),r是 reduction ratio,代表放缩尺度,原文中取16

 

🌷3.2Spatial attention module

        空间注意力模块与通道注意力不同,空间注意力集中于“何处”这一信息性部分,与通道注意力互补。

        具体操作:首先沿通道轴应用平均池化和最大池化操作,并将它们连接起来生成有效的特征描述符,通过此操作合并通道信息,产生两个图,最后通过一个卷积操作串联一个激活函数,得到统建注意力Ms。

        空间注意力计算过程可描述如下:

 

🍋🍋4.应用示范

        以Resnet添加CBAM模块为例进行应用示范:

        可以看到resnet添加CBAM模块的修改之处可以将两个相邻卷积模块之间添加CBAM模块,以增强特征图的表示。此外,为了保持残差链接的方式,在添加CBAM模块的输入处,添加一个残差链接,直接输出纸CBAM模块的输出处,一方面,保证了正常的残差网络连接方式,另一方面增加了CBAM模块的额外输入信息,丰富了特征图。

        以此为依据,我们可以在任何想要丰富特征图的模块间,添加CBAM模块,即插即用,十分方便,不需要大动干戈的修改网络结构,调整参数。

 

🍇🍇5.实验

🍉5.1对比不同池化操作效果

🍉5.2对比不同空间注意力方法

🍉5.3对比通道、空间维度注意力对结果的影响

🍉5.4图像分类任务

🍉5.5特征图可视化

 

 🍉5.6目标检测任务

 

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--

🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

### 集成CBAM注意力机制到YOLOv5 v7.0 为了提升目标检测性能,在YOLOv5版本7.0中可以集成CBAMConvolutional Block Attention Module注意力机制。以下是实现这一功能的具体方法: #### 1. CBAM简介 CBAM是一种轻量级的注意力模块,能够显著增强特征图中的重要区域权重[^3]。它通过通道注意和空间注意两个阶段来调整输入特征图的重要性。 - **通道注意**:通过对不同通道之间的关系建模,突出重要的通道。 - **空间注意**:进一步细化每个通道内的像素分布,强调关键的空间位置。 这种双重注意机制有助于提高模型对复杂场景的理解能力。 #### 2. 修改YOLOv5架构 要在YOLOv5中引入CBAM,需将其嵌入至骨干网络或颈部结构的关键部分。通常可以选择在以下几个地方加入CBAM- 主干网络(Backbone),例如CSPDarknet的部分卷积层之后; - 特征金字塔网络(FPN)或者路径聚合网络(PANet)之间。 下面是一个简单的代码片段展示如何修改`models/yolo.py`文件以支持CBAM: ```python import torch.nn as nn from cbam import CBAM # 假设已定义好CBAM类 class BottleneckWithCBAM(nn.Module): def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): super(BottleneckWithCBAM, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_, c2, 3, 1, g=g) self.add = shortcut and c1 == c2 self.cbam = CBAM(gate_channels=c2) def forward(self, x): y = x if self.add else 0 return self.cbam(self.cv2(self.cv1(x))) + y ``` 上述代码展示了如何创建一个新的瓶颈单元 `BottleneckWithCBAM` ,其中集成了CBAM模块[^4]。 #### 3. 替换原有组件 接下来需要替换掉原始YOLOResBlock或其他类似构建块的位置为新的带有CBAM的版本。这一步骤可能涉及编辑配置文件如`.yaml`以及对应的Python脚本逻辑。 #### 4. 训练与验证改进效果 完成以上更改后重新训练模型,并利用COCO数据集上的测试分割来进行精度评估[^2]。如果一切正常的话应该可以看到mAP等评价指标有所上升。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zy_destiny

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

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

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

打赏作者

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

抵扣说明:

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

余额充值