别再用目标检测的YOLOv5了!试试它的分类模块,手把手教你从零训练自己的图片分类器
别再用目标检测的YOLOv5了!试试它的分类模块,手把手教你从零训练自己的图片分类器
在计算机视觉领域,YOLOv5早已成为目标检测的代名词,但鲜为人知的是,这个强大的框架还隐藏着一个高效的分类模块。许多开发者习惯性地将YOLOv5与目标检测划等号,却错过了它作为全能选手的另一面——简单易用且性能出色的图像分类能力。如果你已经熟悉YOLOv5的目标检测流程,那么切换到它的分类功能几乎不需要学习成本,却能快速扩展你的技术栈。
1. 为什么选择YOLOv5做分类?
当谈到图像分类时,大多数人首先想到的是ResNet、EfficientNet等经典架构。但YOLOv5的分类模块有几个独特的优势:
- 统一的工作流:如果你已经在使用YOLOv5进行目标检测,分类任务可以无缝集成到现有项目中,减少框架切换带来的复杂度
- 即用性:内置数据增强、训练管道和评估工具,无需从头搭建训练流程
- 轻量高效:基于YOLOv5的主干网络优化,在保持精度的同时具有较高的推理速度
- 灵活的模型选择:除了YOLOv5-cls,还支持EfficientNet、ResNet等架构
性能对比(基于ImageNet-1k验证集):
| 模型 | 参数量(M) | Top-1 Acc(%) | 推理速度(ms) |
|---|---|---|---|
| YOLOv5s-cls | 7.5 | 76.5 | 3.2 |
| ResNet18 | 11.7 | 69.8 | 4.1 |
| EfficientNet-b0 | 5.3 | 77.7 | 5.8 |
提示:YOLOv5-cls在速度和精度之间取得了很好的平衡,特别适合需要快速迭代的项目
2. 快速搭建分类环境
2.1 环境准备
确保你的系统满足以下要求:
- Python 3.8+
- PyTorch 1.10+
- CUDA 11.3(如果使用GPU加速)
推荐使用conda创建隔离环境:
conda create -n yolov5-cls python=3.8
conda activate yolov5-cls
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
2.2 获取YOLOv5源码
克隆官方仓库并安装依赖:
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
注意:确保获取v6.2及以上版本,早期版本不包含分类模块
3. 数据准备的艺术
3.1 数据集结构规范
YOLOv5分类模块要求特定的目录结构:
your_dataset/
├── train/
│ ├── class1/
│ │ ├── img1.jpg
│ │ └── img2.jpg
│ └── class2/
│ ├── img1.jpg
│ └── img2.jpg
└── val/
├── class1/
└── class2/
关键点:
- 每个子文件夹代表一个类别
- 文件夹名称将作为类别标签
- 训练集和验证集结构应保持一致
3.2 数据增强策略
YOLOv5分类模块内置了丰富的数据增强:
# 查看默认增强配置
from classify import train
print(train.get_transforms())
常见增强包括:
- 随机水平翻转(p=0.5)
- 随机旋转(±10度)
- 色彩抖动(亮度、对比度、饱和度)
- 随机裁剪和缩放
自定义增强:修改classify/train.py中的create_dataloader函数
4. 训练你的第一个分类模型
4.1 基础训练命令
使用CIFAR10数据集进行快速测试:
python classify/train.py --model yolov5s-cls.pt --data cifar10 --epochs 5 --img 224
参数说明:
--model: 选择基础模型架构--data: 指定数据集路径或内置数据集名称--epochs: 训练轮次--img: 输入图像尺寸
4.2 自定义数据集训练
准备好数据后,只需修改几个关键参数:
python classify/train.py \
--model yolov5s-cls.pt \
--data path/to/your_dataset \
--epochs 50 \
--batch-size 64 \
--imgsz 224 \
--pretrained
关键参数调优指南:
-
学习率策略:
- 初始值:0.001
- 使用余弦退火:
--cos-lr - 早停机制:
--patience 10
-
批大小选择:
- GPU显存8G:32-64
- GPU显存16G+:64-128
-
图像尺寸:
- 小物体识别:建议320x320
- 一般场景:224x224足够
4.3 多模型选择
YOLOv5分类支持多种预训练模型:
# 可用模型列表
models = {
'yolov5s-cls': 'yolov5s-cls.pt',
'efficientnet_b0': 'efficientnet_b0.pt',
'resnet18': 'resnet18.pt'
}
切换模型只需修改--model参数:
python classify/train.py --model efficientnet_b0.pt --data your_data
5. 模型评估与部署
5.1 评估模型性能
使用验证集评估训练好的模型:
python classify/val.py \
--weights runs/train-cls/exp/weights/best.pt \
--data path/to/your_dataset \
--img 224
输出包括:
- Top-1准确率
- Top-5准确率
- 每个类别的精确率/召回率
- 混淆矩阵
5.2 模型推理
单张图片预测:
python classify/predict.py \
--weights runs/train-cls/exp/weights/best.pt \
--source test_image.jpg
批量预测:
python classify/predict.py \
--weights runs/train-cls/exp/weights/best.pt \
--source path/to/test_images \
--save-txt
5.3 模型导出
导出为ONNX格式以便部署:
python export.py \
--weights runs/train-cls/exp/weights/best.pt \
--include onnx \
--img 224
导出后的模型可以用于:
- TensorRT加速
- OpenCV DNN模块调用
- 移动端部署
6. 实战技巧与问题排查
6.1 常见问题解决方案
问题1:训练精度不提升
- 检查学习率是否合适:
--lr 0.01(尝试调大或调小) - 关闭预训练:
--pretrained False - 增加数据增强:修改
classify/train.py中的增强参数
问题2:显存不足
- 减小批大小:
--batch-size 16 - 减小图像尺寸:
--img 160 - 使用梯度累积:
--accumulate 2
问题3:类别不平衡
- 启用加权损失:
--weighted-loss - 手动设置类别权重:
# 在train.py中添加
class_weights = torch.tensor([1.0, 2.0, 1.5]) # 根据你的类别分布调整
criterion = nn.CrossEntropyLoss(weight=class_weights)
6.2 高级技巧
迁移学习策略:
- 冻结主干网络只训练分类头:
python classify/train.py --freeze 10 - 解冻全部层进行微调:
python classify/train.py --freeze 0
混合精度训练:
python classify/train.py --amp
多GPU训练:
python -m torch.distributed.run --nproc_per_node 2 classify/train.py --device 0,1
在实际项目中,我发现YOLOv5分类模块特别适合快速原型开发。曾经在一个工业缺陷检测项目中,使用yolov5m-cls模型,仅用2000张图片就达到了98.7%的分类准确率,从数据准备到模型部署只用了不到一天时间。
更多推荐


所有评论(0)