YOLOv5改进 | 注意力机制 | 理解全局和局部信息的SE注意力机制

在深度学习目标检测领域,YOLOv5成为了备受关注的模型之一。本文给大家带来的是能够理解全局和局部信息的SE注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。


专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法

目录

1. 原理

2.YOLOv5添加SE模块

2.1 SE模块代码

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3.总结


1. 原理

论文地址:Squeeze-and-Excitation Networks点击即可跳转

官方代码:SENet官方代码地址点击即可跳转

对于CNN网络来说,核心计算是卷积算子,通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。

对于卷积操作,很大一部分改进工作是提高感受野,即空间上融合更多特征,或者是提取多尺度空间信息,如Inception网络的多分支结构。对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而MobileNet网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对channel进行分组也主要是为了使模型更加轻量级,减少计算量。

SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块,如下图所示

SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征(SENet提出Squeeze操作,将一个channel上整个空间特征编码为一个全局特征,采用global average pooling来实现),然后对全局特征进行Excitation操作(这里采用sigmoid形式的gating机制),学习各channel间的关系,得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制不重要的channel特征。另外一点是SE模块是通用的,意味着其可以嵌入到现有的网络架构中。

2.YOLOv5添加SE模块

2.1 SE模块代码

关键步骤一:将下面代码添加到 yolov5/models/common.py中

class AdaptiveAvgPool2d(_AdaptiveAvgPoolNd):def forward(self, input: Tensor) -> Tensor:return F.adaptive_avg_pool2d(input, self.output_size)class SE(nn.Module):def __init__(self, c1, c2, ratio=16):super(SE, self).__init__()# c*1*1self.avgpool = nn.AdaptiveAvgPool2d(1)self.l1 = nn.Linear(c1, c1 // ratio, bias=False)self.relu = nn.ReLU(inplace=True)self.l2 = nn.Linear(c1 // ratio, c1, bias=False)self.sig = nn.Sigmoid()def forward(self, x):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)

SE类是一种用于卷积神经网络中的注意力机制模块,旨在增强网络对输入特征的关注。它通过学习得到每个通道的权重,以自适应的方式调整特征图,从而提升网络性能。

构成部分:
1. Squeeze(压缩)阶段:
   通过全局平均池化操作将特征图压缩为一个向量,以捕获每个通道的全局特征信息。
   然后通过一个或多个全连接层对压缩后的特征向量进行变换,以获得通道相关的表示。

2. Excitation(激励)阶段:
   使用激活函数(通常是ReLU)对变换后的特征进行非线性映射,以增强模型的表达能力。
   再通过一个或多个全连接层对特征进行进一步的变换,以生成通道注意力权重。

3. Scale(缩放)阶段:
   使用Sigmoid函数将通道注意力权重归一化到0到1之间,以表示每个通道的重要性。
   将归一化后的权重乘以原始特征图,以对特征进行加权。

流程:

1. 接收输入张量x,该张量的形状为(batch_size, channels, height, width)。
2. 通过全局平均池化操作将每个通道的特征进行压缩,得到一个大小为(batch_size, channels)的全局特征向量。
3. 将全局特征向量通过一个或多个全连接层进行变换,得到每个通道的权重。
4. 对权重进行非线性变换(通常是ReLU激活函数),以增强模型的表达能力。
5. 再次通过全连接层对特征进行变换,得到每个通道的注意力权重。
6. 使用Sigmoid函数将注意力权重归一化到0到1之间,表示每个通道的重要性。
7. 将归一化后的注意力权重与原始特征图相乘,得到加权后的特征表示。
8. 返回加权后的特征张量。

目的:
SE模块的主要目的是通过自适应地调整通道的注意力权重,使模型能够更有效地捕获输入特征的重要信息,从而提高模型的性能和泛化能力。

SE类的实现包括两个主要部分:Squeeze阶段和Excitation阶段,它们共同作用于输入特征,以产生加权后的特征表示,从而增强了模型的表达能力和性能。

2.2 新增yaml文件

关键步骤二:在 /yolov5/models/ 下新建文件 yolov5_se.yaml文件并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SE, [1024]],[-1, 1, SPPF, [1024, 5]],  # 10]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 14[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 18 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 15], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 21 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 24 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

 温馨提示:因为本文只是对yolov5s基础上添加SE模块,如果要对yolov5n/l/m/x进行添加则只需要修改对应的depth_multiple 和 width_multiple。


