YOLOv5算法改进(5)— 添加ECA注意力机制

前言:Hello大家好,我是小哥谈。ECA注意力机制是一种用于图像处理中的注意力机制,是在通道注意力机制的基础上做了进一步的改进。通道注意力机制主要是通过提取权重,作用在原特征图的通道维度上,而ECA注意力机制则使用了一维卷积来替代全连接层,以减少计算量。这种方法在不增加过多的计算量的前提下能提升特征图的表达能力,因此被广泛应用于图像处理任务中。总的来说,ECA注意力机制是一种有效的图像注意力机制,能够进一步提升模型的性能。🌈 

前期回顾:

           YOLOv5算法改进(1)— 如何去改进YOLOv5算法

           YOLOv5算法改进(2)— 添加SE注意力机制 

           YOLOv5算法改进(3)— 添加CBAM注意力机制 

           YOLOv5算法改进(4)— 添加CA注意力机制 

           目录

🚀1.论文

🚀2.ECA注意力机制方法介绍

🚀3.添加ECA注意力机制的方法

💥💥步骤1:在common.py中添加ECA模块

​💥💥步骤2:在yolo.py文件中加入类名

​💥💥步骤3:创建自定义yaml文件 

​💥💥步骤4:修改yolov5s_ECA.yaml文件

​💥💥步骤5:验证是否加入成功

💥💥步骤6:修改train.py中的'--cfg'默认参数

🚀4.添加C3_ECA注意力机制的方法(在C3模块中添加)

💥💥步骤1:在common.py中添加ECABottleneck和C3_ECA模块

💥💥步骤2:在yolo.py文件里parse_model函数中加入类名

​💥💥步骤3:创建自定义yaml文件

​💥💥步骤4:验证是否加入成功 

​💥💥步骤5:修改train.py中的'--cfg'默认参数 

🚀1.论文

ECANet是对SENet模块的改进,提出了一种不降维的局部跨信道交互策略(ECA模块)和自适应选择一维卷积核大小的方法,从而实现了性能上的提优。在给定输入特征的情况下,SE模块首先对每个通道单独使用全局平均池化,然后使用两个具有非线性的完全连接(FC)层,然后再使用一个Sigmoid函数来生成通道权值。两个FC层的设计是为了捕捉非线性的跨通道交互,其中包括降维来控制模型的复杂性。虽然该策略在后续的通道注意模块中得到了广泛的应用,但作者的实验研究表明,降维对通道注意预测带来了副作用,捕获所有通道之间的依赖是低效的,也是不必要的。🌱

因此,提出了一种针对深度CNN的高效通道注意(ECA)模块,该模块避免了降维,有效捕获了跨通道交互的信息。🌱

论文题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks

论文地址:https://arxiv.org/abs/1910.03151

代码实现:GitHub - BangguWu/ECANet: Code for ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 


🚀2.ECA注意力机制方法介绍

ECANet的核心思想是提出了一种不降维的局部跨通道交互策略,有效避免了降维对于通道注意力学习效果的影响。适当的跨通道交互可以在保持性能的同时显著降低模型的复杂性,通过少数参数的调整,获得明显的效果增益。通过这种机制,ECANet能够在不增加过多参数和计算成本的情况下,有效地增强网络的表征能力💞

ECANet的结构主要分为两个部分:通道注意力模块嵌入式通道注意力模块

(1)通道注意力模块

通道注意力模块是ECANet的核心组成部分,它的目标是根据通道之间的关系,自适应地调整通道特征的权重。该模块的输入是一个特征图(Feature Map),通过全局平均池化得到每个通道的全局平均值,然后通过一组全连接层来生成通道注意力权重。这些权重被应用于输入特征图的每个通道,从而实现特征图中不同通道的加权组合。最后,通过一个缩放因子对调整后的特征进行归一化,以保持特征的范围。

(2)嵌入式通道注意力模块

嵌入式通道注意力模块是ECANet的扩展部分,它将通道注意力机制嵌入到卷积层中,从而在卷积操作中引入通道关系。这种嵌入式设计能够在卷积操作的同时,进行通道注意力的计算,减少了计算成本。具体而言,在卷积操作中,将输入特征图划分为多个子特征图,然后分别对每个子特征图进行卷积操作,并在卷积操作的过程中引入通道注意力。最后,将这些卷积得到的子特征图进行合并,得到最终的输出特征图。

ECANet的设计在以下几个方面具有优势:

  • 高效性:ECANet通过嵌入式通道注意力模块,在保持高效性的同时,引入了通道注意力机制。这使得网络能够在不增加过多计算成本的情况下,提升特征表示的能力。
  • 提升特征表示:通道注意力机制能够自适应地调整通道特征的权重,使得网络能够更好地关注重要的特征。这种机制有助于提升特征的判别能力,从而提升了网络的性能。
  • 减少过拟合:通道注意力机制有助于抑制不重要的特征,从而减少了过拟合的风险。网络更加关注重要的特征,有助于提高泛化能力。

总结:♨️♨️♨️

