4. 模型训练实战:YOLOv8训练参数详解与Loss曲线调优
训练一个能用的YOLOv8模型,说白了就是调好那一堆参数。我见过不少新手,上来就用默认参数跑,Loss曲线跟心电图似的,还问我为什么模型不收敛。嗯,今天咱们就把这些参数掰开揉碎了讲清楚。
核心观点:训练参数不是玄学,每个参数都有它存在的理由。理解它们,你就能让模型乖乖听话。
4.1 训练参数全景图
YOLOv8的训练参数大概分四类:数据相关、模型结构、优化策略、硬件适配。我习惯把它们列成一张表,方便对照。
| 参数名 | 默认值 | 我的常用范围 | 一句话解释 |
|---|---|---|---|
epochs |
100 | 100-300 | 模型看几遍全部数据 |
batch |
16 | 8-64 | 一次喂多少张图 |
imgsz |
640 | 416-1280 | 输入图片缩放到多大 |
lr0 |
0.01 | 0.001-0.01 | 初始学习率 |
lrf |
0.01 | 0.01-0.1 | 最终学习率(衰减到多少) |
momentum |
0.937 | 0.9-0.98 | 动量,帮模型跳出局部最优 |
weight_decay |
0.0005 | 0.0001-0.001 | 权重衰减,防过拟合 |
warmup_epochs |
3.0 | 3-5 | 预热阶段,让学习率慢慢爬升 |
patience |
50 | 20-100 | 早停耐心值,Loss不降就停 |
我的习惯:刚开始跑项目时,我会先用小数据集、少epochs跑一轮,看看Loss能不能降下去。能降,再加大数据量和epochs。这叫「快速验证」,能省不少时间。
4.2 训练命令与参数传递
YOLOv8的训练命令很简洁。你可以在命令行直接传参,也可以写一个YAML配置文件。我个人更推荐后者,方便复现。
# 命令行方式
yolo train model=yolov8n.pt data=coco128.yaml epochs=100 imgsz=640 batch=16
# 使用配置文件(推荐)
yolo train model=yolov8n.pt data=coco128.yaml cfg=my_config.yaml
配置文件长这样:
# my_config.yaml
epochs: 150
batch: 32
imgsz: 640
lr0: 0.005
lrf: 0.01
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 3
patience: 30
augment: True
cos_lr: True
val: True
save: True
device: 0
注意:batch size不是越大越好。显存不够时,模型会直接OOM(Out of Memory)。我曾经在8G显存的卡上试图跑batch=64,结果训练到一半直接崩了。后来改成batch=16,配合梯度累积,才跑起来。
4.3 训练过程可视化:TensorBoard
训练时干等可不行。你得看着Loss曲线、mAP曲线,才能知道模型学得怎么样。YOLOv8默认集成了TensorBoard,训练完会自动生成日志。
启动TensorBoard的命令:
tensorboard --logdir runs/detect/train
然后在浏览器打开 http://localhost:6006。你会看到这些关键图表:
- train/box_loss:边界框回归损失。越低越好。
- train/cls_loss:分类损失。越低越好。
- train/dfl_loss:分布聚焦损失。YOLOv8特有的,越低越好。
- metrics/mAP50:IoU阈值0.5时的平均精度。越高越好。
- metrics/mAP50-95:更严格的精度指标。越高越好。
- lr:学习率变化曲线。
怎么看?我一般先看Loss曲线是否平滑下降。如果剧烈震荡,说明学习率太高或batch太小。如果Loss降不下去,可能是模型容量不够或数据有问题。
4.4 Loss曲线分析与调优
Loss曲线是模型训练的「心电图」。读懂它,你就能对症下药。下面是我总结的几种常见情况:
| 曲线特征 | 可能原因 | 我的调优方案 |
|---|---|---|
| Loss不降,一直高位震荡 | 学习率太大;数据标签有误 | 降低lr0到0.001;检查标注文件 |
| Loss下降缓慢,像蜗牛爬 | 学习率太小;模型太小 | 增大lr0到0.01;换大模型如yolov8m |
| Loss先降后升,V形反弹 | 过拟合;学习率衰减太快 | 增加weight_decay;调大lrf |
| Loss曲线锯齿状,剧烈抖动 | batch太小;数据噪声大 | 增大batch;检查数据质量 |
| Loss降到一定程度不再下降 | 模型容量到瓶颈;数据量不足 | 换大模型;数据增强;增加数据 |
举个例子。我之前做一个安防项目,检测行人。训练到第50个epoch时,Loss突然反弹。我一看,原来是学习率衰减得太快,模型在局部最优附近来回震荡。我把lrf从0.01改成0.1,让学习率衰减得慢一些,Loss曲线就稳住了。
4.5 知识结构图:训练调优流程
下面这张图是我自己总结的训练调优流程。每次开始新项目,我都会按这个思路走一遍。
4.6 实战调优案例
我记得有一次做工厂安全帽检测。训练了50个epoch,Loss曲线一直下不去,mAP只有0.3。我检查了数据,发现标注框有很多漏标。修正标注后,重新训练,Loss曲线立刻开始下降,最终mAP到了0.85。
另一个案例是检测夜间车辆。训练时Loss曲线锯齿状抖动,我一开始以为是学习率问题。后来发现是数据集中夜间图片太少,模型学不到特征。我增加了夜间数据,并用了Mosaic数据增强,Loss曲线就平滑了。
总结一下:Loss曲线是模型训练的「晴雨表」。学会看它,你就能在训练过程中及时发现问题,而不是等到最后才发现模型不work。调优不是一蹴而就的,需要反复尝试。但有了这张流程图和参数表,你至少有了方向。