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 配置 超参数配置 hyp.yaml 调优 训练命令 yolo train ... 训练过程 前向传播 → 计算损失 → 反向传播 → 更新权重 每N轮执行验证集评估 损失可视化 box/cls/dfl 曲线 训练日志 GPU_mem / Instances 模型权重 best.pt / last.pt 根据日志和损失曲线,调整超参数或数据配置

训练入门其实就这三板斧:配好文件、敲对命令、看懂日志。别怕犯错,我当年第一次训练YOLO时,光 data.yaml 的路径就改了三回。多跑几次,你就能找到感觉。