在计算机视觉领域,YOLOv5系列模型因其出色的性能和易用性广受欢迎。虽然YOLOv5最初以目标检测闻名,但其分类分支同样强大。本文将手把手教你如何在自己的数据集上训练YOLOv5分类模型,整个过程基于PyTorch框架实现。
我最近在一个工业质检项目中成功应用了这套方法,将产品缺陷分类准确率提升到了98.3%。下面分享的每个步骤都经过实际项目验证,包含你可能遇到的各种"坑"和解决方案。
推荐使用以下配置以获得最佳训练效率:
安装核心依赖包:
bash复制pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html
pip install yolov5==6.2 -U
注意:YOLOv5版本必须≥6.0才支持分类任务,早期版本仅含检测功能
YOLOv5分类训练要求特定的目录结构:
code复制custom_dataset/
├── train/
│ ├── class1/
│ │ ├── img1.jpg
│ │ └── img2.jpg
│ └── class2/
│ ├── img3.jpg
│ └── img4.jpg
└── val/
├── class1/
└── class2/
关键要点:
复制默认配置文件并修改:
python复制# 从YOLOv5仓库复制分类配置文件
cp models/yolov5s-cls.yaml models/custom-cls.yaml
# 主要修改参数
nc: 2 # 类别数
depth_multiple: 0.33 # 模型深度系数
width_multiple: 0.50 # 层宽度系数
使用以下命令开始训练:
bash复制python classify/train.py \
--model models/custom-cls.yaml \
--data ../custom_dataset \
--epochs 100 \
--img 224 \
--batch-size 64 \
--device 0 \
--workers 8
关键参数解析:
--img 224:输入图像统一缩放到224×224--batch-size:根据显存调整,建议占满显存的80%--workers:数据加载线程数,通常设为CPU核心数的2-4倍训练启动后会自动生成如下日志:
code复制Epoch gpu_mem loss acc val_loss val_acc
0 5.21G 1.2345 0.5678 1.1234 0.6789
1 5.21G 0.9876 0.7123 0.8765 0.7654
...
重点关注指标:
使用内置验证脚本:
bash复制python classify/val.py \
--weights runs/train-cls/exp/weights/best.pt \
--data ../custom_dataset \
--img 224
输出包含:
根据我的实战经验,这些技巧很有效:
yaml复制# 在data.yaml中增加
augment: True
augment_params:
hsv_h: 0.015 # 色调增强幅度
hsv_s: 0.7 # 饱和度增强幅度
hsv_v: 0.4 # 明度增强幅度
flipud: 0.5 # 上下翻转概率
bash复制--lr0 0.01 # 初始学习率
--lrf 0.01 # 最终学习率系数(0.01表示lr0*0.01)
bash复制--patience 10 # 验证指标10轮不提升则停止
导出ONNX格式便于部署:
bash复制python export.py \
--weights runs/train-cls/exp/weights/best.pt \
--include onnx \
--img 224
部署示例代码:
python复制import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', 'best.onnx')
results = model('test.jpg')
print(results.probs) # 输出各类别概率
--batch-size(建议从32开始尝试)--img-size(最低支持128×128)--workers减少数据加载瓶颈--adam优化器替代默认SGDbash复制--class-weights 1.0 2.0 # 为不同类别设置不同权重
我在实际项目中发现,工业场景下适当增加HSV增强参数(hsv_s=0.8, hsv_v=0.6)能显著提升模型对光照变化的鲁棒性。另外,当类别数超过20个时,建议将初始学习率(--lr0)降低到0.001以避免震荡。