YOLOv9综合指南

YOLOv9是YOLO系列中用于实时目标检测的最新进展,引入了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)等新技术来解决信息瓶颈并提高检测精度和效率。 在这篇文章中,我们研究了 YOLOv9 的一些关键优势。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、什么是YOLO?

YOLO 首次出现在 Joseph Redmon 等人 2015 年的首篇论文《You Only Look Once: Unified, Real-Time Object Inspection》中。 该模型架构在目标检测的深度学习领域具有重要意义,因为它被设计为仅查看图像一次,从而将传统的预测位置和分类的两阶段过程转变为单阶段过程,其中 分类对象也与边界框映射在一起。

YOLO模型系列因其任务灵活性和模型紧凑性而在计算机视觉领域作为强大的目标检测机器学习模型而闻名,同时仍然保持最先进的性能。 这使得 YOLO 模型能够集成到许多行业垂直领域,并可供广泛的机器学习从业者使用。

其持续成功的第二个原因是它从最初的 Darknet 版本 1-4 实现过渡到更常用的 PyTorch 框架(YOLOv5、YOLOv7 和 YOLOv8)。 鉴于 PyTorch 中更强大的研究社区,YOLO 模型系列受到了极大的开发关注和快速改进。 YOLOv9 是自诞生以来多次开发迭代的结果,不断挑战目标检测领域最先进的模型架构。

2、YOLOv9 概述

YOLOv9 建立在 2022 年推出的 YOLOv7 先前成功基础上。两者均由 Chien-Yao Wang 等人开发。 YOLOv7在训练过程中重点关注架构优化,称为可训练的免费赠品袋,以加强训练成本以提高目标检测精度,但不会增加推理成本。 然而,它没有解决由于前馈过程中的各种降尺度操作而导致输入数据信息丢失的问题,这种现象称为信息瓶颈。

虽然使用可逆架构和掩模建模等现有方法已被证明可以缓解信息瓶颈,但它们似乎对更紧凑的模型架构失去了功效,而这一直是 YOLO 模型系列等实时目标检测器的标志性特征。

YOLOv9引入了两种新颖的技术,不仅解决了信息瓶颈问题,而且进一步突破了提高目标检测精度和效率的界限。

3、可编程梯度信息

YOLOv9 旨在通过称为可编程梯度信息(PGI)的辅助监督框架来解决信息瓶颈。 PGI 通常被设计为训练辅助工具,通过与先前层的互连来提高梯度反向传播的效率和准确性,但通过可移动分支,可以在推理时删除这些额外的计算,以提高模型的紧凑性和推理速度。 为了改进这些互连,它利用带有集成网络的多级辅助信息,聚合来自多个卷积阶段的梯度以合并有意义的梯度以进行传播。 PGI 由三个关键部分组成:

YOLOv9 中的 PGI 架构

  • 主分支:主分支主要用于推理过程。 由于推理阶段不需要 PGI 的其他组件,因此 YOLOv9 确保不会产生额外的推理成本。
  • 辅助可逆分支:引入辅助可逆分支以确保网络中可靠的梯度生成和参数更新。 该分支通过利用可逆架构来维护完整的信息。 然而,将其直接与主分支集成会产生大量的推理成本,从而促使设计辅助可逆分支。 通过将该分支合并到深度监督框架中,主分支可以接收可靠的梯度信息,有助于提取目标任务的相关特征。 这使得它能够在浅层和深层网络中应用,同时通过在推理过程中删除辅助分支来保留推理能力。
  • 多级辅助信息:通过集成特征金字塔层级之间的集成网络来增强深度监督,允许主分支接收来自不同预测头的聚合梯度信息。 这种方法缓解了深度特征金字塔丢失目标对象预测所需的重要信息的问题,确保主分支保留用于学习跨各种目标的预测的完整信息。
# YOLOv9 head
head:
  [
   # multi-level auxiliary branch  
  
   # elan-spp block
   [9, 1, SPPELAN, [512, 256]],  # 29

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 7], 1, Concat, [1]],  # cat backbone P4

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]],  # 32

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 5], 1, Concat, [1]],  # cat backbone P3

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]],  # 35
   
   
   
   # main branch  
   
   # elan-spp block
   [28, 1, SPPELAN, [512, 256]],  # 36

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 25], 1, Concat, [1]],  # cat backbone P4

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]],  # 39

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 22], 1, Concat, [1]],  # cat backbone P3

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [256, 256, 128, 2]],  # 42 (P3/8-small)

   # avg-conv-down merge
   [-1, 1, ADown, [256]],
   [[-1, 39], 1, Concat, [1]],  # cat head P4

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 2]],  # 45 (P4/16-medium)

   # avg-conv-down merge
   [-1, 1, ADown, [512]],
   [[-1, 36], 1, Concat, [1]],  # cat head P5

   # csp-elan block
   [-1, 1, RepNCSPELAN4, [512, 1024, 512, 2]],  # 48 (P5/32-large)

   # detect
   [[35, 32, 29, 42, 45, 48], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]

