1. 环境准备:从零搭建YOLOv9开发环境

第一次接触YOLOv9时,我最头疼的就是环境配置。记得当时为了搞定CUDA和PyTorch的版本兼容问题,整整折腾了两天。现在把这些经验整理出来,帮你避开我踩过的那些坑。

1.1 创建Python虚拟环境

我强烈建议使用Anaconda来管理环境,这能避免把系统环境搞得一团糟。打开终端执行以下命令:

conda create -n yolov9 python=3.9.17
conda activate yolov9

这里选择Python 3.9.17是因为它和PyTorch的兼容性最好。实际测试中发现,用Python 3.10会遇到一些奇怪的依赖冲突。激活环境后,你会看到命令行提示符前面显示(yolov9),这表示环境已经切换成功。

1.2 安装PyTorch与CUDA

YOLOv9对PyTorch版本有严格要求,官方推荐使用2.0.1版本。根据显卡型号不同,CUDA版本也要对应选择:

conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia

这里有个关键点:30系及以上显卡必须使用CUDA 11+版本,20系显卡可以用10.2版本。安装完成后,用这段代码验证是否成功:

import torch
print(torch.__version__)
print(torch.cuda.is_available())

如果输出True,说明GPU加速已经启用。我遇到过因为驱动版本不匹配导致CUDA不可用的情况,这时候需要去NVIDIA官网更新显卡驱动。

1.3 安装其他依赖包

克隆官方仓库后,进入项目目录安装剩余依赖:

git clone https://github.com/WongKinYiu/yolov9
cd yolov9
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

国内用户建议加上清华源加速下载。有个常见错误是Pillow版本冲突,如果遇到字体相关报错,可以单独安装指定版本:

pip install Pillow==9.5.0

2. 数据集准备:打造自己的训练数据

去年做安防项目时,我需要训练一个检测危险物品的模型,当时在数据准备上花了大量时间。下面分享如何规范地准备自定义数据集。

2.1 数据标注与格式转换

YOLOv9支持两种标注格式:

  • YOLO格式:每个图像对应一个.txt文件,内容为"类别ID x_center y_center width height"
  • COCO格式:单个JSON文件包含所有标注信息

我推荐使用LabelImg进行标注,保存为YOLO格式。目录结构应该这样组织:

dataset/
├── images/
│   ├── train/
│   └── val/
└── labels/
    ├── train/
    └── val/

2.2 配置文件调整

创建data.yaml文件,内容示例:

train: /path/to/dataset/images/train
val: /path/to/dataset/images/val
names:
  0: person
  1: car
  2: traffic_light

关键点:类别名称必须按0开始的顺序排列。然后在models/detect/yolov9.yaml中修改nc参数为你的类别数量:

nc: 3  # 类别数量
depth_multiple: 1.0
width_multiple: 1.0

3. 模型训练:参数调优实战技巧

第一次训练YOLOv9时,我看到显存爆满的提示直接懵了。后来才发现batch size需要根据显卡调整。

3.1 启动训练命令

使用train_dual.py而不是train.py,这是YOLOv9的特殊之处:

python train_dual.py \
--batch 16 \
--epochs 100 \
--data data.yaml \
--cfg models/detect/yolov9.yaml \
--weights '' \
--device 0

参数说明:

  • batch:根据显存调整,24G显存可用16,12G建议用8
  • imgsz:默认640,检测小物体可增大到1280
  • hyp:超参数文件,新手先用hyp.scratch-high.yaml

3.2 训练监控与问题排查

训练开始后,终端会显示如下信息:

Epoch   gpu_mem       box       obj       cls    labels  img_size
  0/99     12.3G    0.1234    0.2345    0.0678       32       640

常见问题解决方案:

  1. 显存不足:减小batch size或imgsz
  2. 损失不下降:检查数据标注质量
  3. 训练波动大:调小学习率

建议用TensorBoard监控训练过程:

tensorboard --logdir runs/train

4. 模型验证与部署

训练完成后,在runs/train/exp/weights/下会生成best.pt和last.pt两个模型文件。

4.1 性能验证

使用val_dual.py评估模型:

python val_dual.py \
--data data.yaml \
--weights runs/train/exp/weights/best.pt \
--batch 16 \
--imgsz 640 \
--device 0

重点关注这些指标:

  • mAP@0.5:IoU阈值为0.5时的平均精度
  • mAP@0.5:0.95:不同IoU阈值下的平均精度
  • 推理速度:每张图的处理时间

4.2 实际检测演示

用detect_dual.py测试实际效果:

python detect_dual.py \
--weights runs/train/exp/weights/best.pt \
--source test.jpg \
--conf 0.25 \
--device 0

参数说明:

  • conf:置信度阈值,值越大检测越严格
  • save-txt:保存检测结果为YOLO格式
  • save-conf:在结果中保存置信度

我在工业质检项目中发现,对于小物体检测,把imgsz调到1280能提升约15%的召回率,但推理速度会下降40%。这需要根据实际需求权衡。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