【YOLOv8改进】CPCA(Channel prior convolutional attention)中的通道注意力,增强特征表征能力 (论文笔记+引入代码)

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

摘要

医学图像通常展示出低对比度和显著的器官形状变化等特征。现有注意力机制通常不足以适应性地提升医学成像的分割性能。本文提出了一种有效的通道优先卷积注意力(CPCA)方法,支持在通道和空间维度上动态分配注意力权重。通过采用多尺度深度卷积模块,有效地提取空间关系同时保留通道优先。CPCA具有关注信息丰富通道和重要区域的能力。基于CPCA,我们提出了一个用于医学图像分割的网络,称为CPCANet。CPCANet在两个公开可用的数据集上进行了验证。与最先进的算法相比,CPCANet在需求较少的计算资源下实现了改进的分割性能。我们的代码已公开可用于https://github.com/Cuthbert-Huang/CPCANet。

基本原理

通道先验卷积注意力(Channel Prior Convolutional Attention,CPCA)是一种用于增强特征表示和动态分配注意力权重的注意力机制。CPCA结合了通道注意力和空间注意力,通过多尺度深度可分离卷积模块有效地提取空间关系并保留通道先验。下面是CPCA的详细技术原理:

  1. 通道注意力(Channel Attention)
    • 通道注意力模块用于动态学习每个通道的重要性,以提高特征的表征能力。通道注意力通过以下步骤实现:
      • 对输入特征进行全局平均池化和全局最大池化,得到两个不同的特征表示。
      • 将这两个特征表示分别通过两个卷积层和激活函数处理,以提取通道之间的关系。
      • 将处理后的特征通过Sigmoid函数生成通道注意力权重,用于动态调整每个通道的重要性。
  2. 空间注意力(Spatial Attention)
    • 空间注意力模块用于捕捉特征图中不同位置之间的关系,以提高空间信息的表征。空间注意力通过多尺度深度可分离卷积模块实现,可以有效地提取空间关系。
    • 多尺度深度可分离卷积模块使用不同大小的卷积核来捕获多尺度信息,从而更好地理解特征图的空间结构。
  3. CPCA的整体原理
    • CPCA结合了通道注意力和空间注意力,通过多尺度深度可分离卷积模块实现动态分配注意力权重,并保留通道先验。这种结合可以帮助网络更好地捕捉重要的特征,并提高特征的表征能力。

yolov8 引入

class CPCAChannelAttention(nn.Module):
   def __init__(self, input_channels, internal_neurons):
       super(CPCAChannelAttention, self).__init__()
       # 定义第一个1x1卷积层,将输入通道数减少到内部神经元数
       self.fc1 = nn.Conv2d(in_channels=input_channels, out_channels=internal_neurons, kernel_size=1, stride=1, bias=True)
       # 定义第二个1x1卷积层,将内部神经元数恢复到输入通道数
       self.fc2 = nn.Conv2d(in_channels=internal_neurons, out_channels=input_channels, kernel_size=1, stride=1, bias=True)
       self.input_channels = input_channels  # 保存输入的通道数

   def forward(self, inputs):
       # 自适应平均池化,将输入特征图缩小到1x1
       x1 = F.adaptive_avg_pool2d(inputs, output_size=(1, 1))
       # 通过第一个1x1卷积层
       x1 = self.fc1(x1)
       # 经过ReLU激活函数
       x1 = F.relu(x1, inplace=True)
       # 通过第二个1x1卷积层
       x1 = self.fc2(x1)
       # 应用Sigmoid激活函数
       x1 = torch.sigmoid(x1)

       # 自适应最大池化,将输入特征图缩小到1x1
       x2 = F.adaptive_max_pool2d(inputs, output_size=(1, 1))
       # 通过第一个1x1卷积层
       x2 = self.fc1(x2)
       # 经过ReLU激活函数
       x2 = F.relu(x2, inplace=True)
       # 通过第二个1x1卷积层
       x2 = self.fc2(x2)
       # 应用Sigmoid激活函数
       x2 = torch.sigmoid(x2)

       # 将自适应平均池化和自适应最大池化的结果相加
       x = x1 + x2
       # 调整形状,使其与输入特征图的通道数匹配
       x = x.view(-1, self.input_channels, 1, 1)
       return x

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139186904

posted @ 2024-06-08 11:59  YOLOv8大师  阅读(117)  评论(0编辑  收藏  举报