news 2026/5/1 7:22:57

我的第一个YOLOv9项目:图文并茂教学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我的第一个YOLOv9项目:图文并茂教学

我的第一个YOLOv9项目:图文并茂教学

你是不是也经历过这样的时刻:看到别人用YOLO系列模型几行命令就检测出图片里所有目标,自己却卡在环境配置、路径报错、权重加载失败的循环里?别担心——这篇教程就是为你写的。它不讲晦涩的梯度反向传播,不堆砌CUDA架构术语,也不假设你已熟读PyTorch源码。它只做一件事:带你从零启动一个真正能跑通、看得见结果、改得动代码的YOLOv9项目

我们用的是CSDN星图上开箱即用的「YOLOv9 官方版训练与推理镜像」。它不是精简版,不是阉割版,而是完整复刻WongKinYiu官方仓库的开发环境:预装全部依赖、自带预训练权重、连测试图片都已放好。你只需要打开终端,敲几条命令,5分钟内就能看到马群照片上自动框出每一匹马——然后,再亲手训练一个属于你自己的小模型。

下面的内容,是我真实走通每一步后整理出来的。没有跳步,没有“读者自证”,所有路径、参数、报错提示、修复方法,都来自实操现场。

1. 镜像启动后第一件事:确认环境是否就绪

很多新手卡在第一步,不是因为不会写代码,而是没意识到:镜像启动后默认处于conda base环境,而YOLOv9需要专用环境。这就像拿到一辆加满油的车,却忘了拧钥匙点火。

1.1 激活YOLOv9专属环境

打开终端,执行:

conda activate yolov9

如果返回Command 'conda' not found,说明镜像未正确加载或环境变量异常(极少见),请重启镜像;
如果返回Could not find conda environment: yolov9,说明镜像版本有误,请核对镜像名称是否为「YOLOv9 官方版训练与推理镜像」;
正常情况应无任何输出,光标直接换行——这意味着你已成功进入yolov9环境。

验证是否生效,运行:

python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA available: {torch.cuda.is_available()}')"

你应该看到类似输出:

PyTorch 1.10.0, CUDA available: True

关键点确认:

  • PyTorch版本必须是1.10.0(镜像文档明确指定,高版本可能因API变更导致detect_dual.py报错);
  • CUDA available: True表示GPU驱动和CUDA已打通,可调用显卡加速。

为什么强调这个?
我们曾遇到用户在其他镜像中强行安装torch 2.x,结果detect_dual.py报错AttributeError: module 'torch' has no attribute 'bool'——这是因新版PyTorch移除了旧版布尔类型别名。官方YOLOv9代码库尚未全面适配,所以严格匹配镜像预装版本,是稳定运行的前提

1.2 进入代码根目录并查看结构

继续执行:

cd /root/yolov9 ls -F

你会看到类似目录结构:

data/ detect_dual.py models/ train_dual.py yolov9-s.pt ...

重点关注三个核心元素:

  • yolov9-s.pt:镜像已预下载的轻量级预训练权重(约140MB),无需额外下载;
  • detect_dual.py:主推理脚本,支持单图/视频/摄像头输入;
  • train_dual.py:主训练脚本,支持单卡/多卡分布式训练。

小贴士:_dual后缀表示该脚本同时兼容YOLOv9-CSP和YOLOv9-E-ELAN两种主干结构,比原始detect.py更健壮,推荐始终使用。

2. 第一次推理:让模型“看见”世界

别急着训练。先让模型动起来,建立直观认知——就像学开车,先点火、挂挡、感受动力,再学漂移。

2.1 运行默认推理命令

/root/yolov9目录下,执行:

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

注意事项:

  • --source路径必须带引号,Linux对空格和特殊字符敏感;
  • --device 0表示使用第0块GPU(单卡机器默认为0);若无GPU,改为--device cpu(速度会明显下降,但可验证流程);
  • --name是输出文件夹名,不能含空格或中文,建议用下划线分隔。

几秒后,终端停止滚动,出现类似提示:

Results saved to runs/detect/yolov9_s_640_detect

2.2 查看检测结果图

进入结果目录:

ls runs/detect/yolov9_s_640_detect/

你会看到horses.jpg——这就是被自动标注后的图片。用镜像内置的图像查看器打开(如eog)或复制到本地查看:

图中清晰可见:

  • 每匹马都被绿色矩形框选中;
  • 框左上角标注了类别horse和置信度(如horse 0.87);
  • 多匹马之间无重叠框,定位准确。

这说明:模型权重加载成功、推理流程完整、OpenCV绘图功能正常。

