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

news2025/1/11 19:40:45

前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。注意力机制可被应用于模型的不同层级,以便更好地捕捉图像中的细节和特征,这种模型在计算资源有限的情况下,可以实现更好的性能和效率。本文就给大家讲解如何在YOLOv5模型中添加SE注意力机制。🌈 

前期回顾:

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

          目录

🚀1.什么是注意力机制?

🚀2.SE注意力机制原理

💥💥2.1 方法介绍

💥💥2.2 网络结构

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

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

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

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

💥💥步骤4:修改yolov5s_SE.yaml文件

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

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

🚀1.什么是注意力机制?

注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。上述机制通常被称为注意力机制。人类视网膜不同的部位具有不同程度的信息处理能力,即敏锐度(Acuity),只有视网膜中央凹部位具有最强的敏锐度。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后集中关注它。例如,人们在阅读时,通常只有少量要被读取的词会被关注和处理。🌴

综上,注意力机制主要有两个方面:决定需要关注输入的哪部分;分配有限的信息处理资源给重要的部分。📚

作用:♨️♨️♨️

  • 提高模型的准确性:注意力机制可以帮助模型更好地关注重要的信息,从而提高模型的准确性。
  • 模型解释性更强:注意力机制可以让模型更好地解释其决策过程,从而提高模型的可解释性。
  • 可以处理不定长的序列数据:注意力机制可以处理不定长的序列数据,比如文本数据、语音数据等。

不足:♨️♨️♨️

  • 计算量大:注意力机制需要计算每个位置的权重,因此计算量较大,训练时间较长。
  • 可能出现过拟合:如果注意力机制的权重过于复杂,可能会导致过拟合的问题。
  • 可能需要更多的数据:注意力机制需要更多的数据来训练和优化,否则可能会出现欠拟合的问题。

🚀2.SE注意力机制原理

💥💥2.1 方法介绍

SENet是由Momenta和牛津大学的胡杰等人提出的一种新的网络结构,目标是通过显式的建模卷积特征通道之间的相互依赖关系来提高网络的表示能力。在2017年最后一届 ImageNet 比赛classification任务上获得第一名。SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块🌴

SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。🌻

优点:
可以通过学习自适应的通道权重,使得模型更加关注有用的通道信息。
缺点:
只考虑了通道维度上的注意力,无法捕捉空间维度上的注意力,适用于通道数较多的场景,但对于通道数较少的情况可能不如其他注意力机制。

说明:♨️♨️♨️

论文地址:Squeeze-and-Excitation Networks

代码地址:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Networks 

💥💥2.2 网络结构

如下图所示,为SENet结构图

步骤1:squeeze操作,将各通道的全局空间特征作为该通道的表示,形成一个通道描述符;

步骤2:excitation操作,学习对各通道的依赖程度,并根据依赖程度的不同对特征图进行调整,调整后的特征图就是SE block的输出。

​​


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

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

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

