图像注意力

张开发
2026/4/11 14:27:10 15 分钟阅读

分享文章

图像注意力
图像注意力机制概述图像注意力机制是深度学习中的一种技术用于增强神经网络对特征图中重要信息的关注能力。常见的注意力方式包括通道注意力、空间注意力等它们通过自适应权重调整特征图的不同维度如通道或空间位置提升模型的性能。下面我将逐步解释您要求的四种图像注意力方式通道注意力SENet、空间注意力CBAM、ECAEfficient Channel Attention和CACoordinate Attention。每种方式的结构清晰我将先介绍其基本原理然后伪代码实现基于PyTorch风格确保内容真实可靠。1. 通道注意力SENet通道注意力机制源自Squeeze-and-Excitation NetworksSENet它通过学习通道间的权重来增强重要通道的特征表示。核心思想是先压缩特征图的空间维度以获取全局信息然后通过一个门控机制excitation生成通道权重。基本步骤对输入进来的特征序列进行全局平均池化然后进行两次全连接第一次全连接神经元个数较少第二次全连接个数和输入特征层相同在完成两次全连接后我们再取一次Sigmoid将值固定到0~1之间此时我们获得了输入特征层每一个通道的权值获得权值后将权值乘上原始特征层即可伪代码实现import torch import torch.nn as nn class SEBlock(nn.Module): def __init__(self, channels, reduction16): super(SEBlock, self).__init__() self.gap nn.AdaptiveAvgPool2d(1) self.fc nn.Sequential( nn.Linear(channels, channels // reduction), nn.ReLU(), nn.Linear(channels // reduction, channels), nn.Sigmoid() ) def forward(self, x): b, c, h, w x.size() z self.gap(x).view(b, c) # Squeeze: GAP得到z s self.fc(z).view(b, c, 1, 1) # Excitation: 生成权重s return x * s # 应用权重解释SENet通过全局平均池化获取每个通道的全局信息然后使用全连接层学习权重强调重要通道。这提升了模型对通道特征的敏感性常用于图像分类任务。2. 空间注意力CBAM空间注意力是Convolutional Block Attention ModuleCBAM的一部分它关注特征图的空间位置即高度和宽度维度。CBAM模块通常结合了通道注意力和空间注意力但这里我们聚焦于空间部分通过聚合通道信息生成空间权重图突出重要区域。基本步骤对输入进来的特征序列分别进行通道注意力计算和空间注意力计算通道注意力计算中在图像高宽上分别进行最大池化和平均池化最后依然使用全连接层进行权重计算空间注意力计算中在通道维度上进行最大池化和平均池化然后将两个通道进行拼接通过卷积运算得到一个通道数为1高宽不变的权重图伪代码实现import torch import torch.nn as nn class SpatialAttention(nn.Module): def __init__(self, kernel_size7): super(SpatialAttention, self).__init__() self.conv nn.Conv2d(2, 1, kernel_sizekernel_size, paddingkernel_size//2) self.sigmoid nn.Sigmoid() def forward(self, x): avg_pool torch.mean(x, dim1, keepdimTrue) # 通道平均池化 max_pool, _ torch.max(x, dim1, keepdimTrue) # 通道最大池化 concat torch.cat([avg_pool, max_pool], dim1) # 拼接 s self.sigmoid(self.conv(concat)) # 卷积生成权重S return x * s # 应用权重解释空间注意力通过池化操作聚合通道信息生成空间权重图使模型更关注特征图中的关键区域。这在目标检测和语义分割任务中很有效。3. ECAEfficient Channel AttentionECA是对SENet的改进旨在降低计算成本同时保持通道注意力的效果。它使用一维卷积代替全连接层避免降维操作从而更高效地学习通道权重。伪代码实现import torch import torch.nn as nn import math class ECABlock(nn.Module): def __init__(self, channels): super(ECABlock, self).__init__() self.gap nn.AdaptiveAvgPool2d(1) k_size int(math.log2(channels) / 2 0.5) # 自适应卷积核大小 k_size k_size if k_size % 2 1 else k_size 1 # 确保奇数 self.conv nn.Conv1d(1, 1, kernel_sizek_size, paddingk_size//2) self.sigmoid nn.Sigmoid() def forward(self, x): b, c, h, w x.size() z self.gap(x).view(b, c) # Squeeze: GAP得到z z z.unsqueeze(1) # 形状变为[b, 1, c] s self.sigmoid(self.conv(z)).view(b, c, 1, 1) # 1D卷积生成权重s return x * s # 应用权重解释ECA通过一维卷积直接学习通道权重避免了SENet中的降维操作减少了参数量和计算开销同时保持了性能。适用于轻量级模型和实时应用。4. CACoordinate AttentionCoordinate AttentionCA同时关注通道和空间信息通过分解注意力机制为水平和垂直方向。它利用坐标信息生成注意力图捕捉长距离依赖。基本步骤对输入图像沿x方向进行池化尺寸变化为[C,H,1]对输入图像沿y方向进行池化尺寸变化为[C,1,W]将两个方向计算后的图像进行通道拼接(注意是通道拼接并非相加需进行reshape)尺寸变化为[C,1,HW]然后通过一个共享的1x1卷积结合缩放因子r进行通道数量的一个缩放得到中间层特征尺寸为[C/r,1,HW]进行批量归一化和非线性激活将新的特征按照原来的池化方向重新拆分回[C/r,H,1]和[C/r,1,W]再使用1x1的卷积将通道数升回C,然后拼接Sigmoid函数得到各自方向上的注意力权重伪代码实现import torch import torch.nn as nn class CABlock(nn.Module): def __init__(self, channels): super(CABlock, self).__init__() self.conv_h nn.Conv2d(channels, channels, kernel_size(1, 1)) # 用于水平 self.conv_w nn.Conv2d(channels, channels, kernel_size(1, 1)) # 用于垂直 self.sigmoid nn.Sigmoid() def forward(self, x): b, c, h, w x.size() # 水平池化 z_h torch.mean(x, dim3, keepdimTrue) # 形状[b, c, h, 1] z_h self.conv_h(z_h) # 垂直池化 z_w torch.mean(x, dim2, keepdimTrue) # 形状[b, c, 1, w] z_w self.conv_w(z_w) # 生成注意力图 a self.sigmoid(z_h * z_w) # 元素相乘后sigmoid return x * a # 应用权重解释CA机制通过分解空间坐标同时捕获通道和位置信息增强了模型对长距离特征关系的建模能力。在图像识别和生成任务中表现优异。总结以上四种图像注意力机制各有特点SENet专注于通道信息CBAM的空间部分强化空间位置ECA优化了通道注意力的效率而CA整合了通道和坐标信息。在实际应用中可以根据任务需求选择或组合这些机制。

更多文章