YOLO11改进:如何添加GAM、CBAM、CA、ECA等注意力机制
YOLO11改进:如何添加GAM、CBAM、CA、ECA等注意力机制
YOLO11是当前最流行的实时目标检测模型之一,而注意力机制是提升模型性能的重要手段。本文将介绍如何在YOLO11中添加GAM、CBAM、CA、ECA等注意力机制,以实现模型性能的进一步提升。
一、GAM注意力机制
1.1 GAM注意力介绍
GAM(Global Attention Mechanism)是一种用于自然语言处理任务的注意力机制。该机制旨在提高模型对长文本序列的处理能力。传统的注意力机制在处理长文本时可能会受到困扰,因为它们只关注局部上下文信息。GAM通过引入一个全局注意力分布,可以更好地捕捉整个文本序列中的关键信息。
1.2 GAM核心代码
GAM的核心代码主要包含以下几个部分:
- 线性变换层(Linear)
- 激活函数(ReLU)
- 卷积层(Conv2d)
- 归一化层(BatchNorm2d)
- 门控机制(Sigmoid)
这些组件共同作用,实现对输入特征的全局注意力增强。
二、CBAM注意力机制
2.1 CBAM介绍
CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目标是通过在CNN中引入通道注意力和空间注意力来提高模型的感知能力,从而在不增加网络复杂性的情况下改善性能。
2.2 CBAM核心代码
CBAM的核心代码主要包括两个部分:
- 通道注意力模块(ChannelAttention)
- 空间注意力模块(SpatialAttention)
这两个模块通过卷积操作和激活函数实现对输入特征的注意力增强。
三、CA注意力机制
3.1 CA注意力介绍
CA注意力机制通过将位置信息嵌入到通道注意力中,来增强移动网络的性能。与通过2D全局池化将特征张量转换为单一特征向量的通道注意力不同,坐标注意力将通道注意力分解为两个1D特征编码过程,分别沿着两个空间方向聚合特征。通过这种方式可以捕捉对视觉任务至关重要的长距离依赖性。
3.2 CA注意力核心代码
CA注意力的核心代码主要包括以下几个部分:
- h_sigmoid和h_swish激活函数
- 卷积层(Conv2d)
- 归一化层(BatchNorm2d)
- 门控机制(Sigmoid)
这些组件共同作用,实现对输入特征的空间注意力增强。
四、ECA注意力机制
4.1 ECA注意力介绍
ECANet的核心思想是在卷积操作中引入通道注意力机制,以提升特征表示的能力。通道注意力机制旨在自适应地调整通道特征的权重,从而使网络能够更好地关注重要特征并抑制不重要特征。通过这种机制,ECANet有效地增强了网络的表征能力,同时避免了增加过多的参数和计算成本。
4.2 ECA核心代码
ECA的核心代码主要包括以下几个部分:
- 平均池化层(AdaptiveAvgPool2d)
- 卷积层(Conv1d)
- 门控机制(Sigmoid)
这些组件共同作用,实现对输入特征的通道注意力增强。
五、添加注意力机制
5.1 STEP1
首先需要在YOLO11的源码中创建一个新的Python包(Add-module),并在其中创建一个Attention.py文件,将上述注意力机制的代码粘贴到此文件中。
5.2 STEP2
在创建的_init_.py文件中导入增加改进模块的代码包。
5.3 STEP3
在YOLO11的task.py文件中添加对注意力机制的支持。
5.4 STEP4
在task.py文件中的def parse_model函数中添加对注意力机制的解析。
六、yaml文件与运行
以下是添加四个注意力机制在大目标层的yaml文件示例:
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
# YOLO11n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 2, C3k2, [256, False, 0.25]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 2, C3k2, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 2, C3k2, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 2, C2PSA, [1024]] # 10
# YOLO11n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)
- [-1, 1, CBAM, []] # 23 这里是在大目标检测曾层输出位置添加一个注意力机制。
# - [-1, 1, ECA, []] # 23
# - [-1, 1, GAM, []] # 23
# - [-1, 1, CoordAtt, []] # 23
- [[16, 19, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)
OK,以上就是添加四个常见注意力机制的全部过程了,后续将持续更新,尽情期待。
本文原文来自CSDN博客