class SE(nn.Module):
    def __init__(self, c1, c2, r=16):
        super(SE, self).__init__()
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.l1 = nn.Linear(c1, c1 // r, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.l2 = nn.Linear(c1 // r, c1, bias=False)
        self.sig = nn.Sigmoid()
    def forward(self, x):
        print(x.size())
        b, c, _, _ = x.size()
        y = self.avgpool(x).view(b, c)
        y = self.l1(y)
        y = self.relu(y)
        y = self.l2(y)
        y = self.sig(y)
        y = y.view(b, c, 1, 1)
        return x * y.expand_as(x)

复制粘贴后,如下图所示:

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

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

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

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

💥💥步骤4:修改yolov5s_SE.yaml文件

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

说明:♨️♨️♨️

注意力机制可以加在Backbone、Neck、Head等部分,常见的有两种:一种是在主干的SPPF前面添加一层;二是将Backbone中的C3全部替换。不同的位置效果可能不同,需要我们去反复测试。

这里需要注意一个问题,当在网络中添加新的层之后,那么该层网络后面的层的编号会发生变化。原本Detect指定的是[17,20,23]层,所以,我们在添加了SE模块之后,也要对这里进行修改,即原来的17层,变成18层,原来的20层,变成21层,原来的23层,变成24层;所以这里需要改为[18,21,24],具体如下图所示:

修改之后变为:

同样的,Concat的系数也要修改,这样才能保持原来的网络结构不会发生特别大的改变,我们刚才把SE加到了第9层,所以第9层之后的编号都需要加1,这里我们把后面两个Concat的系数分别由[-1,14][-1,10]改为[-1,15][-1,11]。具体如下图所示。

修改后即变为:

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

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

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

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

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

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode_动态规划_困难_1388.3n 块披萨

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选任意一块披萨。Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。…

使用metasploit(MSF)对windows的ms17-010漏洞进行利用

主机发现 Ping扫描-禁用端口扫描 nmap -sn 192.168.1.0/24 ─# nmap -sn 192.168.1.0/24 Starting Nmap 7.93 ( https://nmap.org ) at 2023-08-14 10:00 EDT Nmap scan report for 192.168.1.1 Host is up (0.0053s latency). MAC Address: FC:BC:D1:C7:2F:A8 (Huawei Te…

SystemVerilog interface使用说明

1. Interface概念 System Verilog中引入了接口定义,接口与module 等价的定义,是要在其他的接口、module中直接定义,不能写在块语句中,跟class是不同的。接口是将一组线捆绑起来,可以将接口传递给module。 2. 接口的优…

Mysql性能优化:什么是索引下推?

导读 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎…

同一个区域多景影像使用同一个拉伸色带显示

问题描述 现需要对11景某一个区域的NDVI数据进行出图,且需要使用同一个拉伸的色带,但是拉伸色带的间断值是根据影像的直方图确定的,意味着11景影像会有11个不同的拉伸色带,不符合需求。 解决方法 目前想到的解决方法就是将11景…

稚晖君人形机器人问世:大模型加持,会自己换胳膊,要上生产线造车

从零开始,不到半年就造出人形机器人,还自带软硬件体系。 大模型技术的新一波浪潮:具身智能,已经有了重要进展。 刚刚,稚晖君的创业公司「智元机器人」开了自己的第一场发布会。 以「天才少年」身份加入华为的稚晖君(彭志辉)于去年底宣布离职创业,人们都在关注他在机器…

类的访问限定符,实例化,对象存储方式,this指针

目录 类的定义 类的两种定义方式: 访问限定符 类的实例化 类对象的存储方式 this指针 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语…

c++11 标准模板(STL)(std::basic_stringbuf)(七)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbu…

SRE方法论之服务质量目标

为了量化客户对服务可靠性的期望&#xff0c;找到客户对可靠性满意的点&#xff0c;我们需要制定针对用户的服务质量目标&#xff0c;并且努力去达到这个质量目标。在这个过程中&#xff0c;我们需要定义一些服务质量指标&#xff08;SLI&#xff09;、服务质量目标&#xff08…

上半年巴比食品增收不增利,下半年失速的团餐业务能否“复苏”?

随着生活节奏逐渐加快&#xff0c;“宅经济”和“懒人经济”快速融合&#xff0c;人们对进餐便利性的要求逐渐提高&#xff0c;更适用于居家消费的食品应运而生&#xff0c;这其中速冻面点既便于烹饪&#xff0c;又方便快捷&#xff0c;因此其率先出圈获得了消费者青睐&#xf…

SparkSQL源码分析系列03-Antlr4分析测试

SparkSQL主要通过Antlr4定义SQL的语法规则&#xff0c;完成SQL词法&#xff0c;语法解析&#xff0c;最后将SQL转化为抽象语法树。所以有必要先了解下Antlr4的工作流程。 ANTLR4是什么&#xff1f; ANTLR 是 ANother Tool for Language Recognition 的缩写&#xff0c;官网&a…

Python:逢七拍腿游戏

场景模拟&#xff1a; 通过在 for 循环中使用 continue 语句实现计算拍腿次数&#xff0c;即计算从1到100&#xff08;不包括100&#xff09;&#xff0c;一共有多少个尾数为7或7的倍数这样的游戏&#xff0c;代码如下&#xff1a; total 99 # 记…

解读李子园2023上半年财报:营收净利双增,未来持续聚焦大单品?

时至今日&#xff0c;饮料界已经分化出了诸多新品类&#xff0c;无糖气泡水、功能饮料、碳酸饮料、茶饮料、含乳饮料等等层出不穷&#xff0c;令人眼花缭乱。这一现象促使全行业产品都在向多样化转变&#xff0c;其中乳制品的结构分化尤为明显。 然而&#xff0c;身处“局中”…

AB跳转轮询:让你的独立站收款智能化

独立站在近两年成为跨境电商的热门布局之一&#xff0c;特别是在亚马逊封号潮后&#xff0c;许多卖家开始转向独立站运营。然而&#xff0c;在迅速发展的同时&#xff0c;也不可避免地出现了一些问题&#xff0c;比如很多卖家的资金经常被不同程度地冻结&#xff0c;好不容易出…

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…

GNN学习笔记

GNN b站课程跳转------->>>>> 【不愧是公认最好的【图神经网络GNN/GCN教程】&#xff0c;从基础到进阶再到实战&#xff0c;一个合集全部到位&#xff01;-人工智能/神经网络/图神经网络/深度学习。】 https://www.bilibili.com/video/BV1184y1x71H/?share_so…

【C#】条码管理操作手册

前言&#xff1a;本文档为条码管理系统操作指南&#xff0c;介绍功能使用、参数配置、资源链接&#xff0c;以及异常的解决等。思维导图如下&#xff1a; 一、思维导图 二、功能操作–条码打印&#xff08;客户端&#xff09; 2.1 参数设置 功能介绍&#xff1a;二维码图片样…

ELF文件格式分析(一)

目录 一、ELF 格式介绍二、ELF组成部分2.1) ELF Header2.2) Program Headers2.3&#xff09;Section Headers Table2.3.2&#xff09; Section 此篇文章介绍了ELF文件由哪些部分组成&#xff0c;他们的功能是什么&#xff0c;并在文章末尾给出了一份ELF文件解析的参考资料。 一…

通达信袋鼠尾形态选股公式,也称手指线

在《以交易为生》这本书中&#xff0c;作者埃尔德提到“袋鼠尾”形态&#xff08;也称“手指线”&#xff09;&#xff0c;这是作者比较认可的图表信号&#xff0c;很有吸引力&#xff0c;也容易辨认。 袋鼠靠尾巴推动前进&#xff0c;跳跃方向和它的尾巴方向相反&#xff0c;…

Docker容器监控系统

目录 简化描述 Cadvisor InfluxDBGrafana 监控组件架构图 部署 安装docker-ce 阿里云镜像加速器 下载组件镜像 创建自定义网络 创建influxdb容器 创建granafa容器 简化描述 Docker作为目前十分出色的容器管理技术&#xff0c;得到大量企业的青睐&#xff0c;在生产环…