上面的代码片段显示了 YOLOv9 头部内部分为主分支和多级辅助分支的情况。 多级辅助分支是主分支的直接子集。 辅助分支中的复制块负责代表主分支存储梯度信息。

4、通用高效层聚合网络(GELAN)

YOLOv9 还通过引入结合了 CSPNet 和 ELAN 重要功能的通用高效层聚合网络 (GELAN),继续维护 YOLO 架构系列闻名的实时推理支持标志。

CSPNet 以其有效的梯度路径规划、增强特征提取而闻名。 另一方面,ELAN 通过使用堆叠卷积层来优先考虑推理速度。 GELAN 整合了这些优势,创建了一个强调轻量级设计、快速推理和准确性的多功能架构。 它通过启用卷积层之外的任何计算块的堆叠来扩展 ELAN 的功能,从而允许在所有层上应用推理优化。

##### GELAN #####        
        
class SPPELAN(nn.Module):
    # spp-elan
    def __init__(self, c1, c2, c3):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = c3
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = SP(5)
        self.cv3 = SP(5)
        self.cv4 = SP(5)
        self.cv5 = Conv(4*c3, c2, 1, 1)

    def forward(self, x):
        y = [self.cv1(x)]
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3, self.cv4])
        return self.cv5(torch.cat(y, 1))
        
        
class RepNCSPELAN4(nn.Module):
    # csp-elan
    def __init__(self, c1, c2, c3, c4, c5=1):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = c3//2
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = nn.Sequential(RepNCSP(c3//2, c4, c5), Conv(c4, c4, 3, 1))
        self.cv3 = nn.Sequential(RepNCSP(c4, c4, c5), Conv(c4, c4, 3, 1))
        self.cv4 = Conv(c3+(2*c4), c2, 1, 1)

    def forward(self, x):
        y = list(self.cv1(x).chunk(2, 1))
        y.extend((m(y[-1])) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))

    def forward_split(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))

#################

最初的“ELAN”模块只允许堆叠卷积层。 上面代码片段中的新“SPPELAN”模块允许在“SP”块中堆叠池层,该块特别包含“MaxPool2D”层。

5、YOLOv9 vs YOLOv8 vs YOLOv7

与之前最先进的模型相比,YOLOv9 的目标检测在不同指标上都有显着的改进。 尽管与 YOLOv7 和 YOLOv8 最大的架构变体相比,YOLOv9 的参数要少得多,但在准确性方面仍然优于它们。 此外,YOLOv9 保持了与其直接前身 YOLOv7 几乎相同的计算复杂性,并避免了 YOLOv8 带来的额外复杂性。

来源: YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information

在 COCO 数据集上进行训练时,YOLOv9 甚至优于 YOLO 系列之外的其他最先进的实时目标检测器,例如 RT DETR、RTMDet 和 PP-YOLOE。 这些模型具有利用 ImageNet 预训练权重的优势。 独特的是,尽管采用了从头开始训练的方法,YOLOv9 仍然能够确保优于它们的优势,展现出快速学习鲁棒特征的强大能力。 这可能意味着在自定义数据集上训练 YOLOv9 可能会进一步提升其已经令人印象深刻的指标。

YOLOv9 Performance Analysis with Other Real-Time Object Detection Architectures.

6、用于人群检测的 YOLOv9 推理示例

虽然许多性能测试和评估都是在高质量图像上完成的,但我们希望了解 YOLOv9 在真实数据上的表现如何。 我们输入了一段完全没见过的、中等质量的视频,该视频描绘了购物中心里的一群人,供模型进行预测。 输入分辨率为 640x640 的预训练 YOLOv9-E 能够检测场景中的大多数人物实例,无需任何进一步的微调,并且在遮挡方面具有良好的性能。

YOLOv9 还可以扩展到与其他 MOT 算法(例如 BYTETrack)一起使用。 在此示例中,我们为每个人和背包分配了唯一的 ID,并在他们在框架中移动时对其进行跟踪。 这为人群管理开辟了重要的用例,通过计算特定位置的人数以及监视来跟踪可疑人员的活动或识别可疑的包。 请查看我们的文章,了解有关如何将 BYTETrack 与 YOLOv9 结合使用的更多信息。

