一文搞懂 YOLOv9 训练推理全流程 | YOLOv9你绝对不知道的细节!

news2024/12/25 2:25:20

在这里插入图片描述
在这里插入图片描述

文章地址:https://arxiv.org/pdf/2402.13616.pdf
代码地址:https://github.com/WongKinYiu/yolov9


前言

在这篇博客中,我们来聊聊 YOLOv9。首先,值得注意的一点是,YOLOv9的变化相对较小,它仍然基于YOLOv5的代码架构。这就意味着YOLOv5YOLOv7YOLOv9实际上是“同一个框架”。如果你已经熟悉其中一个,那么你将能够轻松掌握另外两个。

这也间接回答了大家长期存在的一个疑问:改进YOLOv5YOLOv7是否已经过时了?

YOLOv9仍然采用 v5 的框架,显然从框架的角度讲,没有“过时”!也不存在"过时"这个说法,即便用 v3 的框架依然可以做出 v10

在此,我也想和各位导师们说几句,不要用所谓的版本为难同学们了,特别是当你们可能对当前的YOLO发展并不完全了解时。虽然以数字命名的 YOLO版本已经发展到了v9,但这并不意味着它在所有方面都超越了v5。并且不只是以数字命名的YOLO才叫YOLO,除了这几个以数字命名的版本,还有很多很多优秀的 YOLO工作,很多数据集的表现上并不比数字版本差!

如果你们不信,可以尝试将YOLOv9与古老的VGG16在多个数据集上进行对比实验。我敢肯定,你会发现在某些数据集上,YOLOv9并不比VGG16表现得更好。

还有一点,各位同学们,你们做的是新的YOLO算法,你可以叫 xx-YOLO 或者 YOLO-xx,不必非得写成基于YOLOv5xx 改进,然后你的对比实验对比一下新的 v8 v9,这样老师们也没办法“找出问题”。


原理解析

YOLOv9来了! 使用可编程梯度信息学习你想学的内容, v7作者新作!【文献速读】

下面就来带大家跑一下 YOLOv9 , 先简单说下原理,主要就是两点,一个是可编程梯度信息(PGI),另一个是通用高效层聚合网络(GELAN),这里我不过多的解析,简单看下:

  • 可编程梯度信息(PGI):假设通过引入PGI,可以在深度学习模型中保留更多的输入信息,从而解决信息丢失问题。PGI允许模型在计算目标函数时使用完整的输入信息,提供可靠的梯度信息用于网络权重的更新,这对于提高模型在复杂任务上的性能至关重要。
  • 通用高效层聚合网络(GELAN):GELAN这种新型轻量级网络架构可以实现高效的信息流动和优化的参数利用,从而在保持甚至提高检测精度的同时,减少计算资源的需求。GELAN的设计旨在通过梯度路径规划优化网络结构,使之能够在不同的硬件设备上高效运行,同时提高模型的泛化能力。

在这里插入图片描述
图2. 不同网络架构随机初始化权重输出特征图的可视化结果:(a) 输入图像,(b) PlainNet,(.c) ResNet,(d) CSPNet,以及(e) 提出的GELAN。从图中我们可以看出,在不同的架构中,提供给目标函数以计算损失的信息不同程度地丢失了,而我们的架构能够保留最完整的信息,并为计算目标函数提供最可靠的梯度信息。

在这里插入图片描述
图3. PGI及相关网络架构和方法。(a) 路径聚合网络(PAN),(b) 可逆列(RevCol),(.c) 传统的深度监督,以及(d) 我们提出的可编程梯度信息(PGI)。PGI主要由三个组成部分构成:(1) 主分支(main branch):用于推断的架构,(2) 辅助可逆分支(auxiliary reversible branch):生成可靠的梯度以供主分支向后传输,以及(3) 多级辅助信息(multi-level auxiliary information):控制主分支学习可计划的多级语义信息。


代码实操

readmd解析

代码Github地址在这里:https://github.com/WongKinYiu/yolov9

