在深度学习目标检测领域,YOLOv5已成为备受关注的模型之一。本文介绍了如何添加高效的通道注意力机制ECA到YOLOv5模型中。首先解释了ECA的主要原理,然后提供了逐步的代码添加和修改指南,以便读者能够轻松地实践。最后,完整的修改后的代码也被提供,使读者能够一键运行,并在实践中更好地理解YOLO系列目标检测的挑战和改进。
目录
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能够学习更具判别性的特征,从而实现在各种计算机视觉任务中的更好的泛化和性能。

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注意力机制可以有效提升深度神经网络在大规模图像数据处理任务中的性能,特别是在涉及大规模图像数据的任务中,它展现了出色的性能和效率。