什么是 CBAM:混合注意力机制
CBAM(Convolutional Block Attention Module,卷积块注意力模块)是计算机视觉领域中一种混合注意力机制,由Sanghyun Woo等人在2018年的论文《CBAM: Convolutional Block Attention Module》中提出。它通过级联通道注意力(Channel Attention)和空间注意力(Spatial Attention)两个子模块,在CNN中实现对特征图的精细化关注,帮助模型同时捕捉“什么特征重要”(通道维度)和“哪里重要”(空间维度)。CBAM的核心在于“自适应上下文感知”:它动态生成注意力权重,强化有用通道和像素区域,抑制噪声,从而提升特征表示的鲁棒性和准确率。这种机制计算高效、易集成,已广泛应用于现代视觉模型。下面,我将从定义、原理、工作机制、与其他注意力机制的区别、应用场景以及典型例子等方面进行详细阐述。
定义
CBAM是一种插件式注意力模块,专为卷积神经网络设计。它将输入特征图([B, C, H, W])通过通道注意力模块生成通道权重([B, C, 1, 1]),再通过空间注意力模块生成空间权重([B, 1, H, W]),最终逐元素相乘实现特征校准。CBAM强调“级联交互”:通道模块先全局聚合信息指导空间关注,反之亦然。这种双重关注类似于人类视觉的“粗到细”过程,先识别对象类别(通道),再聚焦位置(空间)。模块参数量小(约1%的额外开销),适用于各种CNN骨干网络。
原理
CBAM的原理基于通道-空间联合依赖建模。它假设CNN特征中,通道间(如颜色通道)和空间位置(如边缘像素)的重要性因输入而异,因此需要独立却互补的注意力:

- 通道注意力:借鉴SE模块,使用全局平均池化(AvgPool)和最大池化(MaxPool)并行压缩空间维度,捕捉通道的全局统计(平均值表示分布,最大值表示显著性)。然后,通过共享MLP(多层感知器)生成权重,模拟通道间交互。
- 空间注意力:使用通道池化(AvgPool和MaxPool沿C维度)生成空间描述符,然后通过7x7卷积核学习空间相关性,输出2D权重图。
- 级联融合:通道输出作为空间输入的上下文,确保注意力模块间的信息流动。
这种原理解决了单一维度注意力的局限(如SE忽略空间),数学上可表示为:特征校准 x ~ = M c ( x ) ⊗ x \tilde{x} = M_c(x) \otimes x x~=Mc(x)⊗x,然后 x ~ = M s ( x ~ ) ⊗ x ~ \tilde{x} = M_s(\tilde{x}) \otimes \tilde{x} x~=Ms(x~)⊗x~,其中 M c M_c Mc和 M s M_s Ms分别为通道和空间注意力, ⊗ \otimes ⊗为逐元素乘。
工作机制
CBAM的工作流程分为通道注意力、空间注意力和级联应用三个阶段。以输入特征图x([B, C, H, W])为例:
-
通道注意力(Channel Attention):

- 并行池化:AvgPool生成 F a v g c F_{avg}^c Favgc([B, C, 1, 1]),MaxPool生成 F m a x c F_{max}^c Fmaxc。
- 共享MLP:两个池化结果拼接([B, 2C, 1, 1]),通过FC层降维(ratio=16)、ReLU激活、恢复维度、Sigmoid输出权重 M c M_c Mc([B, C, 1, 1])。
- 应用: x c = M c ⊗ x x_c = M_c \otimes x xc=Mc⊗x。
-
空间注意力(Spatial Attention):

- 并行池化:沿通道维度AvgPool和MaxPool,生成 F a v g s F_{avg}^s Favgs和 F m a x s F_{max}^s Fmaxs([B, 1, H, W])。
- 卷积学习:拼接([B, 2, H, W]),通过7x7卷积+Sigmoid生成权重 M s M_s Ms([B, 1, H, W])。
- 应用:最终输出 x ~ = M s ⊗ x c \tilde{x} = M_s \otimes x_c x~=Ms⊗xc。
整个过程顺序执行(通道先于空间),计算复杂度为O(C(HW) + HW),高效并行。PyTorch实现示例如下(简化版CBAM):
import torch
import torch.nn as nn
class ChannelAttention(nn.Module):
def __init__(self, channels, ratio=16):
super().__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(
nn.Conv2d(channels * 2, channels // ratio, 1, bias=False),
nn.ReLU(),
nn.Conv2d(channels // ratio, channels, 1, bias=False),
nn.Sigmoid()
)
def forward(self, x):
avg_out = self.fc(torch.cat([self.avg_pool(x), self.max_pool(x)], dim=1))
return avg_out * x # 实际中应广播
class SpatialAttention(nn.Module):
def __init__(self):
super().__init__()
self.conv = nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False)
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
out = torch.cat([avg_out, max_out], dim=1)
return self.conv(out) * x # Sigmoid隐含在conv后
class CBAM(nn.Module):
def __init__(self, channels, ratio=16):
super().__init__()
self.ca = ChannelAttention(channels, ratio)
self.sa = SpatialAttention()
def forward(self, x):
x = self.ca(x)
x = self.sa(x)
return x
与其他注意力机制的区别
CBAM作为混合机制,在维度覆盖和交互上优于单一模块:
- 通道注意力(如SE模块):仅通道级(C),忽略空间。CBAM添加空间模块,实现联合关注。
- 空间注意力:仅空间级(H-W),忽略通道语义。CBAM的级联确保通道指导空间。
- 像素注意力(如Triplet Attention):像素级跨维度(C-H-W),交互更丰富但计算稍高。CBAM更简单、级联式。
- 全局注意力(如Non-Local):全图像素对,复杂度O((HW)^2)。CBAM高效,聚焦局部。
CBAM的优点是“全面覆盖”和易扩展,但顺序级联可能引入轻微延迟。
| 机制类型 | 关注粒度 | 交互维度 | 计算复杂度 | 典型代表 |
|---|---|---|---|---|
| 通道注意力 | 通道级 | C | 低 | SE模块 |
| 空间注意力 | 空间级 | H-W | 中 | CBAM-Spatial |
| 混合注意力 | 通道+空间级 | C + H-W | 中 | CBAM |
| 像素注意力 | 像素级 | C-H-W | 中 | Triplet Attention |
| 全局注意力 | 全局像素对 | 全图 | 高 | Non-Local |
应用场景
CBAM广泛用于提升CNN在复杂场景下的性能:
- 图像分类:集成到ResNet中,提高ImageNet准确率1-2%,如CBAM-ResNet。
- 目标检测/分割:在YOLO或FCN中,增强小物体或边界像素关注,改善mAP。
- 轻量模型:MobileNetV2中使用,平衡速度与精度,适用于移动端。
- 其他:视频分析(时序CBAM)、遥感图像(突出地物空间)等,在噪声或遮挡环境下表现出色。
典型例子
在ImageNet分类任务中,将CBAM插入ResNet-50(原Top-1准确率76.15%),得到CBAM-ResNet-50(77.66%),参数增加仅0.1%。另一个例子是目标检测:在MS COCO数据集上,CBAM提升Faster R-CNN的mAP约2.2%,特别在拥挤场景中突出前景通道和位置。在实际应用如医疗影像分割,CBAM帮助模型关注肿瘤空间边界,提高Dice系数3-5%。
总之,CBAM代表了注意力机制的“混合范式”,桥接了通道与空间,推动了视觉任务的端到端优化。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)