使用 YOLOv9 和 BYTETrack 在拥挤的购物中心中跟踪人员和背包。

7、YOLOv9 应用

YOLOv9 的实时对象检测支持可用于各种实际应用,特别适合快节奏的环境,例如:

  • 自动驾驶汽车:YOLOv9可用于自动驾驶汽车,实时检测道路上的行人、其他车辆、交通标志和障碍物,使车辆能够根据周围环境做出决策。
  • 监控系统:YOLOv9 可用于监控摄像头,通过检测可疑活动、未经授权的入侵或废弃物体来监控公共空间、机场、火车站和其他区域。
  • 零售分析:在零售业,YOLOv9 可用于跟踪客户动向、分析商店客流量,并通过识别货架上的产品来监控库存水平。 它还可以通过检测商店行窃事件来帮助零售安全。

8、如何根据自己的权重微调 YOLOv9?

要在自己的自定义数据集上微调 YOLOv9,你首先需要克隆 YOLOv9 存储库并安装所需的 Python 包。 我们建议你为此使用虚拟环境,例如 conda 或 virtualenvwrapper。

git clone https://github.com/WongKinYiu/yolov9.git
pip install -r requirements.txt

如果你更喜欢在 Docker 容器中进行开发,请按照以下 Docker 设置说明进行操作:

# create the docker container, you can change the share memory size if you have more.
nvidia-docker run --name yolov9 -it -v your_coco_path/:/coco/ -v your_code_path/:/yolov9 --shm-size=64g nvcr.io/nvidia/pytorch:21.11-py3

# apt install required packages
apt update
apt install -y zip htop screen libgl1-mesa-glx

# pip install required packages
pip install seaborn thop

# go to code folder
cd /yolov9

然后,你需要准备类似于 COCO 数据集文件结构的数据集。 如果需要引用此结构,你可以运行以下脚本,该脚本将下载 COCO 数据集的训练、验证和测试分割以及标签。

bash scripts/get_coco.sh

要运行训练,由于计算要求,建议配置 GPU。

# train yolov9 models
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

# train gelan models
# 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

如果希望利用多个 GPU,只需修改命令以利用“torch.distributed”:

# train yolov9 models
python -m torch.distributed.launch --nproc_per_node 8 --master_port 9527 train_dual.py --workers 8 --device 0,1,2,3,4,5,6,7 --sync-bn --batch 128 --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

# train gelan models
# python -m torch.distributed.launch --nproc_per_node 4 --master_port 9527 train.py --workers 8 --device 0,1,2,3 --sync-bn --batch 128 --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

模型训练完成后,可以运行评估脚本来评估你的模型:

# evaluate converted yolov9 models
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

# evaluate yolov9 models
#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

# evaluate gelan models
# 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

或者,如果你希望对测试数据运行推理,可以查看此处的代码片段,或查看此 HuggingFace Space 以获得方便的仪表板,以快速评估和可视化几个图像上的推理性能。 原始 GitHub 存储库还包含你可能会觉得有用的其他区域,例如来自社区贡献的其他相关 YOLOv9 教程的链接,例如在 Tensorflow、ONNX 和 TensorRT 上实现 YOLOv9。 要阅读已发表的论文,可以访问此处的链接。


原文链接:YOLOv9全面指南 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java并发编程: Java线程组(ThreadGroup)

文章目录 一、介绍二、线程组特性1、关联性(1)一级关联性(2)多级关联性 2、自动归属属性3、根线程组 三、线程组作用1、统一异常处理机制 一、介绍 Java线程组(ThreadGroup)是一种用于组织和管理线程的机制…

【计算机毕业设计】在线商品管理系统的设计与实现——后附源码

🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…

代码随想录算法训练营第三十四天| LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

一、LeetCode 1005.K次取反后最大化的数组和 题目链接/文章讲解/视频讲解:https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 状态:已解决 1.思路 还是那个…

基于SpringBoot+vue的在线商城系统+论文+免费远程调试

基于SpringBootvue的在线商城系统034(含源码 数据库文档免费送) 开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springb…

【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现

SCI,CCF,EI及核心期刊绘图宝典,爆款持续更新,助力科研! 本期分享: 【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现 1.环境准备 library(gplots) library(RColorBrewer) 2.数据示例 ###…

MySQL典型示例

目录 1.使用环境 2.设计表 3.创建表 4.准备数据 5.查询 1.使用环境 数据库:MySQL 8.0.30 客户端:Navicat 15.0.12 2.设计表 假设我们已经建好了一个名为test的数据库。我们添加如下几个表:教师、课程、学生、班级、成绩。实体联系图设…

