YOLOv7 | 注意力机制 | 添加ECA注意力机制

目录

原理简介

代码实现

yaml文件实现(tips:可以添加不同的位置)

检查是否添加执行成功

完整代码分享

论文创新必备(可帮忙做实验)

启动命令


ECA是通道注意力机制的一种实现形式,是基于SE的扩展。

作者认为SE block的两个FC层之间的降维是不利于channel attention的权重学习的 ,并且捕获所有通道之间的依存关系是效率不高且是不必要的。权重学习的过程应该直接一一对应。

ECA 注意力机制模块直接在全局平均池化层之后使用 1x1卷积层,去除了全连接层。该模块避免了维度缩减,并有效捕获了跨通道交互 。并且ECA只涉及少数参数就能达到很好的效果

ECA 通过一维卷积 layers.Conv1D 来完成跨通道间的信息交互 ,卷积核的大小通过一个函数来自适应变化,使得通道数较大的层可以更多地进行跨通道交互。

⭐欢迎大家订阅我的专栏一起学习⭐

🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀

YOLOv5涨点专栏:http://t.csdnimg.cn/CNQ32

YOLOv8涨点专栏:http://t.csdnimg.cn/tnoL5

YOLOv7专栏:http://t.csdnimg.cn/HsyvQ

💡魔改网络、复现论文、优化创新💡

最近,通道注意力机制已被证明在提高深度卷积神经网络(CNN)性能方面具有巨大潜力。然而,大多数现有方法致力于开发更复杂的注意力模块以实现更好的性能,这不可避免地增加了模型的复杂性。为了克服性能和复杂性权衡的悖论,(ECA)模块一种高效通道注意,该模块仅涉及少量参数,同时带来了明显的性能增益。通过剖析 SENet 中的通道注意力模块,凭经验证明避免降维对于学习通道注意力非常重要,适当的跨通道交互可以保持性能,同时显着降低模型复杂性。因此,一种无需降维的局部跨通道交互策略,可以通过一维卷积有效实现。此外,一种自适应选择一维卷积核大小的方法,确定局部跨通道交互的覆盖范围。ECA 模块高效且有效,

原理简介

ECA 模块图

给定通过全局平均池化 (GAP) 获得的聚合特征,ECA 通过执行大小为 k 的快速一维卷积来生成通道权重,其中 k 通过通道维度 C 的映射自适应确定。

首先回顾 SENet 中的通道注意模块(即 SE 块)。然后,我们通过分析降维和跨渠道交互的影响,对 SE 区块进行实证诊断。这促使我们提出 ECA 模块。此外,一种自适应确定 ECA 参数的方法,并最终展示如何将其应用于深度 CNN。

在重新审视SE块之后,进行了实证比较,分析通道降维和跨通道交互对通道注意力学习的影响。根据这些分析,提出了高效的通道注意力(ECA)模块。

为了验证其效果,我们将原始 SE 块与其三个变体(即 SE-Var1、SE-Var2 和 SEVar3)进行比较,所有变体均不执行降维。结果表明通道注意力有能力提高深度CNN的性能。同时,SE-Var2独立学习每个通道的权重,在涉及的参数较少的情况下略优于SE块。这可能表明通道及其权重需要直接对应,同时避免降维比考虑非线性通道依赖性更重要。此外,采用单个 FC 层的 SEVar3 的性能优于在 SE 块中进行降维的两个 FC 层。所有上述结果都清楚地表明,避免降维有助于学习有效的通道注意力。因此,我们开发了没有通道降维的 ECA 模块。

代码实现
class ECAAttention(nn.Module):
    """Constructs a ECA module.
    Args:
        channel: Number of channels of the input feature map
        k_size: Adaptive selection of kernel size
    """

    def __init__(self, c1, k_size=3):
        super(ECAAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # feature descriptor on the global spatial information
        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
        # Multi-scale information fusion
        y = self.sigmoid(y)

        return x * y.expand_as(x)

我们专注于学习模型复杂度较低的深度 CNN 的有效通道注意力。为此,我们提出了一种高效的通道注意力(ECA)模块,它通过快速一维卷积生成通道注意力,其内核大小可以通过通道维度的非线性映射自适应地确定。实验结果表明,我们的 ECA 是一种极其轻量级的即插即用模块,可提高各种深度 CNN 架构的性能,包括广泛使用的 ResNet 和轻量级 MobileNetV2。此外,我们的 ECA-Net 在对象检测和实例分割任务中表现出良好的泛化能力。将来,我们将把我们的 ECA 模块应用到更多的 CNN 架构中(例如 ResNeXt 和 Inception),并进一步研究 ECA 与空间注意力模块的结合。

yaml文件实现(tips:可以添加不同的位置)
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
   # [-1, 3, ECAAttention, [1024] ],
   

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]
检查是否添加执行成功

出现下图所示的网络结构,则说明添加成功

完整代码分享

链接: https://pan.baidu.com/s/19zHFv0vail_GtinyP7KAgQ?pwd=begm 提取码: begm 复制这段内容后打开百度网盘手机App,操作更方便哦

论文创新必备(可帮忙做实验)
启动命令
python train.py --weight --cfg ./path/yolov7.yaml # yolov7的yaml文件修改了网络结构,其他的未修改,可以自行尝试
相关推荐
吾名招财7 小时前
yolov5-7.0模型DNN加载函数及参数详解(重要)
c++·人工智能·yolo·dnn
FL16238631298 小时前
[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
深度学习·qt·yolo
FL16238631299 小时前
[C++]使用纯opencv部署yolov11旋转框目标检测
opencv·yolo·目标检测
weixin_466485119 小时前
Yolov8分类检测记录
yolo·分类·数据挖掘
FL162386312912 小时前
[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型
c++·opencv·yolo
给算法爸爸上香17 小时前
YOLOv11尝鲜测试五分钟极简配置
yolo·目标检测·yolov11
如果能为勤奋颁奖1 天前
YOLO11改进|卷积篇|引入可变核卷积AKConv
yolo
GIS潮流1 天前
遥感影像-实例分割数据集:iSAID 从切图到YOLO格式数据集制作详细介绍
yolo
FL16238631292 天前
[数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别
人工智能·yolo·目标检测
FL16238631293 天前
[深度学习][python]yolov11+deepsort+pyqt5实现目标追踪
人工智能·yolo