YOLOv5改进系列(1)——添加SE注意力机制

前言 

从这篇开始我们进入YOLOv5改进系列。那就先从最简单的添加注意力机制开始吧!( ̄︶ ̄)↗

962f7cb1b48f44e29d9beb1d499d0530.gifYOLOv5改进系列】前期回顾:

YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析

目录

前言 

🚀一、什么是注意力机制?

🚀二、SE注意力机制原理

2.1 方法介绍

2.2 网络结构

🚀 三、添加SE注意力机制方法

3.1 添加顺序

 3.2 具体添加步骤

第①步:在common.py中添加SE模块

第②步:在yolo.py文件里的parse_model函数加入类名

第③步:创建自定义的yaml文件

第④步:验证是否加入成功

第⑤步:修改train.py中 ‘--cfg’默认参数

YOLOv5%E7%B3%BB%E5%88%97%E5%AF%BC%E8%88%AA-toc" style="margin-left:0px;">🌟本人YOLOv5系列导航

 

🚀一、什么是注意力机制?

我们先来看一张图片,这个是前段时间微博之夜的

那大家的目光更多停留在是在五个美女身上,还是在张大大身上呢 ?(大大老师骚瑞~ORZ)

同样的,不同的粉丝更加关注的对象也是不同的。 

再举几个栗子:

看人-->看脸
看文章-->看标题
看段落-->看开头
这时候大家应该大致知道注意力机制是个什么东西了吧~

原理

注意力机制其实是源自于人对于外部信息的处理能力。由于人每一时刻接受的信息都是无比的庞大且复杂,远远超过人脑的处理能力,因此人在处理信息的时候,会将注意力放在需要关注的信息上,对于其他无关的外部信息进行过滤,这种处理方式被称为注意力机制。

我用通俗的大白话解释一下:注意力呢,对于我们人来说可以理解为“关注度”,对于没有感情的机器来说其实就是赋予多少权重(比如0-1之间的小数)越重要的地方或者越相关的地方就赋予越高的权重。

作用

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

不足

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

更多关于注意力机制的讲解,欢迎大家看我的这篇文章(自认为写的还行):【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解


🚀二、SE注意力机制原理

本人的SE论文精读:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记(翻译+精读+代码复现)

本人的SE代码复现:SENet代码复现+超详细注释(PyTorch)


2.1 方法介绍

SE注意力机制(Squeeze-and-Excitation Networks)在通道维度增加注意力机制,关键操作是squeezeexcitation

通过自动学习的方式,使用另外一个新的神经网络,获取到特征图的每个通道的重要程度,然后用这个重要程度去给每个特征赋予一个权重值,从而让神经网络重点关注某些特征通道。提升对当前任务有用的特征图的通道,并抑制对当前任务用处不大的特征通道。

如下图所示,在输入SE注意力机制之前,特征图的每个通道的重要程度都是一样的,通过SENet之后,不同颜色代表不同的权重,使每个特征通道的重要性变得不一样了,使神经网络重点关注某些权重值大的通道。

2.2 网络结构

​ 

1.Ftr—传统卷积操作:对于一个C×W×H的输入X,在经过Ftr卷积操作之后,得到的输出Uc​(也就是C个大小为H×W的特征图)

2.Fsq—压缩:Fsq操作就是使用通道的全局平均池化将包含全局信息的W×H×C的特征图直接压缩成一个1×1×C的特征向量,即将每个二维通道变成一个具有全局感受野的数值,此时1个像素表示1个通道,屏蔽掉空间上的分布信息,更好的利用通道间的相关性。

3.Fex—激励:采用两个全连接层+两个激活函数组成的结构输出和输入特征同样数目的权重值,也就是每个特征通道的权重系数。

  (1)第一个FC层:ReLU (δ)

  (2)第二个FC层:Sigmoid(σ)

​ 

4.Fscale​ —权重:将Excitation输出的权重看做每个特征通道的重要性,也就是对于U每个位置上的所有H×W上的值都乘上对应通道的权值,完成对原始特征的重校准。


