YOLOv5改进 | 注意力机制 | 添加高效的通道注意力机制——ECA

在深度学习目标检测领域,YOLOv5已成为备受关注的模型之一。本文介绍了如何添加高效的通道注意力机制ECA到YOLOv5模型中。首先解释了ECA的主要原理,然后提供了逐步的代码添加和修改指南,以便读者能够轻松地实践。最后,完整的修改后的代码也被提供,使读者能够一键运行,并在实践中更好地理解YOLO系列目标检测的挑战和改进。


专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法 

目录

 1.原理

2.YOLOv5添加ECA注意力机制

2.1 ECA注意力机制代码

 2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3.总结  


 1.原理

论文地址: ECA-Net点击即可跳转

官方代码: ECA-Net官方代码仓库点击即可跳转

ECA-Net(Efficient Channel Attention Network)是一种旨在提高深度卷积神经网络(CNN)性能的方法,特别是在图像分类等计算机视觉任务中。它专注于增强CNN中的通道注意力机制的效率。

通道注意力机制旨在通过学习通道注意力权重来强调信息丰富的通道并抑制不相关的通道。这有助于CNN更好地利用特征图,从而实现改进的表示学习和更高的性能。然而,传统的通道注意力机制通常由于其复杂的操作而带来计算开销,这可能限制它们在资源受限场景中的实际效用。

ECA-Net引入了一种高效而有效的通道注意力机制,以减轻计算开销。它通过使用一种新颖的一维卷积核进行卷积操作,该操作仅沿通道维度操作。通过在非线性激活函数(例如ReLU)之前应用此操作,ECA-Net在不增加与空间维度相关的额外计算负担的情况下,有选择地强调信息丰富的通道并抑制不相关的通道。

这种方法使ECA-Net能够在与基线CNN架构相比实现更好的性能,而计算成本增加最少。通过增强通道信息的利用,ECA-Net使CNN能够学习更具判别性的特征,从而实现在各种计算机视觉任务中的更好的泛化和性能。

ECA结构图

2.YOLOv5添加ECA注意力机制

2.1 ECA注意力机制代码

关键步骤一:将下面代码添加到 yolov5/models/common.py中任意位置

# ECA
class ECA(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, c2, k_size=3):
        super(ECA, 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)

        # print(y.shape,y.squeeze(-1).shape,y.squeeze(-1).transpose(-1, -2).shape)
        # Two different branches of ECA module
        # 50*C*1*1
        # 50*C*1
        # 50*1*C
        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)

ECA(Efficient Channel Attention)注意力机制是一种用于深度卷积神经网络(CNN)的注意力机制,它旨在增强CNN对通道信息的利用,提高性能。以下是ECA注意力机制的基本流程:

1. 输入特征图(Feature Maps):首先,通过CNN的前向传播,得到输入特征图。这些特征图包含了输入图像在不同卷积层提取到的各种特征信息。

2. 1D卷积操作(1D Convolution):对于每个特征图,在通道维度上进行一维卷积操作。这种卷积操作是ECA注意力机制的核心,它使用一个1D的卷积核,沿着通道维度对特征图进行卷积运算。这个操作可以增强或抑制特定通道的信息。

3. 通道注意力权重计算(Channel Attention Weight Calculation):在进行1D卷积操作之后,对每个通道的特征图得到一个通道注意力权重。这个权重表示了每个通道在特定位置上的重要性,以及是否应该被强调或抑制。

4. 通道缩放(Channel Scaling):将通道注意力权重应用到原始特征图上,通过乘以通道注意力权重,来对每个通道的特征图进行缩放。这样可以使得重要的通道得到加强,而不重要的通道得到抑制。

5. 最终输出(Final Output):最后,得到经过通道注意力机制调节后的特征图,这些特征图可以用于后续的任务,如图像分类或目标检测。

ECA注意力机制通过在通道维度上进行1D卷积操作,动态地学习每个通道的重要性,并根据这些重要性对特征图进行调节,从而提高了CNN对于通道信息的利用效率,进而改善了模型的性能。

 2.2 新增yaml文件

关键步骤二:在 /yolov5/models/ 下新建文件 yolov5_eca.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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, ECA, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 10
  ]

# 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]],  # 14

   [-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]],  # 18 (P3/8-small)

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

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

   [[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

温馨提示:因为本文只是对yolov5s基础上添加CBAM模块,如果要对yolov5n/l/m/x进行添加则只需要修改对应的depth_multiple 和 width_multiple。


yolov5n/l/m/x对应的depth_multiple 和 width_multiple如下:

# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple

# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple

# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
2.3 注册模块

关键步骤三:在yolov5/models/yolo.py中注册,大概在250行左右添加 ‘ECA’

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_eca.yaml的路径,如下图所示

建议大家写绝对路径,确保配置文件一定能找到

 🚀运行程序,如果出现下面的内容则说明添加成功🚀

我修改后的代码:链接: 链接: https://pan.baidu.com/s/1cKSoHuOn9bSlf4vtewiGZQ?pwd=cc3f 提取码: cc3f

3.总结  

ECA(Efficient Channel Attention)注意力机制是一种旨在提高深度神经网络性能的机制。它的核心思想是通过有效地捕获通道之间的全局相关性来强调重要的通道信息,而不增加过多的计算成本和模型复杂度。相比于传统的注意力机制,ECA注意力机制更专注于通道间的关联性,而不是序列数据的关系。它通过使用一维卷积操作来计算每个通道的权重,然后将这些权重应用到相应的特征图上。这样的设计不仅降低了计算成本,还减少了模型参数数量。引入ECA注意力机制可以有效提升深度神经网络在大规模图像数据处理任务中的性能,特别是在涉及大规模图像数据的任务中,它展现了出色的性能和效率。

### YOLOv5ECA 注意力机制的实现与应用 #### ECA 注意力机制简介 ECA(Efficient Channel Attention)是一种有效的通道注意力模块,旨在提高卷积神经网络的表现。相比其他复杂且参数众多的注意力机制ECA仅需少量参数即可达到良好的效果[^2]。 #### 实现原理 ECA的核心在于其能够以高效方式捕捉跨通道间的相互作用而不依赖于降维处理。具体来说,它通过考虑每个通道以及相邻的k个邻居来构建局部跨通道关系模型。这种设计不仅简化了计算过程还提升了特征表达能力。值得注意的是,ECA可以利用一维卷积操作快速实现,其中卷积核尺寸决定了所涉及邻域的数量[k][^3]。 #### Python代码示例 以下是将ECA应用于YOLOv5中的Python代码片段: ```python import torch.nn as nn class ECALayer(nn.Module): """Constructs a ECA module. Args: channel (int): Number of channels of the input feature map k_size (int, optional): Adaptive selection of kernel size. Default: 3 """ def __init__(self, channel, k_size=3): super(ECALayer, 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) # Two different branches of ECA module 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) def add_eca_to_yolov5(model): for name, m in model.named_modules(): if isinstance(m, nn.BatchNorm2d): layers = list(m.modules()) layer_list = [] for index, l in enumerate(layers): layer_list.append(l) if type(l)==nn.Conv2d and index != len(layers)-1 : out_channels = l.out_channels layer_list.append(ECALayer(channel=out_channels)) sequential_layers = nn.Sequential(*layer_list) setattr(model,name.split('.')[-1],sequential_layers) ``` 此段代码定义了一个`ECALayer`类用于创建ECA模块,并提供了一个辅助函数`add_eca_to_yolov5()`以便轻松地向现有的YOLOv5架构中集成ECA组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kay_545

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值