深入浅出之Convolutional Block Attention Module(YOLO)

Convolutional Block Attention Module(CBAM)是一种用于增强卷积神经网络(CNN)特征表示能力的注意力机制模块。以下是对CBAM的详细解释:

一、CBAM的基本结构

CBAM由两个子模块组成:通道注意力模块(Channel Attention Module, CAM)和空间注意力模块(Spatial Attention Module, SAM)。这两个模块可以串联使用,以增强CNN对图像特征的建模和表示能力。深入浅出之Convolutional Block Attention Module(YOLO)_第1张图片

1.1、通道注意力模块(CAM)

通道注意力模块(Channel Attention Module, CAM)是卷积神经网络(CNN)中用于增强特征表示的一种机制,特别是在处理图像数据时。CAM的核心思想是自适应地调整不同通道的特征响应,以便网络能够更加关注那些对于特定任务(如图像分类、目标检测等)来说更为重要的特征。

深入浅出之Convolutional Block Attention Module(YOLO)_第2张图片

1.1.1、CAM的基本结构

CAM通常包含以下几个关键步骤:

  1. 全局信息聚合:首先,CAM会对输入特征图进行全局信息聚合,这通常是通过全局平均池化(Global Average Pooling, GAP)和/或全局最大池化(Global Max Pooling, GMP)来实现的。全局平均池化计算每个通道的平均值,而全局最大池化则选择每个通道的最大值。这两种操作都能够提供全局上下文信息,但侧重点不同。

  2. 特征变换:聚合后的全局信息会通过一系列变换(如全连接层、1x1卷积层等)来生成通道注意力权重。这些变换旨在捕捉通道间的依赖关系,并生成每个通道的权重值。

  3. 激活函数:变换后的特征通常会通过一个激活函数(如Sigmoid或Softmax)来生成最终的通道注意力权重。这些权重值介于0和1之间,表示每个通道的重要性。

  4. 特征重标定:最后,生成的通道注意力权重会与原始特征图相乘,实现特征的重标定。这一过程增强了那些对于任务来说更为重要的通道,同时抑制了那些不重要的通道。

1.1.2、CAM的工作原理

CAM的工作原理基于这样一个假设:不同通道的特征图对于任务的贡献是不同的。因此,通过自适应地调整每个通道的权重,CAM能够增强那些对于任务来说更为关键的特征,从而提高网络的性能。

1.1.3、CAM的优点

  1. 增强特征表示:CAM能够自适应地调整不同通道的特征响应,从而增强网络的特征表示能力。
  2. 即插即用:CAM模块可以轻松地嵌入到现有的CNN架构中,无需对原有网络结构进行大幅修改。
  3. 提升性能:在多种计算机视觉任务中,引入CAM模块可以显著提升模型的性能。
  4. 计算效率高:由于CAM主要依赖于全局池化和简单的变换操作,因此其计算效率相对较高。

1.2、空间注意力模块(SAM) 

空间注意力模块(Spatial Attention Module,SAM)是一种在神经网络中应用的注意力机制,特别是在处理图像数据时,它能够帮助模型更好地关注输入数据中不同空间位置的重要性。以下是对SAM的详细介绍:

1.2.1、原理与机制

  1. 注意力机制:在深度学习中,注意力机制模拟了人脑在处理信息时的注意力分配过程。模型在处理输入数据时,能够动态地、有选择地关注其中的重要部分,从而提高模型的性能和效率。
  2. 空间注意力:空间注意力机制专注于数据中不同位置之间的相关性。通过计算输入数据中每个位置与其他位置之间的相似度或关联性,得出注意力权重。这样,网络可以更加关注与当前任务相关的信息,从而提取出更有意义的特征。

1.2.2、SAM的工作流程

深入浅出之Convolutional Block Attention Module(YOLO)_第3张图片 

  1. 特征提取:SAM模型首先对输入的图像进行编码,生成多个不同等级的特征图。
  2. 通道注意力图生成:在特征图上,使用全局平均池化获取全局信息,并将其与每个像素点处的特征向量相结合,形成一个通道注意力图。
  3. 空间注意力图生成:利用空间注意力机制,生成一个空间注意力图。这个图与通道注意力图相结合(通常是通过相乘),形成最终的注意力图。
  4. 加权整合:将该注意力图作为加权因子,对原始特征图进行加权整合,得到更精确的特征表示。