🚀 三、添加SE注意力机制方法

在介绍方法前我们先来回顾一下YOLOv5内一会儿要修改的文件:

models/common.py:这个文件存放着YOLOv5网络搭建常见的通用模块。如果我们需要修改某一模块,那么就需要修改这个文件中对应模块的定义。

models/yolo.py:这是YOLO的特定模块,和网络构建有关。这个文件主要由三个部分:parse_model函数、Detect类和Model类组成。其中parse_model方法是对网络结构进行整体搭建,同时起到注册common.py中各类模块的作用。
models/yolov5s.yaml(以s结构为例):网络的配置文件,models/yolo.py依据这个配置文件中的信息对整体网络进行构建。YOLOv5s网络是YOLOv5系列中深度最小,特征图的宽度最小的网络。其他的三种都是在此基础上不断加深,不断加宽。


3.1 添加顺序

(1)models/common.py    -->  加入新增的网络结构

(2)     models/yolo.py       -->  设定网络结构的传参细节,将SE类名加入其中。(当新的自定义模块中存在输入输出维度时,要使用qw调整输出维度)
(3) models/yolov5*.yaml  -->  新建一个文件夹,如yolov5s_SE.yaml,修改现有模型结构配置文件。(当引入新的层时,要修改后续的结构中的from参数)
(4)         train.py                -->  修改‘--cfg’默认参数,训练时指定模型结构配置文件


 3.2 具体添加步骤

第①步:在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)

如下图所示:


第②步:在yolo.py文件里的parse_model函数加入类名

首先找到yolo.py里面parse_model函数的这一行

 然后把SE添加到这个注册表里面


第③步:创建自定义的yaml文件

首先在models文件夹下复制yolov5s.yaml 文件,粘贴并重命名为 yolov5s_SE.yaml 

接着修改 yolov5s_SE.yaml ,将 SE加到我们想添加的位置。

注意力机制可以添加在backbone,Neck,Head等部分, 常见的有两种:一是在主干的 SPPF 前添加一层;二是将backbone中的C3全部替换。不同的位置效果可能不同,需要我们用数据集反复测试,“调参大师”就是这样诞生的~

在这里我是用第一种:将 [-1,1,SE,[1024]]添加到 SPPF 的上一层,即下图中所示位置:

这里回顾一下[from, number, module, args]四个参数含义:

  • from :   表示当前模块的输入来自那一层的输出,-1表示将上一层的输出当做自己的输入(第0层的-1表示输入的图像)。
  • number:  表示当前模块的重复次数,实际的重复次数还要由上面的参数depth_multiple共同决定,决定网络模型的深度。
  • module:  表示该层模块的名称,这些模块写在common.py中,进行模块化的搭建网络。
  • args:  表示类的初始化参数,用于解析作为 moudle 的传入参数,会在网络搭建过程中根据不同层进行改变。

这时要注意一个问题:

当在网络中添加了新的层之后,那么该层网络后续的层的编号都会发生改变,原本Detect指定的是[ 17 , 20 , 23 ]层,所以在我们添加了SE注意力层之后也要Detect对这里进行修改,即原来的17层变成了18 层;原来的20层变成了21 层;原来的23层变成了24 层;所以Detecet的from系数要改为[ 18 , 21 , 24 ] 。如下图所示:

 修改后:

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

 修改后:


第④步:验证是否加入成功

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

 然后运行yolo.py

 找到SE模块,就说明我们添加成功啦!


第⑤步:修改train.py中 ‘--cfg’默认参数

我们先找到 train.py 文件的parse_opt函数,然后将第二行‘--cfg’的 default改为'models/yolov5s_SE.yaml',然后就可以开始训练啦~


完结~撒花✿✿ヽ(°▽°)ノ✿


YOLOv5%E7%B3%BB%E5%88%97%E5%AF%BC%E8%88%AA">🌟本人YOLOv5系列导航

962f7cb1b48f44e29d9beb1d499d0530.gif​   🍀YOLOv5源码详解系列:  

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

​​​​​​YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py

YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py