我们先一起看看项目的 readmereadme 一般都包含了项目最核心的一些信息,一般可以通过这个发掘出一些"有趣的东西" ;

Performance 上看到模型有 5 个版本,但是截止到 2024/3/25 ,作者只开源了 YOLOv9-CYOLOv9-EYOLOv9-T YOLOv9-S YOLOv9-M 还没开放,按照作者的一贯性格,我认为小尺寸的模型不会是简单的尺度缩放,肯定会有特殊的设计。

在这里插入图片描述
Evaluation 这里看到了 6 个 权重链接,并且有的叫做 converted ,这让我首先想到了"结构重参数化",后来看了一眼还真是,v9还真给"结构重参数化"方法玩明白了,佩服👍,这里的几个权重什么关系我下文说。

在这里插入图片描述
下面就是一些 训练和推理的参考了,并且还给了"重参数化"用的脚本!
在这里插入图片描述


模型训练

终于来到了关键的点,这几天我也刷到了一些给我推送的文章,大家有些地方可能没注意到,并不是代码写错了,是大家用错了,

这个v9的训练脚本有三个,和我们之前v5 v7 看的都不一样的,

在这里插入图片描述
并且 yaml 结构文件也给了6个(7的yaml这里忽略),分别是 v9cegelance

在这里插入图片描述
重点来了!train.pytran_dual.pytrain_triple.py 三个都没错,都能用,但是你得对应起来!

  • train.py:常规的训练,没有辅助分支的
  • train_dual:一个辅助分支 + 一个主分支
  • triple_branch:两个辅助分支 + 一个主分支

所以当我们训练 YOLOv9-c 或者 YOLOv9-e 就用 train_dual:

python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15

你想训练没有辅助分支的 gelan 结构,你就用 train.py:

python train.py --workers 8 --device 0 --batch 32 --data data/coco.yaml --img 640 --cfg models/detect/gelan-c.yaml --weights '' --name gelan-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15

这里还涉及到一个问题,辅助分支是干啥的,顾名思义,就是辅助训练的,用"重参数化"思想来解释就是:
训练的时候带着这个辅助分支训练,训练完将这个分支"拿掉",理论上,推理的精度是"几乎不变"的。

这部分怎么做呢?用作者给的重参数化脚本:https://github.com/WongKinYiu/yolov9/blob/main/tools/reparameterization.ipynb

在这里插入图片描述

在这里插入图片描述
转换后,模型的权重大小基本掉了一半,就和上面Performance 上看到的尺寸对应上了,这就是YOLOv9最核心的东西!

模型推理

同样的,训练分了多个脚本,推理脚本也是分开的,

如果你想推理你刚才用脚本转换后的权重,你就用这个指令:

python detect.py --source './data/images/horses.jpg' --img 640 --device 0 --weights './yolov9-c-converted.pt' --name yolov9_c_c_640_detect

如果你想推理v9没转换的权重,也就是你刚训练出来的best.pt,你就用这个指令:

python detect_dual.py --source './data/images/horses.jpg' --img 640 --device 0 --weights './yolov9-c.pt' --name yolov9_c_640_detect

如果你想推理常见的gelan结构的权重,你就用这个指令:

python detect.py --source './data/images/horses.jpg' --img 640 --device 0 --weights './gelan-c.pt' --name gelan_c_c_640_detect

在这里插入图片描述

模型验证

同理,val也是分开的,

如果你想验证你刚才用脚本转换后的权重,你就用这个指令:

python val.py --data data/coco.yaml --img 640 --batch 32 --conf 0.001 --iou 0.7 --device 0 --weights './yolov9-c-converted.pt' --save-json --name yolov9_c_c_640_val

如果你想验证v9没转换的权重,也就是你刚训练出来的best.pt,你就用这个指令:

python val_dual.py --data data/coco.yaml --img 640 --batch 32 --conf 0.001 --iou 0.7 --device 0 --weights './yolov9-c.pt' --save-json --name yolov9_c_640_val