1.2.3、应用与效果

  1. 应用领域:SAM在目标检测、图像分类、图像分割等计算机视觉任务中得到了广泛应用。
  2. 性能表现:在学术界的常见实验数据集上(如PASCAL VOC、Cityscapes等),SAM模型都取得了较好的性能表现。它成功提升了图像分割的准确性和鲁棒性,充分验证了其在图像分割任务上的实效性。

1.2.4、技术特点与创新

  1. 自适应性:SAM模型通过加入注意力模块,使网络能够自适应地选择特征图中最相关的信息。
  2. 结合通道与空间注意力:SAM不仅考虑了通道间的相关性(通过通道注意力图),还考虑了空间位置间的相关性(通过空间注意力图),从而更全面地捕捉输入数据的特征。

 

  1. 通道注意力模块(CAM)

    • 功能:自适应地调整不同通道的特征响应,以提高对不同特征的敏感性。
    • 实现方式:通过全局平均池化和全局最大池化捕获通道间的依赖关系,生成两个通道描述子。这两个描述子经过共享的全连接层(或1x1卷积)和ReLU激活函数进行变换,再经过Sigmoid函数得到通道注意力权重。这些权重与原始特征图相乘,实现通道维度的特征重标定。
  2. 空间注意力模块(SAM)

    • 功能:自适应地调整不同空间位置的特征响应,以提高对不同位置的敏感性。
    • 实现方式:首先对特征图进行通道维度的平均池化和最大池化操作,生成两个空间描述子。这两个描述子经过一个卷积层(或1x1卷积后接7x7卷积)进行融合,再通过Sigmoid函数得到空间注意力权重。这些权重与原始特征图相乘,实现对空间位置的特征重标定。

二、CBAM的工作流程

  1. 输入特征图经过CAM,得到通道注意力权重,并与原始特征图相乘,得到通道维度重标定后的特征图。
  2. 通道维度重标定后的特征图再经过SAM,得到空间注意力权重,并与原始特征图(或经过CAM处理后的特征图)相乘,得到最终的自适应特征响应。

三、CBAM的优点

  1. 增强特征表示:通过引入通道和空间注意力机制,CBAM能够增强CNN对图像特征的建模和表示能力。
  2. 即插即用:CBAM模块可以轻松地嵌入到现有的CNN架构中,如ResNet、VGG等,无需对原有网络结构进行大幅修改。
  3. 提升性能:在图像分类、目标检测、图像分割等任务中,引入CBAM模块可以显著提升模型的性能。
  4. 良好的可解释性:CBAM模块有助于理解模型在决策过程中的关注点,为深度学习模型的可视化和解释提供了有力的工具。

四、CBAM的pytorch实现 

"""
Original paper addresshttps: https://arxiv.org/pdf/1807.06521.pdf
Time: 2024-02-28
"""
import torch
from torch import nn
 
class ChannelAttention(nn.Module):
    def __init__(self, in_planes, reduction=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
 
        # shared MLP
        self.mlp = nn.Sequential(
            nn.Conv2d(in_planes, in_planes // reduction, 1, bias=False),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_planes // reduction, in_planes, 1, bias=False)
        )
        self.sigmoid = nn.Sigmoid()
 
    def forward(self, x):
        avg_out = self.mlp(self.avg_pool(x))
        max_out = self.mlp(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)
 
 
class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7, padding=3):
        super(SpatialAttention, self).__init__()
        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)
 
 
class CBAM(nn.Module):
    def __init__(self, in_planes, reduction=16, kernel_size=7):
        super(CBAM, self).__init__()
        self.ca = ChannelAttention(in_planes, reduction)
        self.sa = SpatialAttention(kernel_size)
 
    def forward(self, x):
        out = x * self.ca(x)
        result = out * self.sa(out)
        return result
 
if __name__ == '__main__':
    block = CBAM(16)
    input = torch.rand(1, 16, 8, 8)
    output = block(input)
    print(output.shape)

五、CBAM的应用场景

CBAM模块广泛应用于各种深度学习模型中,特别是在图像分类、目标检测、图像分割等计算机视觉任务中。通过引入CBAM模块,这些模型可以更加有效地学习图像特征,从而提升性能。

综上所述,CBAM是一种强大的注意力模块,为CNN的性能提升和特征建模提供了重要的工具。它结合了通道和空间注意力机制,能够自适应地调整特征图的权重,以适应不同的任务和场景。

参考:

  1. CBAM注意力机制详解(附pytorch复现)-CSDN博客 
  2. 一文看尽深度学习中的各种注意力机制(1998-2020年)-CSDN博客

你可能感兴趣的:(#,Pytorch框架,YOLO目标检测专栏,深度学习目标检测,深度学习,神经网络,计算机视觉)