YOLOv5源码逐行超详细注释与解读(4)——验证部分val(test).py

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

YOLOv5源码逐行超详细注释与解读(7)——网络结构(2)common.py

962f7cb1b48f44e29d9beb1d499d0530.gif​   🍀YOLOv5入门实践系列:  

YOLOv5入门实践(1)——手把手带你环境配置搭建

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

YOLOv5入门实践(3)——手把手教你划分自己的数据集

YOLOv5入门实践(4)——手把手教你训练自己的数据集

YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)

本文参考(感谢大佬们):

CSDN:手把手带你YOLOv5/v7 添加注意力机制(并附上30多种顶会Attention原理图)2023/2/11更新迪菲赫尔曼的博客-CSDN博客

b站:【YOLOv5 v6.1添加SE,CA,CBAM,ECA注意力机制教学,即插即用】

 


http://www.niftyadmin.cn/n/301533.html

相关文章

63.空白和视觉层级的实战应用

例如看我们之前的小网页; 这些标题的上下距离一样,这样让我们很容易对这些标题进行混淆,我们可以适当的添加一点空白 header, section {margin-bottom: 96px; }这样看上去似乎就好很多! 除此之外,如我们之间学的空…

使用binary-wang开发微信小程序的登录和微信支付

贴个官网&#xff0c;建议down下来他的源码&#xff0c;对照着开发更方便&#xff0c;因为备注很详尽。 其它不多废话了&#xff0c;我直接写步骤了。 1. Maven引入 时间2023年5月&#xff0c;目前最新版本是4.5.0 <dependency><groupId>com.github.binarywang&l…

数字信号处理4

昨天是星期天&#xff0c;休息了一天&#xff0c;今天继续学习&#xff1a; 1、连续幅度信号的量化&#xff1a; 一个数字信号是一个数字序列&#xff0c;也就是说这个数字信号就可以用有限个数字来表示。 量化&#xff1a;通过把每个样本值表示为一个有限的数字&#xff0c…

为什么程序员喜欢用Linux?

Linux哪些行业在运用&#xff1f; Linux系统运用极其广泛&#xff0c;不少用户只知道windows&#xff0c;是因为&#xff0c;Linux的运用主要是在企业端。现在科技极其发达&#xff0c;我们手机在手&#xff0c;就能干很多事情&#xff0c;只需点一点屏幕&#xff0c;轻松完成…

【致敬未来的攻城狮计划】— 连续打卡第二十五天:RA2E1的 DTC传输模式

系列文章目录 由于一些特殊原因&#xff1a; 系列文章链接&#xff1a;&#xff08;其他系列文章&#xff0c;请点击链接&#xff0c;可以跳转到其他系列文章&#xff09; 24.RA2E1的 DMAC——数据传输 文章目录 系列文章目录 前言 一、DTC是什么&#xff1f; 二、DTC内部寄存…

合肥市2023年度高校毕业生“双千培养工程”培训项目学员招募公告

为贯彻落实人社部实施促进高校毕业生等青年就业创业推进计划要求&#xff0c;提升高校毕业生就业技能&#xff0c;拟开展高校毕业生“双千培养工程”培训项目。根据工作计划安排&#xff0c;现面向高校和社会招募学员参加培训&#xff0c;培训方向为大数据应用、PythonAI人工智…

第7章链接:引言

链接&#xff08;linking&#xff09;是将各种代码和数据部分收集起来并组成称为一个单一文件的过程&#xff0c;这个文件可被加载&#xff08;或拷贝&#xff09;到存储器并执行。 链接可在如下三个阶段执行&#xff1a; 编译时&#xff08;complile time&#xff09;&#…

华为OD机试(20222023)真题目录解析和Java源码连续更新中

华为OD机试算法题新老题库练习及源码 老题库1.敏感字段加密输入描述输出描述源码和解析解析 2.IPv4地址转换成整数题目描述输入描述输出描述源码和解析解析 3.VLAN资源池题目描述输入描述输出描述源码和解析解析 4. 求字符串中所有整数的最小和题目描述输入描述输出描述源码和解…