3、YOLOv8模型训练:自定义数据集准备、数据标注格式(COCO/YOLO)、训练超参数调优

好,咱们进入实战环节。前面聊了那么多理论,现在终于要动手了。这一章,我带你走一遍YOLOv8训练的全流程——从原始视频到能跑起来的模型。说白了,就是教你怎么喂数据给模型,再把它调教得服服帖帖。

3.1 自定义数据集准备:从行车记录仪到训练样本

做ADAS,最头疼的就是数据。你想想看,路上跑的车辆、行人、自行车,还有各种奇奇怪怪的障碍物,都得让模型认识。我刚开始做这个项目时,天真地以为网上随便下个数据集就能用,结果模型在高速上把路边的垃圾桶当成了行人...嗯,那场面,挺尴尬的。

我的经验: 别偷懒,一定要采集自己场景的数据。高速场景和城市道路的数据分布完全不同,泛化能力没那么神。

数据采集有几个要点:

  • 场景多样性:晴天、雨天、夜晚、隧道、逆光,都得有。我有个项目就是吃了这个亏,模型在隧道口直接罢工了。
  • 分辨率与帧率:建议至少1080p,30fps以上。太低的话,远处的小目标根本看不清。
  • 标注策略:不是每帧都标,那样太费人力。我一般隔5-10帧抽一帧,既能覆盖运动变化,又不会数据冗余。

3.2 数据标注格式:COCO vs YOLO,选哪个?

标注格式这事儿,其实没那么玄乎。COCO和YOLO,说白了就是坐标表示方式不一样。

对比项 COCO格式 YOLO格式
坐标表示 左上角(x,y) + 宽高(w,h) 中心点(x,y) + 宽高(w,h)
归一化 像素绝对值 相对图像尺寸(0~1)
存储方式 JSON文件 每张图一个txt文件
适用场景 通用检测、实例分割 YOLO系列专用

我个人习惯用YOLO格式。为什么?因为YOLOv8原生支持,省去转换的麻烦。而且txt文件比JSON轻量多了,你想想看,一个数据集几万张图,JSON文件能大到几百兆,而txt文件加起来也就几十兆。

YOLO格式示例(每行一个目标):

# class_id center_x center_y width height (全部归一化到0~1)
0 0.5 0.6 0.1 0.15
1 0.3 0.4 0.08 0.12

这里要注意:类别ID从0开始。我见过有人从1开始标,结果模型训练出来,预测结果全错位了。这种低级错误,排查起来特别费时间。

3.3 数据集目录结构:别让路径搞死你

目录结构这事儿,看似简单,但坑不少。我建议按YOLO官方推荐的结构来:

dataset/
├── images/
│   ├── train/    # 训练集图片
│   ├── val/      # 验证集图片
│   └── test/     # 测试集图片(可选)
├── labels/
│   ├── train/    # 训练集标签
│   ├── val/      # 验证集标签
│   └── test/     # 测试集标签
└── data.yaml     # 数据集配置文件

data.yaml文件长这样:

train: ./dataset/images/train
val: ./dataset/images/val
test: ./dataset/images/test

nc: 3  # 类别数量
names: ['car', 'pedestrian', 'cyclist']  # 类别名称
避坑指南: 我曾经因为路径写成了绝对路径,结果换台电脑训练,路径全废了。建议用相对路径,或者用环境变量动态拼接。

3.3 训练超参数调优:别让默认参数坑了你

YOLOv8的默认参数其实挺良心的,但ADAS场景特殊,得微调。我总结了一套调参思路,分享给你。

3.3.1 学习率(lr)

默认是0.01。但如果你数据集小(比如不到1000张),建议降到0.001。为什么?因为数据少,模型容易过拟合,学习率大了直接震荡。我有个项目,数据只有500张,用默认学习率训练,loss曲线像心电图一样...后来降到0.001,稳了。

3.3.2 Batch Size

这个看显存。我一般用16或32。但要注意:batch size越大,模型收敛越慢。你想想看,每次更新参数前要看更多样本,步子自然就小了。如果显存够,我建议用16,平衡速度和稳定性。

3.3.3 Epochs

ADAS场景,我建议至少300个epoch。别嫌多,因为小目标(比如远处的行人)需要更多迭代才能学到位。我一般用早停法(Early Stopping),patience设50个epoch,loss不降了就停。

3.3.4 数据增强参数

YOLOv8自带了很多增强策略,比如马赛克、翻转、色彩抖动。对于ADAS,我建议:

  • 马赛克增强:打开,但mosaic=1.0有点猛,我一般降到0.5。不然模型容易学偏。
  • 翻转:水平翻转打开,垂直翻转别开。你想想,路上哪有车是倒着开的?
  • 色彩抖动:hsv_h、hsv_s、hsv_v适当调大,能提升光照鲁棒性。
我的调参口诀: 先小后大(从小学习率开始),先粗后细(先用默认参数跑通,再微调)。别一上来就调参,先看看模型能不能正常收敛。

3.4 训练命令与监控

训练命令很简单:

yolo train model=yolov8n.pt data=data.yaml epochs=300 batch=16 lr0=0.001

训练过程中,我习惯用TensorBoard监控:

tensorboard --logdir runs/detect/train

主要看三个指标:

  • train/loss:训练损失,应该稳步下降
  • val/mAP:验证集精度,如果震荡很大,说明学习率高了
  • learning_rate:看看学习率变化是否符合预期
曾经踩过的坑: 我有一回训练到一半,loss突然飙升。排查了半天,发现是数据标注出了问题——有个类别的ID标错了。所以,训练前一定要做数据校验,跑个可视化脚本看看标注对不对。

3.5 模型评估与导出

训练完,别急着部署。先看看模型在验证集上的表现:

yolo val model=runs/detect/train/weights/best.pt data=data.yaml

重点关注mAP@0.5和mAP@0.5:0.95。对于ADAS,我要求mAP@0.5至少0.85以上,不然不敢上车。

最后导出模型:

yolo export model=runs/detect/train/weights/best.pt format=onnx

ONNX格式通用性好,后续部署到TensorRT或者OpenVINO都方便。

好了,这一章的内容就到这儿。数据准备和训练调参,说白了就是「喂好数据、调好参数」。下一章,咱们聊聊模型剪枝和量化,让模型在嵌入式设备上跑得更快。