4. 模型训练入门:配置文件解析与训练命令详解
训练一个YOLO模型,说白了就是让模型学会「看」数据。但很多人一上来就敲命令,结果跑出来的模型要么不收敛,要么精度惨不忍睹。我刚开始带项目时也踩过这个坑——后来才发现,问题往往出在配置文件上。
这一章,咱们就把训练前的准备工作掰开揉碎。从配置文件到训练命令,再到怎么看懂那些让人头疼的日志,一条龙讲清楚。
4.1 配置文件解析:data.yaml 和 hyp.yaml
YOLO的训练配置主要靠两个文件:data.yaml 和 hyp.yaml。前者告诉模型「数据在哪儿、长什么样」,后者告诉模型「怎么学、学多快」。
4.1.1 data.yaml:数据集的「身份证」
这个文件结构很简单,但每个字段都别写错。我见过有人把路径写成了相对路径,结果换台机器就报错。
# data.yaml 示例
train: /data/datasets/coco/train2017 # 训练集图片路径
val: /data/datasets/coco/val2017 # 验证集图片路径
test: /data/datasets/coco/test2017 # 测试集(可选)
nc: 80 # 类别数量
names: ['person', 'bicycle', 'car', ...] # 类别名称列表
关键字段说明:
- train/val/test:建议用路径,或者用环境变量拼接。我习惯在项目根目录建一个
env.sh,统一管理路径。 - nc:类别数,必须和
names列表长度一致。少一个都不行。 - names:顺序很重要!训练时类别索引从0开始,推理时也是按这个顺序输出。
注意: 如果你的数据集是YOLO格式(每张图对应一个txt标签文件),确保标签文件里的类别索引在 0 ~ nc-1 范围内。我曾经接手过一个项目,标签里出现了 class_id = 80,但 nc=80,结果训练直接崩了。
4.1.2 hyp.yaml:超参数的「调音台」
这个文件控制着训练过程的「手感」。默认的 hyp.yaml 在YOLOv5/v8的仓库里都有,但直接拿来用往往不是最优解。
# hyp.yaml 关键参数(以YOLOv8为例)
lr0: 0.01 # 初始学习率
lrf: 0.01 # 最终学习率(余弦退火)
momentum: 0.937 # SGD动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3.0 # 预热轮数
warmup_momentum: 0.8
warmup_bias_lr: 0.1
box: 7.5 # 框损失权重
cls: 0.5 # 分类损失权重
dfl: 1.5 # 分布焦点损失权重
hsv_h: 0.015 # 色调增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 0.0 # 旋转角度
translate: 0.1 # 平移
scale: 0.5 # 缩放
shear: 0.0 # 剪切
perspective: 0.0 # 透视
flipud: 0.0 # 上下翻转
fliplr: 0.5 # 左右翻转
mosaic: 1.0 # Mosaic增强
mixup: 0.0 # MixUp增强
| 参数 | 作用 | 我的经验值 |
|---|---|---|
lr0 |
初始学习率,太大不收敛,太小训练慢 | 小模型用0.01,大模型用0.001 |
warmup_epochs |
前N轮用低学习率预热,防止梯度爆炸 | 3轮够用,数据集大可以加到5轮 |
mosaic |
把4张图拼成1张,增加小目标多样性 | 前10轮开1.0,之后关掉(设为0) |
mixup |
两张图混合,类似正则化 | 数据少时开0.1~0.2,数据多时不开 |
小技巧: 我一般先跑10个epoch看看损失曲线。如果 box_loss 下降很慢,就把 box 权重从7.5调到10.0。如果分类不准,就加大 cls。说白了,这就是个调参的活,多试几次就有感觉了。
4.2 训练命令详解:从入门到精通
配置文件写好了,接下来就是敲命令。YOLOv8的命令行接口设计得挺友好,但参数多了也容易懵。
4.2.1 基础训练命令
# 最简单的训练
yolo train model=yolov8n.pt data=coco.yaml epochs=100 imgsz=640
# 指定batch size和GPU
yolo train model=yolov8s.pt data=my_data.yaml epochs=200 batch=16 device=0,1
# 断点续训(从上次保存的权重继续)
yolo train model=runs/train/exp/weights/last.pt data=my_data.yaml epochs=300
参数说明:
- model:预训练权重路径。用
yolov8n.pt表示从头开始,用last.pt表示断点续训。 - data:指向你的
data.yaml。 - epochs:总训练轮数。小数据集100轮够用,大数据集300轮起步。
- batch:根据显存调整。我一般先设16,显存不够再降到8。
- device:GPU编号。多卡训练用
0,1,2,3。
4.2.2 高级训练技巧
实际项目中,光跑通是不够的。你得学会「控制」训练过程。
# 冻结主干网络(迁移学习常用)
yolo train model=yolov8m.pt data=my_data.yaml freeze=10
# 使用余弦退火学习率调度
yolo train model=yolov8l.pt data=my_data.yaml cos_lr=True
# 多尺度训练(增强模型鲁棒性)
yolo train model=yolov8x.pt data=my_data.yaml multi_scale=True
我的习惯: 做迁移学习时,前50轮冻结主干(freeze=10),只训练检测头。等损失降不动了,再解冻全部层,用更小的学习率(lr0=0.0001)微调。这样既快又稳。
4.3 损失函数可视化:看懂模型在「学什么」
训练时,YOLO会自动记录损失值。你可以在 runs/train/exp 目录下找到 results.csv 和 results.png。但光看总损失不够,得拆开看。
4.3.1 三大损失的含义
| 损失项 | 含义 | 正常趋势 | 异常信号 |
|---|---|---|---|
box_loss |
预测框与真实框的位置偏差 | 持续下降,最终趋于平稳 | 震荡不降 → 学习率太大或数据标注不准 |
cls_loss |
分类错误程度 | 下降,最终接近0 | 下降缓慢 → 类别不平衡或特征不明显 |
dfl_loss |
分布焦点损失(框的边界精细度) | 缓慢下降 | 突然升高 → 过拟合或数据分布变化 |
避坑指南: 我曾经遇到一个项目,box_loss 一直在0.05附近震荡,怎么调都降不下去。后来发现是标注框的边界太粗糙,很多目标只标了大概位置。重新标注后,损失直接降到0.02。所以,损失降不下去,先检查数据质量。
4.3.2 用TensorBoard可视化
YOLOv8默认支持TensorBoard。训练时加个参数就行:
yolo train model=yolov8n.pt data=coco.yaml project=my_project name=exp1
tensorboard --logdir my_project/exp1
打开浏览器,你就能看到实时曲线。我习惯同时看 box_loss 和 mAP50 两条曲线——损失在降,mAP在升,说明模型在学东西。如果损失降了但mAP不动,那可能是过拟合了。
4.4 训练日志分析:从输出中读懂「潜台词」
训练时终端会刷出一堆信息。很多人直接忽略,其实里面藏着很多线索。
4.4.1 日志结构解读
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/100 3.85G 1.352 2.187 1.456 187 640
2/100 3.85G 1.201 1.954 1.312 203 640
3/100 3.85G 1.098 1.763 1.201 195 640
...
50/100 3.85G 0.452 0.321 0.567 210 640
| 字段 | 含义 | 关注点 |
|---|---|---|
Epoch |
当前轮数/总轮数 | 看进度 |
GPU_mem |
显存占用 | 如果接近显存上限,调小batch |
box_loss |
框损失 | 前10轮应该快速下降 |
cls_loss |
分类损失 | 如果一直大于1.0,检查类别是否平衡 |
Instances |
每张图的平均目标数 | 如果波动太大,检查数据加载是否正常 |
4.4.2 常见日志异常及处理
- 损失突然变成NaN:学习率太大,或者数据里有异常值。我一般先降低
lr0到0.001,如果还不行,检查数据里有没有损坏的图片。 - GPU显存不足:调小
batch,或者用--workers 4减少数据加载线程数。 - mAP一直为0:检查
data.yaml里的类别数nc是否和标签一致。我遇到过有人把nc写成1,但标签里有3类,结果mAP永远是0。 - 训练速度越来越慢:可能是数据缓存满了。重启一下训练,或者用
--cache参数把数据预加载到内存。
我的经验: 训练时别只盯着损失。每5个epoch看一下验证集的mAP。如果mAP连续10个epoch不涨,果断早停(early stopping)。YOLOv8自带这个功能,加个 patience=10 就行。
4.5 本章知识体系总览
下面这张图把训练流程串起来了。从配置文件到训练命令,再到日志分析,每一步都环环相扣。
训练入门其实就这三板斧:配好文件、敲对命令、看懂日志。别怕犯错,我当年第一次训练YOLO时,光 data.yaml 的路径就改了三回。多跑几次,你就能找到感觉。