如果你想推理常见的gelan结构的权重,你就用这个指令:

python val.py --data data/coco.yaml --img 640 --batch 32 --conf 0.001 --iou 0.7 --device 0 --weights './gelan-c.pt' --save-json --name gelan_c_640_val

引用

@article{wang2024yolov9,
  title={{YOLOv9}: Learning What You Want to Learn Using Programmable Gradient Information},
  author={Wang, Chien-Yao  and Liao, Hong-Yuan Mark},
  booktitle={arXiv preprint arXiv:2402.13616},
  year={2024}
}
@article{chang2023yolor,
  title={{YOLOR}-Based Multi-Task Learning},
  author={Chang, Hung-Shuo and Wang, Chien-Yao and Wang, Richard Robert and Chou, Gene and Liao, Hong-Yuan Mark},
  journal={arXiv preprint arXiv:2309.16921},
  year={2023}
}

总结

到这里,YOLOv9就解析完了,这篇我并没有手把手带大家走训练的全流程,个人觉得和v5 v7 没啥区别,我这样做意义不大,最核心最重要的东西就在我上面的文章里面了;
在这里插入图片描述

顺便说一下,YOLOv9 不仅仅支持检测任务,还有实例分割任务和全景分割任务,这个我后面出教程解析,

喜欢我的文章欢迎大家点赞评论交流~

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

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

相关文章

在线影院项目话术(0.7w精选)

项目介绍 这个电影院项目不同于常见的基于会员限制用户观看范围的在线影院项目,主要就是按需购买片源来进行观看,用户就不会因高额的会员费而劝退。 项目的主要实现就是:微服务的五大主键,数据库使用mysql,redis,中间…

2024年湖北荆门市工程系列职称评审开始啦

(一)中级测试对象:拟参加近两年度相关系列(专业)中级技术职务评审,且未取得中级水平能力测试合格证书的专业技术人员。 (二)初级测试对象:拟参加近两年度档案专业、工程系列助理级职称评审,且未取得初级水平能力测试合格证书的专业…

白酒:陈酿过程中的老熟度评价与品质提升方法

在豪迈白酒的酿造过程中,陈酿是一个至关重要的环节。陈酿不仅能使白酒老熟,提品质,还能发展出与众不同的风味和口感。云仓酒庄深知陈酿的重要性,并进行了深入的研究和实践。本文将探讨陈酿过程中的老熟度评价与品质提升方法。 首先…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

IDEA 远程调试

1.什么是远程调试 Java提供了一个远程调试功能&#xff0c;支持设置断点及线程级的调试同时&#xff0c;不同的JVM通过接口的协议联系&#xff0c;本地的Java文件在远程JVM建立联系和通信。 2.服务端开启远程调试 开启远程调试功能&#xff0c;需要修改tomcat 的catalina.sh…

目录框架【欢迎订阅收藏】

前端篇 第一章vue.js 1.Vue.js入门及环境搭建 2.vue.js基础知识 3.Vue.js自定义组件 Vue.js路由 5.Vue.js状态管理 6.网络通信axios 第二章Tailwindcss 1.tailwindcss介绍及引入 2.基础样式 3.组件样式 4.工具样式 第三章Nuxt 1.nuxt介绍及环境搭建 2.nuxt 目录结构 3.nuxt …

ElasticSearch文档批量操作[ES系列] - 第503篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

超声波清洗机怎么选?过来人推荐四大表现突出的宝藏眼镜清洗机!

如果你清洁眼镜的时候总是习惯用纸巾或者是衣服擦的话&#xff0c;我劝你要赶紧把这个坏习惯给改掉&#xff01;很多不知道原因的朋友会问&#xff0c;为什么不能用纸巾擦眼镜&#xff1f;其实是因为纸巾还有衣服布料上&#xff0c;存在一些比较粗糙的微粒&#xff0c;人体手部…

车载测试 HIL测试详解

