问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

通道和空间的双重作用的CBAM注意力机制

创作时间:
2025-03-22 10:16:23
作者:
@小白创作中心

通道和空间的双重作用的CBAM注意力机制

引用
CSDN
1.
https://m.blog.csdn.net/a8039974/article/details/145877636

CBAM(Convolutional Block Attention Module)注意力机制是一种结合了通道注意力和空间注意力的机制,旨在提升卷积神经网络(CNN)对图像特征的敏感度和表达能力。

一、通道注意力模块(Channel Attention Module)

通道注意力模块主要关注特征图中哪些通道(即特征的类别)对最终结果更重要,从而对这些通道赋予更高的权重。在深度神经网络中,特征图的每一个通道往往代表了一类特征,例如边缘、纹理或颜色的某一方面。然而,并非每一个通道的特征都对当前任务同等重要。通道注意力机制旨在为每一个通道分配一个权重,突出那些对当前任务更为重要的通道,同时抑制不重要的通道。

具体来说,通道注意力模块通过全局池化操作从特征图中提取全局信息,然后使用共享的多层感知器(MLP)网络生成每个通道的注意力权重。这些权重通过sigmoid函数进行归一化,确保输出在0到1之间。最后,将原始特征图与通道注意力权重逐通道相乘,得到加权后的特征图。

具体计算过程:

  1. 输入Input feature F
  2. 经过AvgPool获得特征图AvgPool(F)、经过MaxPool获得特征图MaxPool(F)
  3. 同时,两条池化路径共享一个MLP(多层感知机结构),AvgPool(F)、MaxPool(F)分别经过MLP处理,得到MLP(AvgPool(F))、MLP(MaxPool(F))
  4. 然后经过激活函数,得到最终的输出Mc(F)

二、空间注意力模块(Spatial Attention Module)

空间注意力模块主要关注特征图中哪些空间位置包含更为关键的信息,从而对这些位置赋予更高的权重。通过引入空间注意力机制,模型能够更准确地定位图像中的关键区域,并增强这些区域对最终预测结果的影响。

空间注意力模块通常首先对输入特征图进行通道维度的压缩(例如通过平均池化或最大池化),以生成两个二维的空间描述符。然后,这两个描述符被拼接在一起,并通过一个标准的卷积层进行处理,以生成空间注意力图。最后,这个注意力图被用来重新加权原始特征图的空间位置,从而增强关键区域并抑制无关紧要的区域。

具体计算过程:

  1. 经Channel Attention Module处理得到的输出F’输入到Spatial Attention Module中
  2. 经过MaxPool、AvgPool、7*7Conv的卷积操作,得到特征图
  3. 最后经过sigmoid激活函数,得到最终的Spatial Attention Maps

三、通道和空间注意力的双重作用

CBAM注意力机制通过结合通道注意力和空间注意力,实现了从通道到空间的顺序注意力结构。这种结构使得模型能够先关注重要的通道,再在这些通道内关注重要的空间位置,从而更精细地捕捉和利用关键信息。

具体来说,通道注意力模块帮助模型识别出哪些通道包含重要的特征信息,并对这些通道进行加权增强。随后,空间注意力模块在这些加权后的通道内进一步定位关键的空间位置,并对这些位置进行加权增强。通过这种双重作用,CBAM注意力机制显著提升了模型对图像特征的敏感度和表达能力。

大致流程:

  1. 首先,输入一张中间的特征图
  2. 输入图像经过Channel Attention Module,Channel Attention Module我们用Mc表示,得到Channel Attention maps Mc(F)
  3. 得到的Mc(F)与输入图像进行像素级别的相乘操作,得到F’
  4. F’继续进入到Spatial Attention Module,Spatial Attention Module我们用Ms表示,得到Spatial Attention maps Ms(F’)。
  5. 得到的Ms(F’)与输入图像F’进行像素级别的相乘操作,得到F’'

四、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注意力机制可以轻松地集成到现有的CNN架构中,以增强其性能。由于CBAM增加了很少的计算开销和参数数量,因此它在实际应用中具有很高的性价比。此外,CBAM在多个计算机视觉任务(如图像分类、目标检测和语义分割)上都取得了显著的性能提升,证明了其有效性和通用性。

综上所述,通道和空间双重作用的CBAM注意力机制通过结合通道注意力和空间注意力,实现了对图像特征的精细捕捉和利用。这种机制在提升CNN性能方面具有显著优势,并广泛应用于各种计算机视觉任务中。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号