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])为例:

  1. 通道注意力(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=Mcx
  2. 空间注意力(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~=Msxc

整个过程顺序执行(通道先于空间),计算复杂度为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的优点是“全面覆盖”和易扩展,但顺序级联可能引入轻微延迟。

机制类型关注粒度交互维度计算复杂度典型代表
通道注意力通道级CSE模块
空间注意力空间级H-WCBAM-Spatial
混合注意力通道+空间级C + H-WCBAM
像素注意力像素级C-H-WTriplet 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代表了注意力机制的“混合范式”,桥接了通道与空间,推动了视觉任务的端到端优化。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