YOLO 训练入门指南:从 batch 到预训练模型,五个关键参数一次讲清

对于刚接触目标检测的新手来说,YOLO 训练脚本里那一长串参数常常让人望而生畏:batchseedepochsimgsz、还有一堆看不懂的模型权重文件。这篇文章会用通俗的语言解释这些参数的含义、作用以及如何选择,帮助你在实际项目中做出合理配置。

本文以 Ultralytics YOLOv5 / YOLOv8 为例,其他版本的 YOLO 参数含义基本一致。

一、Batch(批大小):一次喂给模型多少张图

什么是 batch

训练神经网络时,我们不会把整个数据集一次性塞进模型,而是分成一小批一小批地送入。batch size 就是每次迭代中同时送入模型训练的图片数量

可以类比为做习题:与其把整本练习册做完再对答案,不如每做 32 道题就对一次答案、总结错误、调整思路。这个"32"就是 batch size。

batch 大小的三个影响

  1. 显存占用:每张图片在训练时都要占用 GPU 显存。batch 越大,显存占用越高。显存不足时会报 CUDA out of memory 错误。
  2. 梯度稳定性:batch 越大,每次计算的梯度越接近整个数据集的真实方向,训练曲线更平滑;batch 太小则梯度噪声大,loss 曲线容易抖动。
  3. 训练速度:在显存允许范围内,较大的 batch 能更充分地利用 GPU 并行计算能力。

如何选择

情况 建议
显存 8GB 以下 batch = 8 或 16
显存 12~16GB batch = 16 或 32
显存 24GB 以上 batch = 32 或 64

实用技巧:

  • 遇到显存溢出,直接把 batch 减半。
  • YOLOv5 支持 --batch -1,会自动探测可用显存的 60% 来确定 batch size。
  • 如果显存太小,可以使用梯度累积(gradient accumulation):用小 batch 训练,但累积多次的梯度再更新一次权重,等效于大 batch。YOLOv5 中对应 --accumulate 参数。

二、随机种子(seed):让训练结果可复现

为什么训练结果会"随机"

深度学习训练中有很多环节涉及随机性:

  • 模型初始权重的随机初始化
  • 每个 epoch 中训练数据打乱的顺序
  • 数据增强的随机操作(随机翻转、Mosaic 拼接、HSV 色彩扰动等)

这意味着:即使配置完全相同,两次训练的结果也可能不同,有时 mAP 相差甚至好几个点。

随机种子的作用

随机种子是伪随机数生成器的起点。固定种子后,所有"随机"过程都会按照完全相同的序列执行,从而保证训练结果可以复现。

这对以下场景非常重要:

  • 调试代码时,需要排除随机性干扰,确认改动是否真的有效
  • 写论文或报告时,实验结果需要可复现
  • 对比不同超参数时,希望变量唯一

如何设置

# YOLOv5 命令行
python train.py --seed 0 ...

# YOLOv8 (Ultralytics)
model.train(data='coco128.yaml', seed=0, ...)

需要注意两点:

  1. 固定种子后如果仍不能完全复现,可能还需要开启确定性模式(如 Ultralytics 中的 deterministic=True),但这可能略微降低训练速度。
  2. 固定某个种子也可能碰巧“运气好”或“运气差”。学术报告建议固定种子;工程项目中也可以不固定,多跑几次取平均来评估真实性能。

三、训练轮数(epochs):数据集被完整过几遍

什么是 epoch

一个 epoch 表示模型完整地看过一遍训练集。如果训练集有 1000 张图、batch size 为 32,那么一个 epoch 包含约 31 次迭代(iteration)。

轮数太少与太多的后果

  • 太少(欠拟合):模型还没学够,训练 loss 和验证 loss 都很高,mAP 偏低。
  • 太多(过拟合风险):模型开始“背答案”,在训练集上表现很好,但在验证集和真实场景上性能下降。

如何判断训练是否充分

不要盲目设定一个数字然后听天由命,要学会观察训练日志:

  1. 观察 results.csv 或训练结束后的曲线图:验证集的 mAP 是否还在上升?
  2. 关注 box_losscls_loss 是否趋于平稳。
  3. 利用早停机制(early stopping):Ultralytics 提供 patience 参数,例如 patience=50 表示连续 50 个 epoch 验证指标没有提升就自动停止训练,避免浪费时间。

