YOLOv5 v3.0 自定义数据集训练:从VOC格式转换到模型部署的5个关键步骤
1. 数据准备与VOC格式解析
在计算机视觉项目中,数据是模型性能的基石。对于目标检测任务,VOC(Visual Object Classes)格式是广泛使用的标注标准之一。典型的VOC数据集目录结构如下:
VOCdevkit/
├── Annotations/ # 存放XML标注文件
├── ImageSets/
│ └── Main/ # 数据集划分文件(train.txt, val.txt等)
└── JPEGImages/ # 原始图像文件
关键操作步骤 :
-
使用
labelImg工具标注图像,生成XML文件 -
确保每个XML文件包含完整的对象边界框信息:
<object> <name>person</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> </object>
注意:标注时应避免边界框超出图像范围,这会导致后续转换出现问题
2. VOC到YOLO格式的转换
YOLOv5要求特定的标注格式:每个图像对应一个.txt文件,每行包含归一化的类别和坐标信息。转换时需要处理三个核心问题:
- 坐标归一化 :将绝对坐标转换为相对坐标(0-1范围)
- 类别索引映射 :将类别名称转换为数字索引
- 边界框修正 :处理越界标注
转换脚本核心逻辑 :
def convert(size, box):
""" 将VOC格式的边界框转换为YOLO格式 """
dw = 1./size[0] # 宽度归一化因子
dh = 1./size[1] # 高度归一化因子
x = (box[0] + box[1])/2.0 - 1 # 中心点x坐标
y = (box[2] + box[3])/2.0 - 1 # 中心点y坐标
w = box[1] - box[0] # 边界框宽度
h = box[3] - box[2] # 边界框高度
# 归一化处理
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
常见问题解决方案 :
- ZeroDivisionError :检查图像尺寸是否为0
-
越界标注
:添加边界检查代码
if bbox[2] > width: bbox[2] = width if bbox[3] > height: bbox[3] = height
3. 数据集配置与划分
合理的训练集/验证集划分对模型评估至关重要。推荐的数据集配置如下:
| 文件类型 | 比例 | 作用 |
|---|---|---|
| train.txt | 70% | 模型训练 |
| val.txt | 20% | 超参数调优 |
| test.txt | 10% | 最终评估 |
data.yaml配置示例 :
# 训练和验证图像路径
train: ../dataset/images/train/
val: ../dataset/images/val/
# 类别数量
nc: 3
# 类别名称
names: ['cat', 'dog', 'person']
提示:路径建议使用相对路径,便于项目迁移
4. 模型训练与调优
YOLOv5 v3.0提供了多种预定义模型架构,选择策略如下:
| 模型类型 | 参数量 | 适用场景 |
|---|---|---|
| yolov5s | 7.2M | 移动端/嵌入式 |
| yolov5m | 21.2M | 通用场景 |
| yolov5l | 46.5M | 高性能需求 |
训练命令示例 :
python train.py --img 640 --batch 16 --epochs 300 \
--data data/custom.yaml \
--cfg models/yolov5s.yaml \
--weights yolov5s.pt \
--device 0
关键参数说明 :
-
--img:输入图像尺寸(必须为32的倍数) -
--batch:根据GPU显存调整(典型值:8-64) -
--epochs:中小数据集建议300-500轮
训练监控技巧 :
-
使用TensorBoard观察损失曲线:
tensorboard --logdir=runs - 关注mAP@0.5指标的变化趋势
- 早停机制(patience=100)可防止过拟合
5. 模型部署与推理
训练完成后,最佳模型保存在
runs/train/exp/weights/best.pt
。部署时考虑以下因素:
推理性能优化 :
-
使用半精度推理(FP16)提升速度:
model = torch.load('best.pt', map_location=device).half() - 调整置信度阈值平衡精度与召回率
- 使用ONNX格式实现跨平台部署
典型推理代码 :
import torch
# 加载模型
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
# 推理
results = model('input.jpg')
# 结果解析
predictions = results.pandas().xyxy[0]
for _, row in predictions.iterrows():
print(f"检测到 {row['name']}, 置信度: {row['confidence']:.2f}")
部署方案对比 :
| 方案 | 延迟 | 硬件需求 | 适用场景 |
|---|---|---|---|
| PyTorch原生 | 中 | GPU | 开发测试 |
| ONNX Runtime | 低 | CPU/GPU | 生产环境 |
| TensorRT | 最低 | NVIDIA GPU | 边缘设备 |
在实际项目中,我们发现YOLOv5 v3.0相比前代有显著优势:训练速度提升约40%,模型体积减小35%,特别适合资源受限的应用场景。对于自定义数据集,关键是要确保标注质量和数据多样性,这是模型性能的根本保证。
971

被折叠的 条评论
为什么被折叠?



