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

news2024/11/20 13:28:01

在深度学习目标检测领域,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*1
        self.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.coloradmin.cn/o/1661628.html

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

相关文章

多模态模型Mini-Gemini:代码模型数据均开源,MiniCPM小钢炮2.0全家桶四连发,可以在Android 手机端上运行的大模型,效果还不错

多模态模型Mini-Gemini:代码模型数据均开源,MiniCPM小钢炮2.0全家桶四连发,可以在Android 手机端上运行的大模型,效果还不错。 多模态模型Mini-Gemini:代码模型数据均开源 香港中文大学终身教授贾佳亚团队提出多模态模…

印象笔记使用技巧

印象笔记使用技巧 印象笔记(Evernote)是一款非常流行的笔记软件,它为用户提供了一个方便的平台来记录、整理和管理各种信息。无论是个人生活还是工作场景,印象笔记都可以帮助用户提高效率、整理思绪、轻松查找信息。下面是一些印象…

gpustat 不能使用问题

突然间就不能用了,可能是环境出了问题,如果GPU没问题的话,那么换个环境重新安装试一下(pip install gpustat),目前是换个环境就可以了(做个笔记)

Mapreduce | 案例

根据提供的数据文件【test.log】 数据文件格式:姓名,语文成绩,数学成绩,英语成绩 完成如下2个案例: (1)求每个学科的平均成绩 (2)将三门课程中任意一门不及格的学生过滤出来 (1)求每…

DVWS靶场全总结(详细)--主要用来复习(暂未完善,累了大体框架已成)

目录 一、环境安装 二、开始闯关 2.1暴力破解 2.1.1 low: 2.1.2 medium: 2.2命令注入 2.2.1 low: ​编辑​编辑 2.2.2 medium: 2.3跨站请求伪造(CSRF) 2.3.1 low: 2.3.2 medium: 2.4文件包含漏洞 2.4.1 low: 2.4.2 medium: 2.…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表,它遵循先进先出(FIFO)的原则。在队列中,只允许在表的一端进行插入操作(队尾),而在另一端进行删除操作(队头)。这种数据结构确保了最…

【栈】Leetcode 比较含退格的字符串

题目讲解 844. 比较含退格的字符串 算法讲解 使用栈模拟,但遇到#字符就让栈顶元素出栈,但是在写的过程中有两点需要注意:当#出现在第一个位置,需要特殊处理一下;当栈为空的时候,还出现#字符需要特殊处理…

普通人可以抓住黄金价格大涨的投资机会吗?

黄金价格的波动对于投资者来说,总是充满了诱惑和挑战。近期,全球经济形势变化多端,地缘政治冲突频发,这些因素无不对黄金市场造成影响,使得黄金价格出现大幅波动。那么,作为普通人,能否抓住黄金…

会赚钱的人都在做这件事:你了解吗?

在我们日常生活的点滴中,以及在各种场合的交互中,利他思维始终扮演着不可或缺的角色。当我们追求合作与共赢时,单方面的自我立场显然是不够的,真正的关键在于换位思考,寻找并满足对方的需求。 互利互赢的核心理念正是利…

centos安装mysql-client

直接安装: yum install mysql-community-client报了错误No package mysql-community-client available. 原因:CentOS/RHEL系统默认的软件源中并不包含MySQL软件包,需要通过添加第三方存储库来获取MySQL相关软件 添加源 安装MySQL官方的Yum…

【智能优化算法】白鲨智能优化算法(White Shark Optimizer,WSO)

白鲨智能优化算法(White Shark Optimizer,WSO)是期刊“KNOWLEDGE-BASED SYSTEMS”(中科院一区期刊 IF8.6)的2022年智能优化算法 01.引言 白鲨智能优化算法(White Shark Optimizer,WSO)的核心理念和基础灵感来自大白鲨的行为,包括它们在导航和…

关于Ardupilot的固定翼(plane)的控制

起因 由于项目原来是使用的四旋翼,并且是PX4版本的四旋翼; 如今需要对无人机固定翼进行控制,并要求使用Ardupilot的固件进行研究。 特定在此记录对固定翼的学习,以和大家分享观点和交流学习。 PX4和Ardupilot关系 PX4和Ardupilot都是固件,固件就是软件的意思。两者都是…

Amesim基础篇-热仿真常用模型库-Air Conditioning-Pipes

前言 基于上文对空调库各个元件的介绍,本文进一步将其中的管路展开。 管路介绍 1 摩擦阻力管(R): 具有阻力特性的管路,通过管长以及管截面计算阻力。 2 可调节阻力管(R): 只具有…

进一步解读英伟达 Blackwell 架构、NVlink及GB200 超级芯片

2024年3月19日,英伟达CEO黄仁勋在GTC大会上公布了新一代AI芯片架构BLACKWELL,并推出基于该架构的超级芯片GB200,将助推数据处理、工程模拟、电子设计自动化、计算机辅助药物设计、量子计算和生成式 AI 等领域。 为了纪念杰出的数学家David H…

设计合理的IT运维服务目录:打造高效运维的蓝图

在数字化转型的浪潮中,一个设计合理、内容详尽的IT运维服务目录是连接服务提供者与消费者之间的桥梁,它不仅体现了服务设计的专业性,还直接影响着运维效率和服务质量。如何设计出既合理又高效的IT运维服务目录?让我们结合ITIL 4框…

赣红孵联合卫东街道未保站开展未成年人保护法散落在每个角落活动

为进一步提高家长的法治意识,依法保障未成年人的合法权益,全力构建安全和谐文明家庭,5月8日,赣红孵社会组织培育中心联合卫东街道未成年人保护站在在南师附小红谷滩校区实验小学开展“未成年人保护法散落在每个角落”未成年人普法…

浅谈云计算资源和服务

目录 前言 正文 专有名词及其首字母缩写 轻量级应用服务器 云服务器ECS 专有网络VPC 其他类服务 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University o…

上海晋名室外危废暂存间助力科教产业危废品安全储存

本周又有两台SAVEST室外危废暂存间项目成功验收交付使用,此次项目主要用于用户园区内固废、废液等危废品室外暂存安全。 用户单位在日常工作运营中涉及到园区内固废、废液等危废品的室外安全储存问题,用户在寻找解决方案的过程中搜索到上海晋名的室外暂…

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的,有特殊作用的一些单词,不可以把这些单词作为标识符来使用。 注意:关键字是java用了的,我们就不能用来作为:类名、变量名、否则会报错。 标识符: 标识符就是…

2024C题生物质和煤共热解问题的研究 详细思路

背景 随着全球能源需求的不断增长和对可再生能源的追求,生物质和煤共热解作为一种潜在的能源转化技术备受关注。生物质是指可再生能源,源自植物和动物的有机物质,而煤则是一种化石燃料。** 在共热解过程中,生物质和煤在高温和缺氧…