首页 > 其他分享 >YOLOv11原创改进专栏|注意力机制篇|ECA注意力机制手把手添加教程

YOLOv11原创改进专栏|注意力机制篇|ECA注意力机制手把手添加教程

时间:2024-12-01 20:32:17浏览次数:10  
标签:初始化 nn ECA self init 维度 机制 注意力

本文介绍:本专栏文章不会讲太复杂的定义,将从小白的角度去进行讲解,为大家节省时间,高效去做实验,文章将会简单介绍一下相关模块(也会附带相关论文链接,有兴趣可以阅读,可以作为论文文献),本专栏主要专注于YOLO改进实战!适用于小白入门也可以水论文,大佬跳过!!!

文章适用人群:研一、准研究生(研0)、少部分本科生、着急毕业水论文的各位

更新时间:每天1~3篇左右,本专栏文章至少50+篇,如果需要单独设计可以联系我,咨询一下

售后:购买专栏后在运行时有问题直接私聊我,大部分都是环境配置问题,我会录教程带大家配置,保证代码畅通无阻!

新专栏福利:帮助入门小白缝合模块,创新模块(先到先得,名额有限,论文从此不缺创新点)!

专栏通知:专栏文章大于20篇时将涨价,早买有优惠,感谢各位读者支持!(更新时间:2024/12/01)

目录

“CoTAttention”同学简介

一、将主角“CoTAttention”加入到YOLO大家庭(代码)中

二、模型文件中加入CoTAttention注意力机制

三、直接开跑

四、附赠CoTAttention(改进版)效果好可做创新点

总结


“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上,通过广播机制扩展维度并执行逐元素乘法
    

使用步骤: 

  1. 找到并打开“YOLOv8\ultralytics-main\ultralytics\nn\modules\block.py”文件,在箭头位置添加ECA模块,如图1
  2. 复制上面提供的ECA代码粘贴进block.py的64行(你们的不一定是56行,注意附近内容),如图2
  3. 在包结构中导入ECA类,注意看,这步最容易错,图中有详解,如图3和图4
  4. 找到task.py导入你的新模块,task.py位置和模块导入方法,如图5
  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注意力机制

步骤:

  1. 如图7所示,在相应位置创建ADD文件夹(用于存放新建的模型文件)和yolov11-ECA.yaml模型文件
  2. 复制下面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

相关文章

  • Python 元类机制的工作流程及参数调用的不同
    classMymeta(type):def__new__(cls,name,bases,dct):print(f'Mymeta.__new__:cls={cls},id(cls)={id(cls)}')returnsuper().__new__(cls,name,bases,dct)def__init__(cls,name,bases,dct):print(f'Mymet......
  • 【page cache】回写机制
    writeback回写bufferIO通过pagecache进行缓存,减少对底层存储设备的直接读写,同时能够提高整体性能写入到pagecache的数据不会立刻写入后端设备,而是标记为“脏”,并被加入到脏页链表,后续由内核中的回写进程周期性的将脏页写回到底层存储设备下面主要分析pagecache回写......
  • HashMap 的扩容机制
    目录一、HashMap基本架构概览二、扩容机制全解析负载因子扩容阈值扩容操作步骤详解三、代码实例呈现四、总结与启示在Java的世界里,HashMap占据着极为重要的一席之地。它依托哈希表来构建,这种设计使得其在插入、删除以及查找操作上能够展现出相当快速的效率。不过......
  • 多头注意力机制:从原理到应用的全面解析
    目录什么是多头注意力机制?原理解析1.注意力机制的核心公式2.多头注意力的扩展为什么使用多头注意力?实际应用1.Transformer中的应用2.NLP任务3.计算机视觉任务PyTorch实现示例总结        近年来,“多头注意力机制(Multi-HeadAttention,MHA)”成为深......
  • 流水线并行,重计算:GPipe;1F1B(一前一后)调度机制
    目录GPipe一、GPipe的背景与目的二、GPipe的功能与特点三、GPipe的应用与效果四、GPipe的开源与可扩展性1F1B(一前一后)调度机制一、背景与基本概念二、1F1B调度机制的要求三、应用与挑战GPipe是一个基于Lingvo(Lingvo是Google基于TensorFlow二次开发的,重点针对序列......
  • MySQL原理简介—5.存储模型和数据读写机制
    MySQL原理简介—5.存储模型和数据读写机制大纲1.为什么不能直接更新磁盘上的数据2.为什么要引入数据页的概念3.一行数据在磁盘上是如何存储的4.一行数据中的NULL值是如何处理的5.一行数据的数据头存储的是什么6.一行数据的真实数据如何存储7.数据在物理存储时的行溢出......
  • 深入了解 Eureka:微服务中的服务发现机制
    什么是Eureka?Eureka是Netflix开源的一个服务注册与发现工具,专为云原生架构设计。Eureka分为两个主要部分:EurekaServer:服务注册中心,负责管理所有服务实例的注册信息。EurekaClient:服务消费者和服务提供者都通过它与EurekaServer通信,用于注册自身服务或获取其他......
  • 【Chapter 6】Machine Learning time series Case_Monthly sales forecast analysis-H
    文章目录1、Holt-Wintersalgorithm(1)additivemodel(2)Multiplicationmodel(3)Dampingtrend2、AdvantagesanddisadvantagesofHoltWintersalgorithmAdvantagesdisadvantages3、ComparisonofalgorithmimplementationbetweenPythoncodeandSentosa_DS......
  • hint: Updates were rejected because the tip of your current branch is behind!
    问题本地仓库往远段仓库推代码时候提示:error:failedtopushsomerefsto'192.168.2.1:java-base/java-cloud.git'hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehind!   refs/heads/master:refs/heads/master   [rejected](non-fa......
  • Qt运行生成的exe报错“This application failed to start because no Qt platform plu
    Qt运行生成的exe报错“ThisapplicationfailedtostartbecausenoQtplatformplugincouldbeinitialized.Reinstallingtheapplicationmayfixthisproblem.”报错复现将exe复制一份至单独文件夹中,直接运行会发现报错缺少一些dll去Qt根目录D:\QT\Qt\5.15.0\mingw8......