ECANet是一种高效的神经网络架构,通过引入通道注意力机制,能够有效地捕捉图像中的通道关系,提升特征表示的能力。它的结构包括通道注意力模块和嵌入式通道注意力模块,具有高效性、提升特征表示和减少过拟合等优势。通过这种设计,ECANet在图像处理任务中取得了优越的性能。


🚀3.添加ECA注意力机制的方法

💥💥步骤1:在common.py中添加ECA模块

将下面的ECA模块的代码复制粘贴到common.py文件的末尾。

class ECA(nn.Module):"""Constructs a ECA module.Args:channel: Number of channels of the input feature mapk_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 informationy = self.avg_pool(x)y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)# Multi-scale information fusiony = self.sigmoid(y)return x * y.expand_as(x)

具体如下图所示:

​💥💥步骤2:在yolo.py文件中加入类名

首先在yolo.py文件中找到parse_model函数,然后将 ECA 添加到这个注册表里。

​💥💥步骤3:创建自定义yaml文件 

models文件夹中复制yolov5s.yaml,粘贴并命名为yolov5s_ECA.yaml

​💥💥步骤4:修改yolov5s_ECA.yaml文件

本步骤是修改yolov5s_ECA.yaml,将ECA模块添加到我们想添加的位置。在这里,我将[-1,1,ECA,[1024]]添加到SPPF的上一层,即下图中所示位置。

说明:♨️♨️♨️

注意力机制可以加在Backbone、Neck、Head等部分,常见的有两种:一种是在主干的SPPF前面添加一层;二是将Backbone中的C3全部替换。

不同的位置效果可能不同,需要我们去反复测试。

这里需要注意一个问题,当在网络中添加新的层之后,那么该层网络后面的层的编号会发生变化。原本Detect指定的是[17,20,23]层,所以,我们在添加了ECA模块之后,也要对这里进行修改,即原来的17层,变成18层,原来的20层,变成21层,原来的23层,变成24层;所以这里需要改为[18,21,24]。同样的,Concat的系数也要修改,这样才能保持原来的网络结构不会发生特别大的改变,我们刚才把ECA模块加到了第9层,所以第9层之后的编号都需要加1,这里我们把后面两个Concat的系数分别由[-1,14],[-1,10]改为[-1,15][-1,11]。🌻

具体如下图所示:

​💥💥步骤5:验证是否加入成功

yolo.py文件里,将配置改为我们刚才自定义的yolov5s_ECA.yaml

​然后运行yolo.py,得到结果。

​找到了ECA模块,说明我们添加成功了。🎉🎉🎉

💥💥步骤6:修改train.py中的'--cfg'默认参数

train.py文件中找到 parse_opt函数,然后将第二行'--cfg'的default改为 'models/yolov5s_ECA.yaml',然后就可以开始进行训练了。🎈🎈🎈


🚀4.添加C3_ECA注意力机制的方法(在C3模块中添加)

上面是单独添加注意力层,接下来的方法是在C3模块中加入注意力层。这个策略是将ECA注意力机制添加到Bottleneck,替换Backbone中所有的C3模块🌳

💥💥步骤1:在common.py中添加ECABottleneck和C3_ECA模块

将下面的代码复制粘贴到common.py文件的末尾。

class ECABottleneck(nn.Module):# Standard bottleneckdef __init__(self, c1, c2, shortcut=True, g=1, e=0.5, ratio=16, k_size=3):  # ch_in, ch_out, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_, c2, 3, 1, g=g)self.add = shortcut and c1 == c2# self.eca=ECA(c1,c2)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):x1 = self.cv2(self.cv1(x))# out=self.eca(x1)*x1y = self.avg_pool(x1)y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)y = self.sigmoid(y)out = x1 * y.expand_as(x1)return x + out if self.add else outclass C3_ECA(C3):# C3 module with ECABottleneck()def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super().__init__(c1, c2, n, shortcut, g, e)c_ = int(c2 * e)  # hidden channelsself.m = nn.Sequential(*(ECABottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

💥💥步骤2:在yolo.py文件里parse_model函数中加入类名

yolo.py文件parse_model函数中,加入ECABottleneckC3_ECA这两个模块。

​💥💥步骤3:创建自定义yaml文件

按照上面的步骤创建yolov5s_C3_ECA.yaml文件,替换4个C3模块。

​💥💥步骤4:验证是否加入成功 

yolo.py文件里配置刚才我们自定义的yolov5s_C3_ECA.yaml,然后运行。 

​💥💥步骤5:修改train.py中的'--cfg'默认参数 

train.py文件中找到parse_opt函数,然后将第二行'--cfg'的default改为 'models/yolov5s_C3_ECA.yaml',然后就可以开始进行训练了。🎈🎈🎈


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/105617.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git常用操作命令(不定时更新)

git常用操作命令 将某个分支的某次提交迁移到另外一个分支查询这次提交的ID号方法一方法二 切换到目标分支执行commitID合并指令 将某个分支的某次提交迁移到另外一个分支 查询这次提交的ID号 方法一 方法二 切换到目标分支 git checkout 目标分支名 执行commitID合并指令 gi…

MySQL视图

一、视图-介绍及基本语法 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑&#xf…

mysql 、sql server trigger 触发器

sql server mySQL create trigger 触发器名称 { before | after } [ insert | update | delete ] on 表名 for each row 触发器执行的语句块## 表名: 表示触发器监控的对象 ## before | after : 表示触发的时间,before : 表示在事件之前触发&am…

mysql基础——认识索引

一、介绍 “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 二、优缺点 优势:以快速检索,减少I/O次数&am…

低代码赋能| 智慧园区项目开发痛点及解决方案

智慧园区是一个综合体,集技术开发、产业发展和学术研究于一体。作为未来智慧城市建设的核心,智慧园区充当着“产业大脑”和“指挥中心”的角色。它通过整合园区内的制造资源和第三方服务能力,实现园区各组成部分的协调运作、良性循环和相互促…

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了,修改一下 导入依赖 暂时先加…

yyyy-MM-dd‘T‘HH:mm时间格式探索

yyyy-MM-ddTHH:mm:ss 一直以后这个T是为了避免yyyy-MM-dd HH:mm:ss空格出现解析报错 但是这个T实际是一个标识符,作为小时元素的开始。 T代表后面跟着是时间,Z代表0时区(相差北京时间8小时) T 即代表 UTC(Coodinated U…

【面试】一文讲清组合逻辑中的竞争与冒险

竞争的定义:组合逻辑电路中,输入信号的变化传输到电路的各级逻辑门,到达的时间有先后,也就是存在时差,称为竞争。 冒险的定义:当输入信号变化时,由于存在时差,在输出端产生错误&…

Tokenview再度升级:全新Web3开发者APIs数据服务体验!

Tokenview发布全新版本的区块链APIs和数据服务平台,为开发者打造更强大、更便捷的开发体验! 此次升级,我们整合了开发者使用习惯以及Tokenview产品优势。我们深知对于开发者来说,时间是非常宝贵的,因此我们努力提供一…

金融市场中的机器学习;快手推出自研语言模型“快意”

🦉 AI新闻 🚀 OpenAI可能面临《纽约时报》的起诉,侵犯知识产权引发争议 摘要:OpenAI使用《纽约时报》的文章和图片来训练AI模型,违反了《纽约时报》的服务条款,可能面临巨大损失。此前,也有其…

七大出海赛道解读,亚马逊云科技为行业客户量身打造解决方案

伴随全球化带来的新机遇和国内市场的进一步趋于饱和,近几年,中国企业出海快速升温,成为了新的创业风口和企业的第二增长曲线。从范围上看,出海市场由近及远,逐步扩张。从传统的东南亚市场,到成熟的北美、欧…

【微服务学习笔记】认识微服务

【微服务学习笔记】认识微服务 单体架构 分布式架构 微服务架构 SpringCloud 服务拆分和注意事项 服务拆分的案例demo 各个服务之间的数据库都是相互独立的,你不能直接访问对方的数据库,只能从一个服务像另外一个服务发起远程调用 在订单模块的服务中 …

spark第四课

countByValue 数据源中相同的值有多少个,也就是WordCount countByKey 表的是键值对中的key出现了几次,与Value的值无关 不推荐collect,因为他是将数据放入内存,但是内存不够大的话,就容易崩,所以使用saveAsTextFile更好,直接放入磁盘. 保存成对象文件,需要序列化 启动了2个 J…

Android Studio升级到Android API 33版本后,XML布局输入没有提示

低版本的Android Studio升级到Android API 33版本后,XML布局输入没有提示。查一下我目前使用的Android Studio 是2021年发布,而Android API 33是2022年发布的,这是由低版本升级到高版本造成不兼容的问题。解决方法有两种: 第一种…

多维时序 | MATLAB实现SCNGO-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现SCNGO-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SCNGO-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现SCNGO-BiGRU-Attention多变量时间序列预测。 模型描述…

idea切换Git分支时保存未提交的文件

解决方案 我们现在有三个分支,如下图: 我们目前在tenant分支上进行开发,需要去修复master的Bug,假设我们在tenant分支上修改了一个文件,如下图: 方法一:使用Shelve Changes 1、选中tenant上你不…

NineData通过AWS FTR认证,打造安全可靠的数据管理平台

近日,NineData 作为新一代的云原生智能数据管理平台,成功通过了 AWS(Amazon Web Service)的 FTR 认证。NineData 在 FTR 认证过程中表现出色,成功通过了各项严格的测试和评估,在数据安全管理、技术应用、流…

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是适用于BLDC、PMSM和ACIM电机控制应用的高性能解决方案。这些MCU采用运行频率为100MHz/120MHz、带数字信号处理 (DSP) 和浮点单元 (FPU) 的ARM Cortex-M4内核。KV3x MCU配备两个采样率高达1.2MS/s的16位ADC、多个控制定时器以及512KB闪存。 …

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度: 76 / 4 19 第五次迭代结束速度: (76 24 ) / 5 100 / 5 20

基于单片机串口控制直流电机调速

一、系统方案 (2)本设计采用STC89C5单片机作为主控器,串口控制直流电机调速,串口助手发送1-8,改变电机速度,数码管显示对应速度。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 TMOD0x21;//定…