菜狗学前端之JS高级笔记

老样子。复制上来的图片都没了,想看原版可以移步对应资源下载(资源刚上传,还在审核中) (免费) JS高级笔记https://download.csdn.net/download/m0_58355897/89102910 一些前提概念 一 什么是js高级 js高级是对js基础语法的一个补充说明,本质…

C语言从入门到实战————文件操作

目录 前言 1. 为什么使用文件? 2. 什么是文件? 2.1 程序文件 2.2 数据文件 2.3 文件名 3. ⼆进制文件和文本文件? 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文…

DSP报错#10099-D</a> program will not fit into available memory

DSP报错#10099-D程序将无法放入可用内存 问题解决方法后续 问题 开发TMS320Fxxxxx出现以下问题&#xff1a; <a href"file:/D:/TI/ti/ccs/tools/compiler/dmed/HTML/10099.html">#10099-D</a> program will not fit into available memory, or the se…

P5200A泰克P5200A高压差分探头

181/2461/8938产品概述&#xff1a; 特点: 1.3 kV差分1 kV至地&#xff08;每个通道&#xff09;50 MHz带宽50倍/500倍衰减UL认证3111-1IEC 1010认证不再不安全地浮动您的范围出色的信号保真度轻松连接IC和汇流条对用户和DUT安全由9 VDC墙壁适配器供电超量程指示器安全认证可…

rhce复习3

DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端口&#x…

SRIO学习(1)SRIO介绍以及IP核详解

文章目录 一、SRIO介绍1.1、概要1.2、RapidIO与传统嵌入互连方式的比较1.3、串行RapidIO协议&#xff08;SRIO&#xff09; 二、RapidIO协议结构及包格式2.1、逻辑层2.2 传输层2.3 物理层 三、IP核详解3.1、逻辑层3.1.1 I/O端口3.1.2 消息&#xff08;Message&#xff09;端口3…

【云呐】工单管理流程,工单管理怎么处理

工单创建  客户或内部员工在系统中创建工单。工单应包括以下信息&#xff1a;  问题的描述  工单的优先级和紧急程度  相关的客户或内部员工信息  工单的类型或类别  相关的附件或文件 工单分配  工单需要分配给适当的人员或团队来解决。分配过程可能涉及到以下步…

龙蜥社区「人人都可以参与开源」—— 走进“龙蜥社区”感受开源魅力

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 开源这个关键字我相信各位开发者们或多或少都听说过&#xff0c;简单来讲开源就是源码开放&#xff0c;但是不意味着使…

【DM8】间隔分区

是范围分区的一个扩展 如果使用了间隔函数做分区&#xff0c;在数据插入的时候&#xff0c;如果没有合适的分区&#xff0c;数据库会自动创建一个新的分区。 –year往后推两年 SELECT SYSDATE numtoyminterval(2,‘YEAR’); –month往后推两年 SELECT SYSDATE numtoyminterv…

交换机与队列的介绍

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…

智慧园区预付费4G水电表管理系统

智慧园区预付费4G水电表管理系统&#xff0c;作为智慧城市建设的重点之一&#xff0c;利用4G通信技术对园区内的水电使用进行实时监控和管理。这种系统借助现代通信技术和物联网的发展&#xff0c;为园区水电能源的预付费、计量、监控和管理提供了新的解决方案。本文将从该系统…

750万人受影响,印度电子巨头boAt重大数据泄露事件

近日&#xff0c;印度消费电子巨头boAt遭遇重大数据泄露事件&#xff0c;超过750万客户的个人数据遭到泄露&#xff0c;泄露的个人数据包括姓名、地址、联系电话、电子邮件 ID 和客户 ID 以及其他敏感信息&#xff0c;目前这些泄露数据正在暗网上流传。 boAt Lifestyle数据库被…

vue项目初始化和部署

目录 1. 技术简介... 2 2. 安装Node.js. 3 3. 全局安装Vue CLI (脚手架工具) 5 4. 创建一个新的Vue项目... 6 5. 在阿里云虚拟机安装和配置Nginx. 9 6. 将Vue项目打包部署到Nginx下... 14 7. 访问部署的项目... 14 1. 技术简介 Vue.js&#xff08;通常简称为Vue&#x…

vue3 +Taro 页面实现scroll-view 分页功能

需求 现在分页列表 后端只给你一个分页的数据列表 没有总页数 没有当前的分页 页数 只有这么一个list 、、、 如何去分页 我这使用的是scroll-view 组件 滑动到底部的事件 根据你当前设定的每页的数据数量和后端返回给你的数据列表数量 当某一次分页 两个数量不相等了以后 就…