2.3 注册模块

关键步骤三:在yolov5/models/yolo.py中注册

 大概在250行左右添加 ‘SE’

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_se.yaml的路径,如下图所示

 运行程序,如果出现下面的内容则说明添加成功🚀

我修改后的代码:链接: https://pan.baidu.com/s/1FzumcKWlHWHxJGWNQNepyQ?pwd=wikd 提取码: wikd

3.总结

SE(Squeeze-and-Excitation)模块是一种用于增强卷积神经网络特征表示的重要机制。这一模块通过引入通道注意力机制,使得网络能够自适应地调整每个通道的重要性,从而提高了模型的性能和泛化能力。

SE模块包含两个关键阶段:Squeeze阶段和Excitation阶段。在Squeeze阶段,通过全局平均池化操作将每个通道的特征压缩为一个全局特征向量,以捕获全局特征信息。在Excitation阶段,通过一系列线性变换和非线性激活函数,计算每个通道的注意力权重。这些权重用于调整原始特征图中每个通道的重要性,使得网络能够更加关注对任务有用的特征。

SE模块的工作流程如下:首先,接收输入特征张量;然后,在Squeeze阶段,通过全局平均池化操作将每个通道的特征压缩为一个全局特征向量;接着,在Excitation阶段,通过线性变换和激活函数计算每个通道的注意力权重;最后,使用这些注意力权重对原始特征进行加权,并返回加权后的特征表示。

SE模块的主要目的是通过自适应地调整每个通道的注意力权重,增强模型对输入特征的表达能力。这使得模型能够更好地捕获输入数据中的有用信息,从而提高了模型的性能和泛化能力。SE模块可以轻松地集成到各种卷积神经网络结构中,例如ResNet、Inception等,以提升它们在图像分类、目标检测、语义分割等任务中的表现。

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

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

相关文章

C语言/数据结构——每日一题(分割链表)

一.前言 今天在LeetCode觉得很不错,想和大家们一起分享这道链表题——分割链表:https://leetcode.cn/problems/partition-list-lcci废话不多说,让我们直接进入正题吧。 二.正文 1.1题目描述 1.2题目分析 大致思路:我们可以通过…

从头开始的建材类电商小程序开发指南

在当今数字化时代,小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说,开发一个属于自己的小程序商城不仅可以提升产品曝光度,还可以提供更好的用户购物体验。下面,我们将逐步教你如何开发建筑材料行业小程序。…

未来趋势系列 篇一:AI主题全景分析和股票梳理

文章目录 系列文章全景分析算力算力租赁液冷英伟达AI服务器AI芯片光模块AIPC云计算AIGC大模型KIMI、SORA、秘塔AI股票梳理系列文章 未来趋势系列 篇一:AI主题全景分析和股票梳理<

typescript 中的接口及其用途

接口&#xff1a;定义行为动作的规范 属性接口、函数类型接口、可索引接口、类类型接口、 1、属性接口 对JSON的约束 function printLabel(label: string): void {console.log(printLabel); } printLabel(字符串)function printLabel2(labelInfo: { label: string }): void {…

文章分享:《肿瘤DNA甲基化标志物检测及临床应用专家共识(2024版)》

本文摘自于《肿瘤DNA甲基化标志物检测及临床应用专家共识&#xff08;2024版&#xff09;》 目录 1. DNA甲基化标志物概述 2 DNA甲基化标志物的临床检测 2.1 临床样本前处理注意事项 2.2 DNA甲基化标志物检测技术方法 2.2.1 DNA提取与纯化 2.2.2 DNA转化 2.2.3 DNA 甲基…

Oracle 19C 传输表空间之-Windows 至 Linux

1、源端步骤&#xff08;Windows &#xff09;&#xff1a; SQL> col platform_name for a40 SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_ID; PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT CON_ID ----------- -…

翻工第二次 Ant Design Pro 下载,发现问题,电脑网络配置有误,魔法了

一、相关网址链接 鱼皮的用户中心项目 &#xff08;前端Ant Design Pro构建&#xff09; 语雀 ## 没有选择umi版本这一步 Issue #11144 ant-design/ant-design-pro GitHub 关于umi ui图标未显示问题_umi ui不出现-CSDN博客 二、存在问题 导致下载速度慢 本人镜像代码写…

