【深度学习经典网络架构—10】:注意力模块之CBAM

✨博客主页:米开朗琪罗~🎈
✨博主爱好:羽毛球🏸
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法

😺一、简述

【深度学习经典网络架构—8】:注意力机制之SE_Block中,我们介绍了CNN的通道注意力模块SE_Block,本次带来的是另一个即用即插的注意力模块CBAM。

论文链接:CBAM: Convolutional Block Attention Module

😺二、CBAM(Convolutional Block Attention Module)

CBAM的结构如下图所示:
在这里插入图片描述
由图可知,CBAM包含两个独立的子模块,分别是通道注意力模块(Channel Attention Module,CAM)和空间注意力模块(Spartial Attention Module,SAM)。

设输入特征 F ∈ R C ∗ H ∗ W F\in \mathbb{R}^{C\ast H\ast W} FRCHW,顺序的可以得到一维的通道注意力图 M c ∈ R C ∗ 1 ∗ 1 M_{c}\in \mathbb{R}^{C\ast 1\ast 1} McRC11和二维的空间注意力图 M s ∈ R 1 ∗ H ∗ W M_{s}\in \mathbb{R}^{1\ast H\ast W} MsR1HW。全部的注意力过程可以总结为:
F ′ = M c ( F ) ⊗ F F ′ ′ = M s ( F ′ ) ⊗ F ′ \begin{matrix}F^{'}=M_{c}(F)\otimes F \\ F^{''}=M_{s}(F^{'})\otimes F^{'} \end{matrix} F=Mc(F)FF=Ms(F)F
其中 ⊗ \otimes 表示按元素级相乘。

🐶2.1 CAM(Channel Attention Module)

CAM如下图所示:
在这里插入图片描述
流程如下:
首先通过最大池化和平均池化得到两个 1 × 1 × C 1×1×C 1×1×C的特征图,然后将其送入MLP,将MLP输出的特征进行像素级的加和后再经过sigmoid激活,得到最终的通道注意力特征。

公式如下:
在这里插入图片描述

🐶2.2 SAM(Spatial Attention Module)

SAM如下图所示:
在这里插入图片描述流程如下:
将CAM作为输入,首先沿着通道维度进行最大池化和平均池化,得到两个 H × W × 1 H×W×1 H×W×1特征图,然后对特征图通道级联,接着经过一个 7 × 7 7×7 7×7卷积层降维至单通道,最后经sigmoid激活得到SAM。

公式如下:
在这里插入图片描述

😺三、消融实验

作者对网络结构进行了多组消融实验,最终确认串联,通道注意在前、空间注意在后能得到更优异的效果。具体实验结果详见论文。

😺四、CBAM可视化

为了确定CBAM带来的注意强度,作者使用Grad-CAM对特征图进行激活,如下图所示:
在这里插入图片描述
可以看到,加入CBAM的ResNet50要比加入SE_Block的具有更强的表达能力。

😺五、总结

CBAM作为一种联合了通道与空间的注意力模块,不仅加强了网络的特征表达能力,而且足够轻量化,在许多网络中都可以即插即用。

### CBAM注意力模块的工作原理 CBAM(Convolutional Block Attention Module)是一种轻量级的注意力机制,旨在增强卷积神经网络(CNN)中的特征表达能力。它通过引入两个子模块——**通道注意力模块(Channel Attention Module)**和**空间注意力模块(Spatial Attention Module)**,分别从通道维度和空间维度对特征图进行加权处理[^4]。 #### 1. **通道注意力模块** 通道注意力模块的主要功能是对不同通道的重要性进行建模。具体来说,该模块会计算每个通道的权重,并将其应用于原始特征图中对应的通道上。其实现过程如下: - 首先通过对输入特征图执行全局最大池化操作和全局平均池化操作,提取每条通道的信息。 - 接着将这两种池化的结果送入一个多层感知机(MLP),并通过共享参数的方式生成两组权重向量。 - 最终将这两组权重相加以得到最终的通道注意力建议并作用于原特征图上。 以下是PyTorch实现的一个简单例子: ```python import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=8): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) ``` #### 2. **空间注意力模块** 空间注意力模块则专注于捕捉特征图的空间分布特性。它的核心思想是从水平方向和垂直方向聚合信息,进而决定哪些区域更重要。其主要步骤包括: - 利用沿通道轴的最大池化和平均池化获取二维空间信息。 - 将上述两种方式获得的结果拼接起来形成一个新的张量作为后续卷积运算的基础。 - 使用一个小型卷积核对该新构建的数据进行变换以得出最后的空间掩码。 下面是对应的部分代码片段展示: ```python class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, 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) ``` #### 整体框架集成 当这两个独立运作却相互补充的组件组合在一起时就构成了完整的CBAM结构。它们按照先后次序依次施加到输入数据之上完成整体优化流程[^2]。 完整版CBAM定义可能看起来像这样: ```python class CBAM(nn.Module): def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max'], no_spatial=False): super(CBAM, self).__init__() self.ChannelGate = ChannelAttention(gate_channels, reduction_ratio=reduction_ratio) self.no_spatial=no_spatial if not no_spatial: self.SpatialGate = SpatialAttention(kernel_size=7) def forward(self, x): x_out = self.ChannelGate(x) x_out = x * x_out if not self.no_spatial: x_out = self.SpatialGate(x_out) x_out = x_out * x return x_out ``` ### 应用场景分析 由于CBAM能够显著提升模型对于目标物体的关注度,在实际项目中有广泛的应用价值。比如但不限于以下几个方面: - 图像分类任务:帮助区分细微差异较大的类别; - 物体检测领域:改善边界框预测精度; - 语义分割作业:强化像素级别标注准确性; 这些优势都得益于CBAM能够在不增加太多额外计算成本的前提下极大地增强了基础骨干网路的表现力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王乐予

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

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

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

打赏作者

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

抵扣说明:

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

余额充值