news 2026/3/28 0:23:23

YOLOv9训练全流程演示,附详细操作步骤和截图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv9训练全流程演示,附详细操作步骤和截图

YOLOv9训练全流程演示,附详细操作步骤和截图

YOLOv9不是简单迭代,而是目标检测范式的又一次跃迁。它首次提出“可编程梯度信息”(PGI)与“广义高效层聚合网络”(GELAN),让模型在极小参数量下仍能保留关键特征梯度路径——这意味着你不再需要靠堆显存来换精度,也不必在速度和召回率之间反复妥协。本文不讲论文公式,不堆理论推导,只带你从镜像启动到完成一次真实数据集训练的完整闭环:环境怎么切、数据怎么放、命令怎么写、日志怎么看、结果怎么验。所有操作均基于CSDN星图提供的「YOLOv9 官方版训练与推理镜像」实测验证,每一步都配有终端截图级说明(文字还原关键界面状态),零跳步,不省略,小白照着敲就能跑通。


1. 镜像启动与环境准备

镜像不是拿来就用的“黑盒”,理解它的结构才能避免后续踩坑。本镜像预装了完整开发栈,但默认进入的是base环境——这是conda的初始沙箱,不包含YOLOv9所需依赖。必须手动激活专用环境,否则所有训练命令都会报错。

1.1 启动镜像并确认基础状态

启动镜像后,终端默认显示类似以下提示(注意用户名和路径):

(base) root@7a2b3c4d5e6f:~#

此时你处于base环境,PyTorch未加载,CUDA不可用。先执行两步基础检查:

# 查看GPU是否可见(应返回0号设备信息) nvidia-smi -L # 查看conda环境列表(确认yolov9环境存在) conda env list

预期输出中应包含一行:

yolov9 /root/miniconda3/envs/yolov9

nvidia-smi报错,请确认镜像已绑定GPU设备;若yolov9环境缺失,说明镜像加载异常,需重新拉取。

1.2 激活YOLOv9专用环境

执行激活命令,环境前缀会立即变化:

conda activate yolov9

成功后终端提示符变为:

(yolov9) root@7a2b3c4d5e6f:~#

此时验证核心依赖是否就绪:

# 检查PyTorch CUDA支持 python -c "import torch; print(torch.__version__, torch.cuda.is_available())" # 检查代码目录是否存在 ls -l /root/yolov9 | head -5

预期输出为:

1.10.0 True total 88 drwxr-xr-x 3 root root 4096 Apr 10 10:22 data drwxr-xr-x 4 root root 4096 Apr 10 10:22 models -rw-r--r-- 1 root root 1234 Apr 10 10:22 detect_dual.py -rw-r--r-- 1 root root 5678 Apr 10 10:22 train_dual.py

这表示环境已就绪,代码库完整,可以进入下一步。


2. 数据集准备与配置文件修改

YOLOv9不接受任意格式数据,必须严格遵循YOLO标准:每张图片对应一个同名.txt标签文件,内容为归一化后的类别ID+边界框坐标。镜像内置了示例数据(/root/yolov9/data/images/horses.jpg),但真实训练必须替换为你自己的数据集

2.1 数据集组织规范(必须严格执行)

假设你要训练一个“安全帽检测”任务,数据集应按如下结构存放(全部在/root/yolov9/data/下):

data/ ├── images/ │ ├── train/ # 训练图片(jpg/png) │ └── val/ # 验证图片(建议占总量20%) ├── labels/ │ ├── train/ # 对应训练图片的txt标签 │ └── val/ # 对应验证图片的txt标签 └── data.yaml # 数据集配置文件(关键!)

每个.txt标签文件格式示例(images/train/001.jpglabels/train/001.txt):

0 0.452 0.321 0.180 0.245 # 类别0(安全帽),中心x/y,宽高(全部0-1归一化) 1 0.783 0.612 0.210 0.330 # 类别1(人头),同上

提示:可用labelImgCVAT工具标注;若已有VOC/COCO格式,用scripts/convert.py脚本批量转换(镜像内已提供)。