关于emulate

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 enumerate() 函数的主要优势在于简化代码和提高可读性。它解决了在遍历可迭代对象时需要手动跟踪索引的问题。这在需要同时访问元素…

AI实景模型无人自动直播助手.减少商家在短视频线上卖货的成本,开启无人直播新时代!

在互联网时代&#xff0c;直播已经成为信息传播的主流方式&#xff0c;尤其是在年轻人中&#xff0c;直播更是备受追捧。然而&#xff0c;对于许多想要尝试直播的人来说&#xff0c;缺乏合适的主播可能成为一大障碍。那么&#xff0c;面对这一难题&#xff0c;如何实现手机无人…

C++ 常量

常量是指在程序运行过程中&#xff0c;其值不能被改变的量。 如&#xff1a;i255;arearr3.14; 在程序中直接使用数值有两个问题&#xff1a; 可读性差&#xff1b; 可维护差&#xff1b; 一 符号常量 C语言符号常量的顶用形式如下&#xff1a; 二 C99的const常量 C 语言co…

【C++】学习笔记——优先级队列

文章目录 十、优先级队列1. priority_queue的介绍2. 优先级队列如何使小的数据优先级高3. 仿函数介绍4. priority_queue的模拟实现 补&#xff1a; 反向迭代器未完待续 十、优先级队列 1. priority_queue的介绍 优先级队列 其实也不属于队列&#xff0c;它跟 stack 和 queue …

逗号运算符后不能和 return、break、continue 连用

【知识点】 为了简单直观&#xff0c;有的人喜欢将两条语句用逗号运算符隔开&#xff0c;写到一行。这在多数情况下&#xff0c;没有问题。但是&#xff0c;逗号运算符后不能和 return、break、continue 等连用。否则&#xff0c;就会报错&#xff1a;[Error] expected primary…

NSS刷题

1、[SWPUCTF 2021 新生赛]gift_f12 打开题目后查看源码无发现&#xff0c;用f12发现flag 2、[GDOUCTF 2023]hate eat snake 打开链接是一个贪吃蛇小游戏&#xff0c;f12找到js文件中有一个speed的语句&#xff0c;该语句的作用是使速度增加&#xff0c;因此&#xff0c;将该语…

引用数据类型 栈内存 堆内存

let m { a: 10, b: 20 }; let n m; n.a 15; console.log(m.a) // 15 原因&#xff1a;基本数据类型存储在栈内存中&#xff0c;引用数据类型存储在堆内存中 &#xff0c;引用数据类型存储在堆内存中会在栈内存中创建一个指针&#xff0c;栈内存中的这个指针指向堆内存中的地…

SpringCloud生态体系介绍

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。 SpringC…

linux上安装Jmeter环境

以前都是在Windows本机上使用界面版Jmeter&#xff0c;今天试一下安装到linux上在linux中使用&#xff0c;Jmeter的使用需要先安装jdk环境然后再配置jmeter。 1.配置环境 linux环境&#xff1a;Centos 8.2 64位 JDK版本&#xff1a;jdk-8u221-linux-x64.tar.gz &#xff08;…

数据中心法

数据中心法是实现词法分析器的结构化方法。通过设计主表和子表分开存储状态转移信息&#xff0c;实现词法分析器的控制逻辑和数据结构分离。 主要解决了状态爆炸、难以维护和复杂性的问题。 状态爆炸是指当状态和转移较多时&#xff0c;单一使用一个表来存储所有的信息的话会导…

通俗的理解网关的概念的用途(二):不同区域的网络之间的访问方式

两个不同区域的网络互相访问&#xff0c;一般可以通过一种叫做“三层”的网络设备来进行通信&#xff1a; 一、网关方式&#xff1a; 本机A(192.168.1.1)访问目标 T10&#xff08;10.10.10.10&#xff09;时&#xff0c;由于根据本地网络的设置&#xff0c;操作系统通过计算得…

UE4BeginPlay执行流程

文章目录 UE4 BeginPlay执行流程源代码UGameInstance::StartPlayInEditorGameInstance:UWorld::BeginPlayAGameModeBase::StartPlayAGameStateBase::HandleBeginPlayAWorldSettings::NotifyBeginPlayAActor::DispatchBeginPlay UE4 BeginPlay执行流程 Created with Raphal 2.3.…

算法第63天 单调栈3

84 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 def largestRectangleArea(heights):res0for i in range(len(heights)):left…