【YOLOv5进阶】——引入注意力机制-以SE为例

news2024/10/6 22:23:16

声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载!

一、站在巨人的肩膀上

SE模块即Squeeze-and-Excitation 模块,这是一种常用于卷积神经网络中的注意力机制!!

借鉴代码的代码链接如下:

注意力机制-SEicon-default.png?t=N7T8https://github.com/ZhugeKongan/Attention-mechanism-implementation

需要model里面的SE_block.py文件

# -*- coding: UTF-8 -*-
"""
SE structure

"""

import torch.nn as nn  # 导入PyTorch的神经网络模块  
import torch.nn.functional as F  # 导入PyTorch的神经网络功能函数模块  
  
class SE(nn.Module):  # 定义一个名为SE的类,该类继承自PyTorch的nn.Module,表示一个神经网络模块  
  
    def __init__(self, in_chnls, ratio):  # 初始化函数,in_chnls表示输入通道数,ratio表示压缩比率  
        super(SE, self).__init__()  # 调用父类nn.Module的初始化函数  
  
        # 使用AdaptiveAvgPool2d将输入的空间维度压缩为1x1,即全局平均池化  
        self.squeeze = nn.AdaptiveAvgPool2d((1, 1))  
  
        # 使用1x1卷积将通道数压缩为原来的1/ratio,实现特征压缩  
        self.compress = nn.Conv2d(in_chnls, in_chnls // ratio, 1, 1, 0)  
  
        # 使用1x1卷积将通道数扩展回原来的in_chnls,实现特征激励  
        self.excitation = nn.Conv2d(in_chnls // ratio, in_chnls, 1, 1, 0)  
  
    def forward(self, x):  # 定义前向传播函数  
        out = self.squeeze(x)  # 对输入x进行全局平均池化  
        out = self.compress(out)  # 对池化后的输出进行特征压缩  
        out = F.relu(out)  # 对压缩后的特征进行ReLU激活  
        out = self.excitation(out)  # 对激活后的特征进行特征激励  
  
        # 对激励后的特征应用sigmoid函数,然后与原始输入x进行逐元素相乘,实现特征重标定  
        return x*F.sigmoid(out)

代码后面有附注的注释(GPT解释的,很好用),理解即可。对于使用者来说,重要关注点还是它的输入通道、输出通道、需要传入的参数等!!这个函数整体传入in_chnls, ratio两个参数。


二、开始修改网络结构

与上节的C2f修改基本流程一致,但稍有不同

  • model/common.py加入新增的SE网络结构,直接复制粘贴如下,这里加在了上节的C2f之前:

上面说到这个函数整体传入in_chnls, ratio两个参数!!


  • model/yolo.py设定网络结构的传参细节

上期的C2f模块之所以可以参照原本存在的C3模块属性,是因为两者相似,但这里的SE模块就不可简单的在C3x后加SE,而是需要在下面加入一段elif代码:

         elif m is SE:
            c1 = ch[f]
            c2 = args[0]
            if c2 != no:  # if not output
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, args[1]]

当新引入的模块中存在输入输出维度时,需要使用gw调整输出维度!!


  • model/yolov5s.yaml设定现有模型结构配置文件

老样子,复制一份新的配置文件命名为yolov5s-se.yaml。首先需要在backbone的最后加上SE模块(相当于多了一层为第10层);其次考虑到backbone里多了一层,且在head里的输入层来源不止上一层(-1)一个,所以输入层来源大于等于第10层的都需要改为往后递推+1层。下图左边为原始的yaml配置文件,右侧为修改后的:

当yaml文件引入新的层后,需要修改模型结构的from参数(上期是将C3替换为C2f模块,所以不涉及这一点)!!


  • train.py训练时指定模型结构配置文件

这次将parse_model函数里的第二个参数cfg改为yolov5s-se.yaml即可,运行train.py开始训练!!

可见训练时第10层已经引入了SE注意力机制模块:

100次迭代后结果如下,结果保存在runs\train\exp12文件夹,文件夹里有很多指标曲线可对比分析:


 往期精彩

STM32专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/A3BJ2

OpenCV-Python专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/jFJWe

AI底层逻辑专栏(9.9)icon-default.png?t=N7T8http://t.csdnimg.cn/6BVhM

机器学习专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/ALlLlSimulink专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/csDO4电机控制专栏(免费)icon-default.png?t=N7T8http://t.csdnimg.cn/FNWM7

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

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

相关文章

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容?

环境: Excel2016 问题描述: 大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容? 解决方案: 遇到这种情况,说明Excel文件非常大,超出了你当前计算机配置的处理能力。以下是一些解决方法,帮助你尝试打开或…

【Arduino】XIAOFEIYU实验ESP32使用TOUCH触摸模块(图文)

今天XIAOFEIYU继续来实验ESP32使用传感器模块&#xff0c;这次用到的模块为TOUCH触摸模块。 三个针脚分别为正负极&#xff0c;IO针脚。 #define pin 25void setup(){Serial.begin(9600); pinMode(pin, INPUT); }float value 0.0; void loop(){value digitalRead(pin); …

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨&#xff0c;知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想&#xff1a;完全由神经网络驱动的计算机&#xff0c;不再依赖传统的软件代码。 嗯&#xff0c;这是什么意思&#xff1f;全部原生LLM硬件设备的意思吗&#xff1f…

编译原理3-自底向上的语法分析

自底向上分析 &#xff0c;就是自左至右扫描输入串&#xff0c;自底向上进 行分析&#xff1b;通过反复查找当前句型的 句柄&#xff0c; 并使 用产生式规则 将找到的句柄归约为相应的非终结符 。逐步进行“ 归约 ”&#xff0c;直到至文法的开始符号&#xff1b; 对于规范推导…

详解反向传播(BP)算法

文章目录 what&#xff08;是什么&#xff09;where&#xff08;用在哪&#xff09;How&#xff08;原理&&怎么用&#xff09;原理以及推导过程pytorch中的反向传播 what&#xff08;是什么&#xff09; 反向传播算法&#xff08;Backpropagation&#xff09;是一种用于…

为什么是视频传输用YUV格式,而放弃RGB格式?

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《音视频》系列专栏&…

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?

如何寻找一个领域的顶级会议&#xff0c;并且判断这个会议的影响力&#xff1f; 会议之眼 快讯 很多同学都在问&#xff1a;学术会议不是期刊&#xff0c;即使被SCI检索&#xff0c;也无法查询影响因子。那么如何知道各个领域的顶级会议&#xff0c;并对各个会议有初步了解呢…

Qt加载SVG矢量图片,放大缩小图片质量不发生变化。

前言&#xff1a; 首先简单描述下SVG: SVG 意为可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。 SVG 使用 XML 格式定义图像。 给界面或者按钮上显示一个图标或背景图片&#xff0c;日常使用.png格式的文件完全够用&#xff0c;但是有些使用场景需要把图…

代码随想录第41天|动态规划

322. 零钱兑换 dp[j] : 最小硬币数量, j 为金额(相当于背包空间)递推公式 : dp[j] min(dp[j - coins[i]] 1, dp[j])初始化: 需要一个最大值, 避免覆盖, dp[0] 0遍历顺序: 钱币有序无序不影响, 因为求解最小个数, 结果相同(先遍历物品后背包, 先背包后物品都可) class Solut…

NSSCTF-Web题目21(文件上传-phar协议、RCE-空格绕过)

目录 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 3、思路 [FSCTF 2023]细狗2.0 4、题目 5、知识点 6、思路 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 文件上传&#xff0c;phar伪协议 3、思路 点击upload&#xff0c;看看 这里提示我们可以上传图片或压缩包&…

Nginx主配置文件---Nginx.conf

nginx主配置文件的模块介绍 全局块&#xff1a; 全局块是配置文件从开始到 events 块之间的部分&#xff0c;其中指令的作用域是 Nginx 服务器全局。主要指令包括&#xff1a; user&#xff1a;指定可以运行 Nginx 服务的用户和用户组&#xff0c;只能在全局块配置。例如&…

Linux多线程【线程互斥】

文章目录 Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex模拟抢票代码 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁改进模拟抢票代码&#xff08;加锁&#xff09;小结对锁封装 lockGuard.hpp 互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常…

【开发环境】MacBook M系列芯片环境下搭建完整Python开发环境

文章目录 Anaconda和Python的关系&#xff1f;1. Python2. Anaconda 安装AnacondaPycharm整合Anaconda运行你的Python代码 Anaconda和Python的关系&#xff1f; 如果有简单了解过Python语言的&#xff0c;那么你很容易就会听到有人会叫你安装Anaconda。 那么Anaconda是什么&am…

编译原理2

推导和短语 推导 推导过程中&#xff0c;每一步推导都是对句型的 最右非终结符 进行替换&#xff0c;最右推导(规范推导)&#xff1b; 短语 用 β 替换 A&#xff0c;则 β 就是 关于A 的一个短语&#xff1b; 直接短语是短语范围内的一步推导&#xff1b; 直接短语可能不…

Rust学习笔记007:Trait --- Rust的“接口”

Trait 在Rust中&#xff0c;Trait&#xff08;特质&#xff09;是一种定义方法集合的机制&#xff0c;类似于其他编程语言中的接口&#xff08;java&#xff09;或抽象类(c的虚函数)。 。Trait 告诉 Rust 编译器: 某种类型具有哪些并且可以与其它类型共享的功能Trait:抽象的…

[ROS 系列学习教程] 建模与仿真 - 使用 ros_control 控制差速轮式机器人

ROS 系列学习教程(总目录) 本文目录 一、差速轮式机器人二、差速驱动机器人运动学模型三、对外接口3.1 输入接口3.2 输出接口 四、控制器参数五、配置控制器参数六、编写硬件抽象接口七、控制机器人移动八、源码 ros_control 提供了多种控制器&#xff0c;其中 diff_drive_cont…

Datawhale - 角色要素提取竞赛

文章目录 赛题要求一、赛事背景二、赛事任务三、评审规则1.平台说明2.数据说明3.评估指标4.评测及排行 四、作品提交要求五、 运行BaselineStep1&#xff1a;下载相关库Step2&#xff1a;配置导入Step3&#xff1a;模型测试Step4&#xff1a;数据读取Step5&#xff1a;Prompt设…

工业 web4.0UI 风格品质卓越

工业 web4.0UI 风格品质卓越

【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、欧拉筛、打表)Golang实现

原题链接 题目描述 给你一个整数数组 nums。 返回两个&#xff08;不一定不同的&#xff09;质数在 nums 中 下标 的 最大距离。 示例 1&#xff1a; 输入&#xff1a; nums [4,2,9,5,3] 输出&#xff1a; 3 解释&#xff1a; nums[1]、nums[3] 和 nums[4] 是质数。因此答…