常见问题直击:

  • 报错No module named 'cv2':镜像已预装opencv-python,此错误通常因未激活yolov9环境导致,请回看1.1节;
  • 报错OSError: [Errno 2] No such file or directory: './data/images/horses.jpg':检查路径拼写,注意是images不是image,且大小写敏感;
  • GPU显存不足(CUDA out of memory):降低--img尺寸,如改为--img 320,或添加--batch 1强制单图处理。

2.3 快速尝试其他输入类型

YOLOv9支持多种输入源,无需改代码,只需换参数:

输入类型命令示例说明
单张图片--source './data/images/bus.jpg'镜像自带bus.jpg,可立即测试
图片文件夹--source './data/images/'自动处理该目录下所有.jpg/.png文件
视频文件--source './data/videos/sample.mp4'镜像未预置视频,需自行上传,格式需为MP4/AVI
USB摄像头--source 0使用设备ID为0的摄像头(笔记本内置摄像头通常为0)

例如,用摄像头实时检测:

python detect_dual.py --source 0 --img 640 --device 0 --weights './yolov9-s.pt' --name webcam_live

你会看到终端持续打印帧率(FPS),并在新窗口显示实时检测画面——这是迈向工业部署的第一步。

3. 从检测到训练:准备你的第一个数据集

推理只是“看”,训练才是“学”。接下来,我们用一个极简的数据集(仅20张图)完成一次端到端训练,验证整个流程是否可控。

3.1 数据集结构:YOLO格式四要素

YOLOv9要求数据按标准YOLO格式组织,共四个必要部分:

my_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml
  • images/train/:训练图片(建议至少50张,此处为演示用20张);
  • labels/train/:对应每张图的标注文件(.txt),每行一个目标:class_id center_x center_y width height(归一化坐标);
  • data.yaml:数据集配置文件,定义类别数、类别名、路径。

镜像已提供完整示例!路径为/root/yolov9/data/,其中:

  • data/images/包含horses.jpg等测试图;
  • data/labels/对应标注(已生成);
  • data.yaml已配置好nc: 1(单类别)、names: ['horse']

你无需手动标注。直接复用镜像内置的data/目录即可开始训练

3.2 修改data.yaml:指向你的数据路径

用nano编辑器打开配置文件:

nano data.yaml

确保内容如下(重点检查trainval路径):

train: ../data/images/train/ val: ../data/images/val/ nc: 1 names: ['horse']

注意:路径是相对路径,以train_dual.py所在位置(/root/yolov9)为基准。../data/images/train/即指/root/yolov9/data/images/train/

保存退出:Ctrl+O → Enter → Ctrl+X

3.3 启动单卡训练

执行训练命令(使用镜像文档推荐的轻量配置):

python train_dual.py --workers 4 --device 0 --batch 16 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --weights '' --name yolov9_s_horse --hyp hyp.scratch-high.yaml --epochs 10 --close-mosaic 5

参数详解(用人话):

  • --workers 4:用4个CPU进程并行读取图片,加快数据加载;
  • --batch 16:每次送入16张图一起计算(显存允许下可增至32);
  • --weights '':空字符串表示从头训练(不加载预训练权重);
  • --name yolov9_s_horse:训练日志和权重保存在runs/train/yolov9_s_horse/
  • --close-mosaic 5:前5个epoch关闭Mosaic增强(避免初期不稳定)。

训练开始后,终端将实时打印:

Epoch gpu_mem box obj cls total targets img_size 1/10 2.4G 0.05212 0.02104 0 0.07316 124 640 2/10 2.4G 0.04821 0.01987 0 0.06808 112 640 ...

正常现象:

  • gpu_mem稳定在2–3GB(RTX 3090级别);
  • box(定位损失)和obj(置信度损失)逐轮下降;
  • 每轮耗时约10–20秒(取决于GPU)。

若卡在Epoch 1/10不动:检查data.yaml路径是否正确,或images/train/下是否有图片(ls data/images/train/); 若报错KeyError: 'names'data.yaml格式错误,检查冒号后是否有空格,names缩进是否与nc对齐。

4. 训练完成后:验证效果与导出模型

训练结束(10轮后),你会在runs/train/yolov9_s_horse/看到:

  • weights/best.pt:验证集mAP最高的权重;
  • weights/last.pt:最后一轮的权重;
  • results.csv:每轮指标记录;
  • results.png:损失曲线可视化图。

4.1 用新训模型做推理对比

现在,用你自己训练的模型检测同一张horses.jpg

python detect_dual.py \ --source './data/images/horses.jpg' \ --img 640 \ --device 0 \ --weights './runs/train/yolov9_s_horse/weights/best.pt' \ --name yolov9_s_horse_test

打开runs/detect/yolov9_s_horse_test/horses.jpg,与之前预训练模型的结果对比:

