YOLO 训练入门指南:从 batch 到预训练模型,五个关键参数一次讲清
对于刚接触目标检测的新手来说,YOLO 训练脚本里那一长串参数常常让人望而生畏:batch、seed、epochs、imgsz、还有一堆看不懂的模型权重文件。这篇文章会用通俗的语言解释这些参数的含义、作用以及如何选择,帮助你在实际项目中做出合理配置。
本文以 Ultralytics YOLOv5 / YOLOv8 为例,其他版本的 YOLO 参数含义基本一致。
一、Batch(批大小):一次喂给模型多少张图
什么是 batch
训练神经网络时,我们不会把整个数据集一次性塞进模型,而是分成一小批一小批地送入。batch size 就是每次迭代中同时送入模型训练的图片数量。
可以类比为做习题:与其把整本练习册做完再对答案,不如每做 32 道题就对一次答案、总结错误、调整思路。这个"32"就是 batch size。
batch 大小的三个影响
- 显存占用:每张图片在训练时都要占用 GPU 显存。batch 越大,显存占用越高。显存不足时会报
CUDA out of memory错误。 - 梯度稳定性:batch 越大,每次计算的梯度越接近整个数据集的真实方向,训练曲线更平滑;batch 太小则梯度噪声大,loss 曲线容易抖动。
- 训练速度:在显存允许范围内,较大的 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, ...)
需要注意两点:
- 固定种子后如果仍不能完全复现,可能还需要开启确定性模式(如 Ultralytics 中的
deterministic=True),但这可能略微降低训练速度。 - 固定某个种子也可能碰巧“运气好”或“运气差”。学术报告建议固定种子;工程项目中也可以不固定,多跑几次取平均来评估真实性能。
三、训练轮数(epochs):数据集被完整过几遍
什么是 epoch
一个 epoch 表示模型完整地看过一遍训练集。如果训练集有 1000 张图、batch size 为 32,那么一个 epoch 包含约 31 次迭代(iteration)。
轮数太少与太多的后果
- 太少(欠拟合):模型还没学够,训练 loss 和验证 loss 都很高,mAP 偏低。
- 太多(过拟合风险):模型开始“背答案”,在训练集上表现很好,但在验证集和真实场景上性能下降。
如何判断训练是否充分
不要盲目设定一个数字然后听天由命,要学会观察训练日志:
- 观察
results.csv或训练结束后的曲线图:验证集的 mAP 是否还在上升? - 关注
box_loss、cls_loss是否趋于平稳。 - 利用早停机制(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 | 精度最高,最慢最大 |
选择时主要考虑三个问题:
- 部署环境是什么? 边缘设备(Jetson Nano、树莓派、手机)选 n 或 s;服务器级 GPU 可选 m/l/x。
- 对速度的要求? 实时视频流分析倾向小模型;离线批量处理可以用大模型。
- 任务的难度? 目标小、类别多、场景复杂时,更大的模型更有优势。
一个常见的高性价比做法是:用大模型(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 曲线和验证指标,比死记任何“最优配置”都更有价值。