本文介绍:本专栏文章不会讲太复杂的定义,将从小白的角度去进行讲解,为大家节省时间,高效去做实验,文章将会简单介绍一下相关模块(也会附带相关论文链接,有兴趣可以阅读,可以作为论文文献),本专栏主要专注于YOLO改进实战!适用于小白入门也可以水论文,大佬跳过!!!
文章适用人群:研一、准研究生(研0)、少部分本科生、着急毕业水论文的各位
更新时间:每天1~3篇左右,本专栏文章至少50+篇,如果需要单独设计可以联系我,咨询一下
售后:购买专栏后在运行时有问题直接私聊我,大部分都是环境配置问题,我会录教程带大家配置,保证代码畅通无阻!
新专栏福利:帮助入门小白缝合模块,创新模块(先到先得,名额有限,论文从此不缺创新点)!
专栏通知:专栏文章大于20篇时将涨价,早买有优惠,感谢各位读者支持!(更新时间:2024/12/01)
目录
一、将主角“CoTAttention”加入到YOLO大家庭(代码)中
“ECA注意力机制”同学简介
个人简介:
大家好!我是 ECA 注意力机制。我就像个超酷的信息导航员,在数据的海洋里,能迅速锁定关键信息,给重要的特征戴上“聚光灯”,让它们闪亮登场,把那些无关紧要的“小透明”信息往后放放,从而帮神经网络这个大团队把活儿干得更漂亮、更高效!
一、将主角“ECA注意力机制”加入到YOLO大家庭(代码)中
ECA代码展示:
#-------------------ECA---------------------#
from torch.nn import init
# 定义ECA注意力模块的类
class ECAAttention(nn.Module):
def __init__(self, kernel_size=3):
super().__init__()
self.gap = nn.AdaptiveAvgPool2d(1) # 定义全局平均池化层,将空间维度压缩为1x1
# 定义一个1D卷积,用于处理通道间的关系,核大小可调,padding保证输出通道数不变
self.conv = nn.Conv1d(1, 1, kernel_size=kernel_size, padding=(kernel_size - 1) // 2)
self.sigmoid = nn.Sigmoid() # Sigmoid函数,用于激活最终的注意力权重
# 权重初始化方法
def init_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
init.kaiming_normal_(m.weight, mode='fan_out') # 对Conv2d层使用Kaiming初始化
if m.bias is not None:
init.constant_(m.bias, 0) # 如果有偏置项,则初始化为0
elif isinstance(m, nn.BatchNorm2d):
init.constant_(m.weight, 1) # 批归一化层权重初始化为1
init.constant_(m.bias, 0) # 批归一化层偏置初始化为0
elif isinstance(m, nn.Linear):
init.normal_(m.weight, std=0.001) # 全连接层权重使用正态分布初始化
if m.bias is not None:
init.constant_(m.bias, 0) # 全连接层偏置初始化为0
# 前向传播方法
def forward(self, x):
y = self.gap(x) # 对输入x应用全局平均池化,得到bs,c,1,1维度的输出
y = y.squeeze(-1).permute(0, 2, 1) # 移除最后一个维度并转置,为1D卷积准备,变为bs,1,c
y = self.conv(y) # 对转置后的y应用1D卷积,得到bs,1,c维度的输出
y = self.sigmoid(y) # 应用Sigmoid函数激活,得到最终的注意力权重
y = y.permute(0, 2, 1).unsqueeze(-1) # 再次转置并增加一个维度,以匹配原始输入x的维度
return x * y.expand_as(x) # 将注意力权重应用到原始输入x上,通过广播机制扩展维度并执行逐元素乘法
使用步骤:
- 找到并打开“YOLOv8\ultralytics-main\ultralytics\nn\modules\block.py”文件,在箭头位置添加ECA模块,如图1
- 复制上面提供的ECA代码粘贴进block.py的64行(你们的不一定是56行,注意附近内容),如图2
- 在包结构中导入ECA类,注意看,这步最容易错,图中有详解,如图3和图4
- 找到task.py导入你的新模块,task.py位置和模块导入方法,如图5
- 编写parse_model函数,首先你需要按住Ctrl和F,搜索def parse_model并跳转到这个函数的定义,然后开始往下滑找到如图6所示的位置(行数不一定相同,注意周围内容),并且在图示位置比着图6添加相关内容(直接复制粘贴下面代码块的内容到图中位置)
#----------------------ECA---------------------------#
elif m is ECAAttention:
c1 = ch[f]
图示教程:
图1(上图)
图2(上图)
图3(上图)
图4(上图)
图5(上图)
图6(上图)
二、模型文件中加入ECA注意力机制
步骤:
- 如图7所示,在相应位置创建ADD文件夹(用于存放新建的模型文件)和yolov11-ECA.yaml模型文件
- 复制下面yolov11-ECA.yaml文件内容到新建的yolov11-ECA.yaml文件中并保存。
图7(上图)
yolov8-CoTAttention.yaml文件内容如下:
# Ultralytics YOLO
标签:初始化,nn,ECA,self,init,维度,机制,注意力
From: https://blog.csdn.net/mywhyyds/article/details/144173595