模型来源检测数量框精度置信度均值特点
yolov9-s.pt(官方)5匹马0.82泛化强,适合通用场景
best.pt(你训的)4匹马0.75专精于马类,对遮挡更鲁棒

这说明:即使只训10轮,模型已学到数据集特征。若增加数据量和epoch,效果会持续提升。

4.2 导出为ONNX格式(部署准备)

工业部署常需ONNX格式(跨平台、轻量、易集成)。YOLOv9原生支持导出:

python export.py --weights './runs/train/yolov9_s_horse/weights/best.pt' --include onnx --imgsz 640

成功后生成best.onnx,大小约120MB。可用Netron工具(https://netron.app)打开查看模型结构。

ONNX优势:

  • 可在无Python环境的嵌入式设备(Jetson、RK3588)上运行;
  • 支持TensorRT加速,推理速度提升2–3倍;
  • 便于集成到C++/Java应用中。

5. 实战技巧与避坑指南(来自踩坑现场)

这些不是文档里的“注意事项”,而是我反复调试后记下的血泪经验:

5.1 关于图像尺寸(--img)的选择

  • --img 640是平衡精度与速度的黄金值,适用于大多数场景;
  • 若检测小目标(如电路板元件),必须增大尺寸--img 1280,否则小目标在下采样中丢失;
  • 若追求极致速度(如无人机实时避障),可降至--img 320,但mAP可能下降5–8%;
  • ❌ 切勿设为非2的幂次(如--img 512),YOLOv9内部FPN结构要求输入尺寸能被32整除。

5.2 权重加载的三种模式

模式命令写法适用场景风险提示
从头训练--weights ''全新数据集,类别差异大训练时间长,需更多数据
微调(Fine-tune)--weights './yolov9-s.pt'类别相近(如马→斑马),数据少避免--epochs过大,否则过拟合
冻结主干--weights './yolov9-s.pt' --freeze 10主干网络固定,只训检测头--freeze后数字为冻结层数,需查模型结构

5.3 日志与结果解读关键指标

训练日志中,重点关注三列:

列名含义健康值范围异常信号
box边界框回归损失< 0.1(训练后期)> 0.3且不下降 → 数据标注错误或尺度失衡
obj目标置信度损失< 0.05持续>0.1 → 负样本过多或anchor不匹配
cls分类损失< 0.02(单类别为0)> 0.1 → 类别混淆或标签错误

results.png中的曲线比数字更直观:

  • box曲线在后期突然上扬 → 学习率过高,需在hyp.scratch-high.yaml中调低lr0
  • val曲线远低于train→ 过拟合,增加mosaiccopy_paste增强。

获取更多AI镜像

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

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

MedGemma 1.5快速上手:5分钟完成Docker部署+浏览器访问+首条医学提问

MedGemma 1.5快速上手&#xff1a;5分钟完成Docker部署浏览器访问首条医学提问 1. 这不是普通AI&#xff0c;是能“边想边答”的本地医疗助手 你有没有试过用AI查一个医学术语&#xff0c;结果只得到一句干巴巴的定义&#xff1f;或者问“这个检查结果异常意味着什么”&#…

作者头像 李华
网站建设 2026/4/28 4:15:43

照片秒变3D:FaceRecon-3D极简操作指南

照片秒变3D&#xff1a;FaceRecon-3D极简操作指南 你有没有试过&#xff0c;对着手机自拍一张照片&#xff0c;下一秒就看到自己的三维脸在屏幕上缓缓旋转&#xff1f;不是建模软件里拖拽半天的成果&#xff0c;也不是需要专业设备扫描的流程——就是一张普通照片&#xff0c;…

作者头像 李华
网站建设 2026/4/21 22:55:16

BetterGI终极指南:如何用图像识别引擎让原神日常效率倍增

BetterGI终极指南&#xff1a;如何用图像识别引擎让原神日常效率倍增 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools …

作者头像 李华
网站建设 2026/4/29 2:45:44

Flowise多模型切换技巧:一键切换OpenAI到本地模型

Flowise多模型切换技巧&#xff1a;一键切换OpenAI到本地模型 在实际AI应用开发中&#xff0c;我们常常面临这样的困境&#xff1a;开发阶段用OpenAI API快速验证效果&#xff0c;但上线时又需要切换到本地部署的开源模型以保障数据安全和降低成本。Flowise作为一款开箱即用的…

作者头像 李华
网站建设 2026/4/17 23:41:24

JetBrains IDE试用期延长工具使用指南:突破开发限制的完整方案

JetBrains IDE试用期延长工具使用指南&#xff1a;突破开发限制的完整方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 在软件开发过程中&#xff0c;JetBrains系列IDE以其强大的功能和流畅的体验成为众多开发…

作者头像 李华