2.2 修改data.yaml配置文件

编辑/root/yolov9/data/data.yaml,按实际路径和类别更新:

train: ../data/images/train val: ../data/images/val nc: 2 # 类别总数(安全帽+人头=2) names: ['helmet', 'head'] # 类别名称列表,顺序必须与标签ID一致

绝对禁止

  • 路径使用绝对路径(如/root/yolov9/data/images/train),必须用相对路径(../data/images/train
  • nc值与names长度不一致
  • names中含空格或特殊字符(仅允许字母、数字、下划线)

修改后保存,执行校验命令确保无语法错误:

python -c "import yaml; print(yaml.safe_load(open('/root/yolov9/data/data.yaml')))"

若输出字典内容即表示配置正确。


3. 模型推理测试:验证环境与权重可用性

在启动耗时的训练前,先用单张图片做端到端推理测试。这一步能同时验证:环境是否激活、CUDA是否可用、预置权重是否完整、代码逻辑是否正常。

3.1 执行推理命令

进入代码目录并运行官方示例:

cd /root/yolov9 python detect_dual.py \ --source './data/images/horses.jpg' \ --img 640 \ --device 0 \ --weights './yolov9-s.pt' \ --name yolov9_s_640_detect

3.2 理解关键参数与预期输出

参数说明注意事项
--source输入图片路径必须是镜像内存在的文件,路径以.开头
--img推理分辨率YOLOv9-s推荐640,过大易OOM
--deviceGPU编号单卡填0,多卡填0,1
--weights权重文件路径镜像已预置yolov9-s.pt,无需下载

成功执行后,终端会输出类似信息:

YOLOv9 2024-4-10 11:23:45 ... Results saved to runs/detect/yolov9_s_640_detect

3.3 检查结果文件

结果保存在runs/detect/yolov9_s_640_detect/,查看生成的图片:

ls runs/detect/yolov9_s_640_detect/ # 应看到:horses.jpg (带检测框的输出图)

cat命令查看检测日志(关键!判断模型是否真正工作):

cat runs/detect/yolov9_s_640_detect/results.txt

预期输出包含检测统计:

image 1/1 /root/yolov9/data/images/horses.jpg: 384x640 3 horses, 1 person, Done. (0.123s)

若出现CUDA out of memoryFile not found,请回溯检查环境激活和路径配置。


4. 模型训练全流程实操

训练不是“一键启动”,而是需要根据你的硬件和数据集动态调整参数。本节以单卡RTX 4090(24GB显存)为例,展示从命令构建到监控训练的完整链路。

4.1 构建训练命令(逐参数解析)

官方推荐命令如下(已适配镜像环境):

python train_dual.py \ --workers 8 \ --device 0 \ --batch 32 \ --data data/data.yaml \ --img 640 \ --cfg models/detect/yolov9-s.yaml \ --weights '' \ --name yolov9-s-helmet \ --hyp hyp.scratch-high.yaml \ --min-items 0 \ --epochs 50 \ --close-mosaic 15

参数详解(非默认值重点说明)

  • --batch 32:镜像默认batch=64对24GB显存偏大,实测32更稳定;若显存<16GB,需降至16或8
  • --weights '':空字符串表示从零开始训练(scratch);若要微调,填./yolov9-s.pt
  • --name yolov9-s-helmet:自定义训练结果保存目录名,便于区分不同实验
  • --close-mosaic 15:前15个epoch关闭Mosaic增强(避免小目标漏检),之后自动开启

提示:首次训练建议先跑--epochs 5快速验证流程,再全量训练。

4.2 启动训练并实时监控

执行命令后,终端将滚动输出训练日志。重点关注三类信息:

  1. 初始化阶段(首屏):

    Start Training: yolov9-s-helmet Using CUDA device0 _ 4090 Creating model from models/detect/yolov9-s.yaml
  2. 每epoch进度条(核心指标):

    Epoch 1/50: 100%|██████████| 125/125 [05:23<00:00, 2.69s/it] Class Images: 1250, Instances: 3420, Box Loss: 0.042, Cls Loss: 0.021, Dfl Loss: 0.033
    • Box Loss:定位损失,越低越好(<0.05为优)
    • Cls Loss:分类损失,反映类别识别准确率
    • Dfl Loss:分布焦点损失,YOLOv9特有,优化边界框质量
  3. 验证阶段输出(每epoch末尾):

    val: 100%|██████████| 32/32 [01:15<00:00, 2.34s/it] Class Images Labels P R mAP50 mAP50-95: 0.621 helmet 640 1240 0.821 0.753 0.785 0.521 head 640 1890 0.792 0.718 0.752 0.483
    • P(Precision):查准率,预测为正例中真实正例比例
    • R(Recall):查全率,真实正例中被预测出的比例
    • mAP50:IoU=0.5时的平均精度,工业场景常用指标
    • mAP50-95:IoU从0.5到0.95的平均值,学术评测标准

4.3 中断与恢复训练

训练可能因意外中断。YOLOv9支持断点续训,关键在于--resume参数:

# 若训练中断,找到最新权重文件(如runs/train/yolov9-s-helmet/weights/last.pt) # 用以下命令继续: python train_dual.py --resume runs/train/yolov9-s-helmet/weights/last.pt

镜像会自动读取last.pt中的优化器状态和epoch计数,无缝接续。


5. 训练结果分析与模型导出

训练结束不等于完成,必须验证模型效果并导出为部署格式。

5.1 分析训练曲线

所有训练日志和图表保存在runs/train/yolov9-s-helmet/目录:

ls runs/train/yolov9-s-helmet/ # 关键文件:results.csv(数值记录)、results.png(可视化曲线)、weights/best.pt(最优权重)

用Python快速查看收敛趋势:

# 绘制loss曲线(需在yolov9环境内执行) cd /root/yolov9 python -c " import pandas as pd df = pd.read_csv('runs/train/yolov9-s-helmet/results.csv') print('Final loss:', df['train/box_loss'].iloc[-1]) print('Best mAP50:', df['metrics/mAP50(B)'].max()) "

train/box_loss持续下降且metrics/mAP50(B)稳定在0.75+,说明训练有效。

5.2 使用best.pt进行最终验证

用最优权重在验证集上做最终评估:

python val_dual.py \ --data data/data.yaml \ --weights runs/train/yolov9-s-helmet/weights/best.pt \ --batch 32 \ --img 640 \ --task val

输出将给出最终mAP值,这才是你模型的真实能力。

5.3 导出为ONNX格式(部署必备)

训练好的.pt文件不能直接部署到边缘设备,需转为ONNX:

python export.py \ --weights runs/train/yolov9-s-helmet/weights/best.pt \ --include onnx \ --imgsz 640

成功后生成best.onnx,位于同一目录。该文件可被TensorRT、OpenVINO或ONNX Runtime直接加载。


6. 常见问题排查指南

训练过程中的报错往往有固定模式,本节列出高频问题及根治方案。

6.1 “CUDA out of memory”(显存不足)

现象:训练启动时报错RuntimeError: CUDA out of memory
根因:batch size过大或图片分辨率过高
解决

  • 降低--batch(24GB卡用32→16,16GB卡用16→8)
  • 降低--img(640→416)
  • 添加--amp启用混合精度(镜像已支持)

6.2 “No labels found”(标签缺失)

现象:训练日志显示0 labels found,loss为nan
根因data.yaml中路径错误或标签文件命名不匹配
解决

  • 运行ls -l data/labels/train/ | head确认标签文件存在且与图片同名
  • 检查data.yamltrain:路径是否为../data/images/train(非绝对路径)

6.3 “KeyError: 'model.0.cv1.conv.weight'”(权重不匹配)

现象:加载yolov9-s.pt时提示键名错误
根因--cfg指定的yaml文件与权重不匹配
解决

  • 确保--cfg models/detect/yolov9-s.yaml--weights yolov9-s.pt版本一致
  • 微调时勿混用s/m/l不同尺寸配置

6.4 训练loss震荡剧烈

现象train/box_loss在0.02~0.15间大幅波动
根因:学习率过高或数据集质量差
解决

  • hyp.scratch-high.yaml中降低lr0(如0.010.005
  • 检查标签文件是否有坐标超出[0,1]范围(用脚本批量校验)

7. 总结:从训练到落地的关键认知

YOLOv9的威力不在参数量,而在其梯度路径设计——它让小模型也能抓住关键特征。但技术红利不会自动兑现,你需要建立三个关键认知:

  • 环境是地基,不是装饰conda activate yolov9不是仪式,是隔离CUDA上下文的必需操作;跳过这步,90%的报错都源于此。
  • 数据即规则,非输入data.yaml里的../data/images/train是相对路径协议,不是路径拼写错误;YOLOv9用路径约定替代配置解析,违反即失败。
  • 训练是实验,非流水线--batch 32不是魔法数字,是显存、数据量、收敛速度的三角平衡;每次换卡、换数据,都需重新压测。

当你完成第一次训练,看到mAP50突破0.75,那不仅是数字提升,更是你对目标检测工程逻辑的真正掌握。下一步,把best.onnx丢进你的Jetson Orin,让模型在产线上真正“看见”。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 5:03:12

1.3寸SH1106 OLED IIC驱动右移两列像素的硬件兼容性调整方案

1. 认识SH1106与SSD1306的硬件差异 第一次用1.3寸OLED屏时&#xff0c;我也踩过右边白边的坑。当时以为和常见的0.96寸屏一样直接套用SSD1306驱动&#xff0c;结果屏幕右侧总是多出两条"白线"。后来查资料才发现&#xff0c;虽然两者都是128x64分辨率&#xff0c;但S…

作者头像 李华
网站建设 2026/3/27 11:13:43

从零构建:TLV320AIC3101音频编解码器在嵌入式Linux中的全流程驱动开发

从零构建&#xff1a;TLV320AIC3101音频编解码器在嵌入式Linux中的全流程驱动开发 1. 音频系统架构与硬件设计基础 音频编解码器&#xff08;Codec&#xff09;在现代嵌入式系统中扮演着关键角色&#xff0c;负责模拟信号与数字信号之间的转换。TLV320AIC3101作为一款低功耗立…

作者头像 李华
网站建设 2026/3/18 1:34:04

Local AI MusicGen部署案例:低显存GPU实现AI作曲实战

Local AI MusicGen部署案例&#xff1a;低显存GPU实现AI作曲实战 1. 为什么你需要一个“本地”的AI作曲工具&#xff1f; 你有没有过这样的时刻&#xff1a;正在剪辑一段短视频&#xff0c;突然卡在了配乐上——找版权免费的音乐太耗时&#xff0c;定制又太贵&#xff0c;而自…

作者头像 李华
网站建设 2026/3/27 20:06:25

VibeVoice服务访问配置:局域网IP开放与本地调试方法详解

VibeVoice服务访问配置&#xff1a;局域网IP开放与本地调试方法详解 1. 为什么需要配置局域网访问&#xff1f; 你刚启动 VibeVoice&#xff0c;浏览器里输入 http://localhost:7860 一切正常——但当你换一台电脑&#xff0c;用同一局域网里的手机或笔记本打开 http://192.1…

作者头像 李华
网站建设 2026/3/26 19:53:33

SDXL 1.0高清成果:1536px分辨率下建筑砖纹与玻璃折射精度

SDXL 1.0高清成果&#xff1a;1536px分辨率下建筑砖纹与玻璃折射精度 1. 为什么1536px是建筑类图像的“临界清晰点” 你有没有试过用AI生成一栋老教堂的特写&#xff1f;砖缝歪斜、玻璃反光模糊、窗框边缘发虚——不是模型不行&#xff0c;而是分辨率卡在了“看得清”和“看得…

作者头像 李华