混合域注意力机制(空间+通道)

在计算机视觉任务中,空间域注意力通常关注图像中不同位置的重要性,例如突出图像中的关键对象或区域。而通道域注意力则侧重于不同通道(特征图)的重要性,决定哪些特征对于任务更具判别力。混合域注意力机制结合了空间域注意力机制与通道注意力机制。它同时考虑空间和通道维度的重要性,通过学习每个空间位置和通道的权重,动态调整特征图中不同位置和通道的重要性,以增强模型对视觉任务的表达能力和性能。
具体来说,它通常会经过以下步骤实现:
1. 输入:假设输入特征图的尺寸为C×H×W,其中C是通道数,H和W分别是高度和宽度。
2. 计算空间域注意力:空间注意力权重通过对特征图的空间位置进行分析得到。
3.计算通道注意力: 通道注意力权重则通过对特征图的通道进行分析,例如使用全局平均池化或全局最大池化来汇总通道信息,然后经过全连接层等操作生成权重。
4. 特征加权融合:将得到的空间和通道注意力权重与原始特征图相乘,实现对特征的重新加权和聚焦。


下面分享几篇经典的混合域注意力机制论文。

1.CBAM: Convolutional Block Attention Module

论文地址:https://arxiv.org/abs/1807.06521

文章中提出注意力机制不仅能够提示网络应该关注那些区域,还能够增强这些区域的重要性。所以,本文结合注意力机制提出了一个新的网络模块(CBAM),通过关注通道和空间信息,来达到增强有效的特征,抑制不太有效的特征。

图1

如图1所示,CBAM的结构由两部分组成。一是通道注意力模块(Channel attention module),二是空间注意力模块(Spatial attention module)。下面就来看看这两部分的结构。

1.通道注意力模块(Channel attention module)

图2

如图2所示,通道空间注意力模块由三个操作组成。具体来说,首先分别使用全局平均池化和全局最大池化生成两个不同的空间描述符F_{avg}^CF_{max}^C,用来代表空间信息。然后,将F_{avg}^CF_{max}^C送入到一个共享的MLP当中去生成不同的通道注意力分数。最后,将MLP输出的两个不同的注意力分数相加,并通过Sigmoid函数激活便得到了最终的通道注意力权重。

2.空间注意力模块(Spatial attention module)

图3

如图3所示,空间注意力模块由三个操作组成。与通道注意力模块不同的是,空间注意力模块首先分别使用全局平均池化和全局最大池化沿通道轴生成两个不同的特征图F_{avg}^s \in R^{1 \times H \times W}F_{max}^s \in R^{1 \times H \times W}。然后,将F_{avg}^sF_{max}^s沿通道拼接在一起,并通过一个7 \times 7的卷积去生成空间注意力图。最后,通过Sigmoid函数激活便得到了最终的空间注意力权重。

此外,文章中还在ResBlock(ResNet)中集成了CBAM,结构如下图4所示。

图4

2.Dual Attention Network for Scene Segmentation

论文地址:https://arxiv.org/abs/1809.02983

文章中提出了一种双注意网络(Dual Attention Network, DANet,网络结构如下图5所示)来自适应地整合局部特征及其全局依赖关系。具体来说,它结合了自注意力机制(transformer)设计了两个模块(Position Attention Module和Channel Attention Module),用来捕获空间和通道维度上的特征依赖关系,然后将这两个模块的输出进行融合,进一步增强特征的表达。下面就来看看这两个模块的结构。

图5

1.Position Attention Module(PAM)

图6

PAM的结构如图6所示,它通过以下步骤来实现。

1. 输入特征图A \in R^{C \times H \times W},其中C是通道数,H和W分别是高度和宽度。

2. 将A用不同卷积层生成新的特征图B和C,其中B和C都\in R^{C \times H \times W}。然后将B和C除通道外拉成一条向量变形成R^{C \times HW}

3. 将C和B的转置进行矩阵乘法,再使用softmax操作即得到空间注意力图S\in R^{HW \times HW}

4.将A用卷积层生成特征图D,并将D拉成一条向量变形成R^{C \times HW}。然后,再将D与上一步得到的空间注意力图S的转置执行矩阵乘法,并将结果重塑成R^{C \times H \times W}

5. 最后,对上一步得到的结果乘以尺度参数\alpha,并与原始输入特征执行元素加法,便得到最终的输出特征。输出特征实现了有选择性的聚合上下文信息。

2.Channel Attention Module(CAM)

图7

CAM的结构如图6所示,它通过以下步骤来实现。

1. 输入特征图A \in R^{C \times H \times W},其中C是通道数,H和W分别是高度和宽度。

2. 将A变形成R^{C \times HW},与A的转置执行矩阵乘法,然后通过softmax操作得到通道注意力图X\in R^{C \times C}

4.将A的转置与上一步得到的通道注意力图X执行矩阵乘法,并将结果重塑成R^{C \times H \times W}

5. 最后,对上一步得到的结果乘以尺度参数\beta,并与原始输入特征执行元素加法,便得到最终的输出特征。


混合域注意力机制能够有效地提升模型的性能,增强模型对关键信息的捕捉能力,从而在图像分类、目标检测、语义分割等计算机视觉任务中取得更好的效果。

最后,欢迎关注公众号“AI小家”。

### Convolutional Block Attention Module (CBAM) 深度解析 #### 一、概述 Convolutional Block Attention Module (CBAM),作为一种混合注意力机制,在深度学习得到了广泛应用。该模块通过引入通道注意力( ChannelAttention )空间注意力(SpatialAttention) 来增强卷积神经网络(CNNs) 的特征表示能力[^1]。 #### 二、结构组成 CBAM 主要由两个顺序执行的子模块构成: - **通道注意力模块(ChannelAttention)**:此部分专注于识别输入图像中哪些通道携带更多有用的信息,即解决“什么”是有意义的问题。“What”指的是给定输入图片下有意义的内容。具体来说,它会计算每个通道的重要性得分,并据此调整各个通道权重,从而突出重要特性并抑制不相关噪声的影响[^3]。 - **空间注意力模块(SpatialAttention)**:“Where”的概念在此被体现出来——定位图像内最具代表性的区位置。通过对不同尺度的感受野进行聚合操作来捕捉全局上下文信息;随后基于这些多尺度特征图生成一张热力分布图作为最终的空间注意映射,以此强调目标物体所在之处而弱化背景干扰项。 #### 三、实现方式 下面给出 Python 实现 CBAM 各组成部分的具体代码片段: ```python 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) # Shared MLP layers 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) 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) class CBAM(nn.Module): def __init__(self, channel_in, reduction_ratio=16, spatial_kernel=7): super().__init__() self.channel_attention = ChannelAttention(channel_in, reduction_ratio) self.spatial_attention = SpatialAttention(spatial_kernel) def forward(self, x): ca_feature = self.channel_attention(x) * x sa_feature = self.spatial_attention(ca_feature) * ca_feature return sa_feature ``` 上述代码定义了一个完整的 CBAM 结构,其中包含了通道注意力和空间注意力两大部分的功能实现。通过这种方式可以在现有 CNN 架构基础上轻松嵌入 CBAM 组件以提高模型性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值