HIL测试&#xff1a;即硬件在环测试&#xff0c;是一种广泛应用于汽车电子控制系统领域的测试方法。它将实际的硬件&#xff08;如ECU、传感器、执行器等&#xff09;与模拟器件&#xff08;如模型、仿真器等&#xff09;通过接口连接起来&#xff0c;模拟实际的操作环境&#…

动态规划-----最长公共子序列(及其衍生问题)

目录 一.最长公共子序列的基本概念&#xff1a; 解决动态规划问题的一般思路&#xff08;三大步骤&#xff09;&#xff1a; 二.最长公共子序列题目&#xff1a; 三.字符串的删除操作&#xff1a; 四.最小 ASCII 删除和&#xff1a; 一.最长公共子序列的基本概念&#xff…

微前端——qiankun

一、微前端 微前端是指存在于浏览器中的微服务&#xff0c;其借鉴了后端微服务的架构理念&#xff0c;将微服务的概念扩展到前端。即将一个大型的前端应用拆分为成多个模块&#xff0c;每个微前端模块可以有不同的团队开发并进行管理&#xff0c;且可以自主选择框架&#xff0…

seata测试demo(订单)

seata工作流程: seata对分布式事务的协调和控制就是31 1>XID&#xff1a;XID是全局事务的唯一标识&#xff0c;它可以在服务的调用链路中传递&#xff0c;绑定到服务的事务上下文中。 3>TC->TM->RM TC:事务协调器>就是seata 负责维护全局事务和分支事务的状…

选项式API和组合式API的区别

选项式(options) API 和组合式(composition) API两种不同的风格书写&#xff0c;Vue3 的组件可以使用这两种api来编写。 选项式API和组合式API的区别 选项式API 选项式 API&#xff0c;具有相同功能的放在一起&#xff0c;可以用包含多个选项的对象来描述组件的逻辑&…

【周总结】

周总结 完成项目混合版时区改造 完成相关jira问题的修改 完成老版本APP数据保存接口的兼容&#xff0c;手动赋值时区 2024/03/24 天气阴 一点不冷 1.Its time to go、Spring is coming&#xff01; 2. Its a nice day that staying with friends in a peaceful …

初探Ruby编程语言

文章目录 引言一、Ruby简史二、Ruby特性三、安装Ruby四、命令行执行Ruby五、Ruby的编程模型六、案例演示结语 引言 大家好&#xff0c;今天我们将一起探索一门历史悠久、充满魅力的编程语言——Ruby。Ruby是由松本行弘&#xff08;Yukihiro Matsumoto&#xff09;于1993年发明…

LangChain核心模块 Retrieval——文档加载器

Retrieval ​ 许多LLM申请需要用户的特定数据&#xff0c;这些数据不属于模型训练集的一部分&#xff0c;实现这一目标的主要方法是RAG(检索增强生成)&#xff0c;在这个过程中&#xff0c;将检索外部数据&#xff0c;然后在执行生成步骤时将其传递给LLM。 ​ LangChain 提供…

Linux系统安装openGauss结合内网穿透实现公网访问本地数据库管理系统——“cpolar内网穿透”

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

力扣:205. 同构字符串

前言&#xff1a;剑指offer刷题系列 问题&#xff1a; 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符…

Linux快速入门,上手开发 02.VMware的安装部署

倘若穷途末路&#xff0c;那便势如破竹 —— 24.3.21 一、VMware的作用 在Windows或IOS系统下&#xff0c;给本地电脑安装VMware虚拟机&#xff0c;用来在虚拟机上安装Linux系统&#xff0c;避免重复资源的浪费&#xff0c;可以在虚拟机上搭建Linux系统进行学习 二、VMware的安…

分布式数据库TiDB介绍及基本原理

1.概述&#xff1a; 1.1 标准SQL、noSQL、newSQL的区别&#xff1a; SQL(Structured Query Language)&#xff1a;数据库&#xff0c;指传统的关系型数据库。缺点是面对大量的数据时&#xff0c;他的性能会随着数据库的增大而急剧下降。主要代表&#xff1a;SQL Server、Orac…