图像注意力机制概述

图像注意力机制是深度学习中的一种技术,用于增强神经网络对特征图中重要信息的关注能力。常见的注意力方式包括通道注意力、空间注意力等,它们通过自适应权重调整特征图的不同维度(如通道或空间位置),提升模型的性能。下面我将逐步解释您要求的四种图像注意力方式:通道注意力(SENet)、空间注意力(CBAM)、ECA(Efficient Channel Attention)和CA(Coordinate Attention)。每种方式的结构清晰,我将先介绍其基本原理,然后伪代码实现(基于PyTorch风格),确保内容真实可靠。


1. 通道注意力(SENet)

通道注意力机制源自Squeeze-and-Excitation Networks(SENet),它通过学习通道间的权重来增强重要通道的特征表示。核心思想是:先压缩特征图的空间维度以获取全局信息,然后通过一个门控机制(excitation)生成通道权重。

基本步骤

  1. 对输入进来的特征序列进行全局平均池化
  2. 然后进行两次全连接,第一次全连接神经元个数较少,第二次全连接个数和输入特征层相同
  3. 在完成两次全连接后,我们再取一次Sigmoid将值固定到0~1之间,此时我们获得了输入特征层每一个通道的权值
  4. 获得权值后,将权值乘上原始特征层即可

伪代码实现

import torch
import torch.nn as nn

class SEBlock(nn.Module):
    def __init__(self, channels, reduction=16):
        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 Module(CBAM)的一部分,它关注特征图的空间位置(即高度和宽度维度)。CBAM模块通常结合了通道注意力和空间注意力,但这里我们聚焦于空间部分:通过聚合通道信息生成空间权重图,突出重要区域。

基本步骤

  1. 对输入进来的特征序列分别进行通道注意力计算和空间注意力计算
  2. 通道注意力计算中在图像高宽上分别进行最大池化和平均池化,最后依然使用全连接层进行权重计算
  3. 空间注意力计算中在通道维度上进行最大池化和平均池化,然后将两个通道进行拼接,通过卷积运算得到一个通道数为1,高宽不变的权重图

伪代码实现

import torch
import torch.nn as nn

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size=kernel_size, padding=kernel_size//2)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        avg_pool = torch.mean(x, dim=1, keepdim=True)  # 通道平均池化
        max_pool, _ = torch.max(x, dim=1, keepdim=True)  # 通道最大池化
        concat = torch.cat([avg_pool, max_pool], dim=1)  # 拼接
        s = self.sigmoid(self.conv(concat))  # 卷积生成权重S
        return x * s  # 应用权重

解释:空间注意力通过池化操作聚合通道信息,生成空间权重图,使模型更关注特征图中的关键区域。这在目标检测和语义分割任务中很有效。


3. ECA(Efficient Channel Attention)

ECA是对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_size=k_size, padding=k_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. CA(Coordinate Attention)

Coordinate Attention(CA)同时关注通道和空间信息,通过分解注意力机制为水平和垂直方向。它利用坐标信息生成注意力图,捕捉长距离依赖。

基本步骤

  1. 对输入图像沿x方向进行池化,尺寸变化为[C,H,1]

  2. 对输入图像沿y方向进行池化,尺寸变化为[C,1,W]

  3. 将两个方向计算后的图像进行通道拼接(注意是通道拼接,并非相加,需进行reshape),尺寸变化为[C,1,H+W]

  4. 然后通过一个共享的1x1卷积结合缩放因子r进行通道数量的一个缩放,得到中间层特征,尺寸为[C/r,1,H+W]

  5. 进行批量归一化和非线性激活

  6. 将新的特征,按照原来的池化方向重新拆分回[C/r,H,1]和[C/r,1,W]

  7. 再使用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, dim=3, keepdim=True)  # 形状[b, c, h, 1]
        z_h = self.conv_h(z_h)
        # 垂直池化
        z_w = torch.mean(x, dim=2, keepdim=True)  # 形状[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整合了通道和坐标信息。在实际应用中,可以根据任务需求选择或组合这些机制。

Logo

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

更多推荐