我的第一个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_detect2.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.yamlimages/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确保内容如下(重点检查train和val路径):
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→ 过拟合,增加mosaic或copy_paste增强。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。