经验参考

  • 使用预训练模型 + 中小规模数据集:100~200 个 epoch 通常足够。
  • YOLO 默认值一般为 300,配合早停机制使用。
  • 训练完成后,使用 best.pt(验证集上最优的权重)而不是 last.pt(最后一个 epoch 的权重)做推理。

四、输入尺寸:模型的“视力”好坏由此决定

什么是输入尺寸

YOLO 要求输入图片为固定尺寸,训练时会自动把原图缩放到该尺寸,默认为 imgsz=640,即 640×640 像素。

为什么必须是 32 的倍数

YOLO 的骨干网络会对图片进行 5 次下采样(每次缩小一半),特征图尺寸需要能被整除。因此输入尺寸应为 32 的倍数,如 416、512、640、960、1280。

尺寸大小的权衡

尺寸 优点 缺点
小(如 320、416) 速度快、显存省 小目标容易丢失,精度下降
大(如 960、1280) 小目标检测效果更好,细节保留多 速度慢,显存占用高

关键规律:目标在图中占比越小,越需要更大的输入尺寸。例如无人机航拍小目标检测,常用 1024 以上;而近距离的大目标检测,640 甚至更小就够用。

实践建议

  • 不确定时,从默认的 640 开始。
  • 如果漏检的多是小目标,优先尝试提高输入尺寸,而不是换更大的模型。
  • 训练和推理尽量使用相同尺寸,尺寸不一致会带来一定精度损失。
  • YOLOv5 支持 --rect 矩形训练,按图片原始长宽比缩放并减少填充,可在同尺寸下保留更多信息。

五、预训练模型的选择:站在巨人的肩膀上

什么是预训练模型

预训练模型是指在 COCO 等大型数据集上已经训练好的模型。尽管 COCO 有 80 个类别,可能与你的任务(如安全帽检测、车牌识别)完全不同,但模型在预训练中已经学会了通用的视觉特征:边缘、纹理、形状、物体的组成部分等。

在你的数据上微调(fine-tune)预训练模型,几乎总是比从零开始训练收敛更快、精度更高、所需数据更少。除非有特殊原因(如红外、医学影像等与自然图像差异极大的领域,且数据量充足),否则一定要使用预训练模型。

模型规格的选择

以 YOLOv8 为例,官方提供五种规格:

模型 参数量(约) 特点
yolov8n 3.2M 最快最小,精度最低
yolov8s 11M 速度与精度的平衡点
yolov8m 26M 精度明显提升
yolov8l 44M 高精度场景
yolov8x 68M 精度最高,最慢最大

选择时主要考虑三个问题:

  1. 部署环境是什么? 边缘设备(Jetson Nano、树莓派、手机)选 n 或 s;服务器级 GPU 可选 m/l/x。
  2. 对速度的要求? 实时视频流分析倾向小模型;离线批量处理可以用大模型。
  3. 任务的难度? 目标小、类别多、场景复杂时,更大的模型更有优势。

一个常见的高性价比做法是:用大模型(n 之外较大规格)先跑通流程、验证数据质量,再压缩到小模型用于部署。

六、一套可直接上手的基础配置

把前面的内容整合起来,一个适合新手的起点配置如下:

from ultralytics import YOLO

# 加载预训练模型(根据部署需求选 n/s/m)
model = YOLO('yolov8s.pt')

model.train(
    data='my_dataset.yaml',  # 数据集配置文件
    epochs=150,              # 训练轮数,配合早停使用
    imgsz=640,               # 输入尺寸,小目标多可提高到 1024
    batch=16,                # 显存不足就减半
    seed=0,                  # 固定种子,保证可复现
    patience=30              # 30 个 epoch 无提升则早停
)

对应的 YOLOv5 命令行写法:

python train.py --weights yolov5s.pt --data my_dataset.yaml \
    --epochs 150 --img 640 --batch 16 --seed 0 --patience 30

写在最后

这五个参数并非孤立存在,它们相互关联:

  • 输入尺寸和 batch size 共同决定显存占用
  • 训练轮数需要结合数据量、预训练与否综合判断
  • 模型规格要与输入尺寸、部署环境匹配

给新手最重要的建议是:每次只改一个参数,跑完记录结果,再做下一个改动。盲目同时调多个参数,你永远不知道性能变化来自哪里。训练目标检测模型是一门实证的手艺,多观察 loss 曲线和验证指标,比死记任何“最优配置”都更有价值。

THE END