1. 项目概述
计算机视觉领域的目标检测技术近年来发展迅猛,其中YOLO(You Only Look Once)系列算法因其出色的实时性和准确性备受关注。作为一名长期从事计算机视觉开发的工程师,我经常被问到如何从零开始构建一个YOLO模型。今天我就来详细分享YOLO数据集制作与模型训练的全流程实战经验,这些方法在我参与的多个工业检测项目中都得到了验证。
2. 核心需求解析
2.1 为什么选择YOLO
YOLO算法最大的优势在于其单阶段检测的设计理念。相比传统的两阶段检测器(如Faster R-CNN),YOLO将目标检测视为一个回归问题,直接在网络输出层预测边界框和类别概率。这种设计使得YOLOv5在Tesla V100上能达到140FPS的推理速度,非常适合需要实时处理的场景。
2.2 典型应用场景
在实际项目中,YOLO常用于:
- 工业质检:电子元件缺陷检测
- 安防监控:异常行为识别
- 自动驾驶:行人车辆检测
- 医疗影像:病灶区域定位
3. 数据集制作全流程
3.1 数据采集规范
根据我的项目经验,采集数据时需要注意:
- 光照条件:确保覆盖各种光照场景
- 拍摄角度:多角度采集提升模型鲁棒性
- 背景复杂度:适当包含复杂背景样本
- 目标尺寸:包含远、中、近不同距离的样本
重要提示:建议原始数据量至少是预期标注量的3倍,因为后期需要筛选优质样本。
3.2 标注工具选型
常用标注工具对比:
| 工具名称 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| LabelImg | 开源免费 | 功能简单 | 小规模项目 |
| CVAT | 支持视频标注 | 部署复杂 | 专业团队 |
| Makesense.ai | 在线使用 | 依赖网络 | 临时需求 |
我个人推荐使用LabelImg,它的标注文件直接兼容YOLO格式。安装命令:
bash复制pip install labelImg
labelImg
3.3 标注规范详解
标注时需要特别注意:
- 边界框要紧贴目标边缘
- 避免框选过多背景区域
- 同类目标使用相同标签名称
- 对于遮挡目标,按可见部分标注
标注完成后会生成.txt文件,内容格式示例:
code复制0 0.5 0.5 0.2 0.3 # 类别ID 中心x 中心y 宽度 高度
4. 数据预处理技巧
4.1 数据增强策略
在yolov5/data/hyps/hyp.scratch.yaml中可以配置:
yaml复制hsv_h: 0.015 # 色调增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 10 # 旋转角度
translate: 0.1 # 平移比例
scale: 0.9 # 缩放比例
4.2 数据集划分建议
典型划分比例:
- 训练集:70%
- 验证集:20%
- 测试集:10%
对于小样本数据集(<1000张),建议使用5折交叉验证。
5. 模型训练实战
5.1 环境配置
推荐使用conda创建虚拟环境:
bash复制conda create -n yolo python=3.8
conda activate yolo
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
5.2 参数调优经验
关键训练参数解析:
python复制--img 640 # 输入图像尺寸
--batch 16 # 根据GPU显存调整
--epochs 100 # 通常100-300
--data data.yaml # 数据集配置文件
--cfg models/yolov5s.yaml # 模型结构
--weights yolov5s.pt # 预训练权重
5.3 训练监控技巧
使用TensorBoard监控训练过程:
bash复制tensorboard --logdir runs/train
重点关注三个指标:
- mAP@0.5: 常见目标检测指标
- Precision: 查准率
- Recall: 查全率
6. 模型评估与优化
6.1 评估指标解读
- mAP@0.5: IoU阈值为0.5时的平均精度
- mAP@0.5:0.95: IoU阈值从0.5到0.95的平均精度
- F1-score: 精确率和召回率的调和平均
6.2 常见问题解决方案
-
过拟合现象:
- 增加数据增强
- 添加Dropout层
- 使用早停策略
-
欠拟合处理:
- 增加训练轮次
- 使用更大的模型
- 减少正则化强度
7. 模型部署实践
7.1 导出为ONNX格式
python复制python export.py --weights runs/train/exp/weights/best.pt --include onnx
7.2 部署性能优化
- 使用TensorRT加速:
bash复制trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.engine
- 量化压缩:
python复制torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)
8. 实战经验分享
在最近的一个PCB缺陷检测项目中,我们遇到了小目标检测的挑战。通过以下改进将mAP提升了15%:
- 使用更高分辨率的输入(1280x1280)
- 在Backbone中添加SPP模块
- 采用K-Means重新聚类Anchor尺寸
- 添加注意力机制
另一个常见问题是类别不平衡。对于这种情况,我通常会:
- 对少数类样本进行过采样
- 使用Focal Loss
- 调整类别权重
训练过程中如果遇到显存不足,可以尝试:
- 减小batch size
- 使用梯度累积
- 启用混合精度训练
最后分享一个实用技巧:在部署时,将模型输入尺寸调整为训练尺寸的整数倍(如640→640或1280→1280),可以避免因resize导致的精度损失。