获得最佳 YOLOv5 训练结果的技巧
📚 本指南介绍了如何通过 YOLOv5 获得最佳 mAP 和训练结果 🚀。
大多数情况下,无需更改模型或训练设置即可获得良好的结果,前提是你的数据集足够大且标注准确。如果你一开始没有得到好的结果,你可以采取一些步骤进行改进,但我们始终建议用户先使用所有默认设置进行训练,然后再考虑任何更改。这有助于建立性能基准并发现需要改进的地方。
如果你对训练结果有疑问,我们建议你提供尽可能多的信息,以便我们给出有用的回复,包括结果图(训练损失、验证损失、P、R、mAP)、PR 曲线、混淆矩阵、训练马赛克图、测试结果以及诸如 labels.png 等数据集统计图像。所有这些都位于你的 project/name 目录中,通常是 yolov5/runs/train/exp。
我们汇总了一份完整的指南,供希望在 YOLOv5 训练中获得最佳结果的用户参考。
数据集
- 每类图像数量。 建议每类 ≥ 1500 张图像
- 每类实例数量。 建议每类 ≥ 10000 个实例(标注对象)
- 图像多样性。 必须代表部署环境。对于实际使用案例,我们建议使用不同时间、不同季节、不同天气、不同光照、不同角度、不同来源(在线抓取、本地收集、不同相机)等的图像。
- 标签一致性。 必须标注所有图像中所有类的所有实例。部分标注将无法工作。
- 标签 准确性。 标签必须紧密包围每个对象。对象与其 边界框 之间不应有间隙。不应有遗漏标注的对象。
- 训练/验证集划分规范。 确保验证和测试图像从不出现在训练集中,以避免过于乐观的指标。保持划分之间的类分布相似。
- 标签验证。 在训练开始时查看
train_batch*.jpg以验证你的标签是否正确,例如查看 示例 马赛克图。 - 背景图像。 背景图像是不含对象的图像,添加到数据集中以减少误报 (FP)。我们建议使用约 0-10% 的背景图像来帮助减少误报(作为参考,COCO 有 1000 张背景图像,占总数的 1%)。背景图像不需要标签。
模型选择
像 YOLOv5x 和 YOLOv5x6 这样的大型模型在几乎所有情况下都能产生更好的结果,但它们参数更多,训练需要更多的 CUDA 显存,且运行速度更慢。对于 移动端 部署,我们建议使用 YOLOv5s/m;对于 云端 部署,我们建议使用 YOLOv5l/x。请参阅我们的 README 表格 以获取所有模型的完整对比。

-
从预训练权重开始。 建议用于中小型数据集(例如 VOC、VisDrone、GlobalWheat)。将模型名称传递给
--weights参数。模型会自动从 最新 YOLOv5 版本 下载。python train.py --data custom.yaml --weights yolov5s.pt python train.py --data custom.yaml --weights yolov5m.pt python train.py --data custom.yaml --weights yolov5l.pt python train.py --data custom.yaml --weights yolov5x.pt python train.py --data custom.yaml --weights custom_pretrained.pt -
从零开始训练。 建议用于大型数据集(例如 COCO、Objects365、OIv6)。传入你感兴趣的模型架构 YAML,并附带一个空的
--weights ''参数:python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml
训练设置
在修改任何内容之前,先使用默认设置进行训练以建立性能基准。train.py 设置的完整列表可以在 train.py 的 argparser 中找到。
- Epochs。 从 300 个 epoch 开始。如果早期出现过拟合,则可以减少 epoch。如果 300 个 epoch 后没有出现 过拟合,则可以进行更长时间的训练,例如 600、1200 等 epoch。
- 图像大小。 COCO 在
--img 640的原生分辨率下训练,但由于数据集中包含大量小对象,从--img 1280等更高分辨率训练中受益匪浅。如果有很多小对象,自定义数据集将受益于在原生或更高分辨率下进行训练。最佳推理结果是在与训练时相同的--img下获得的,即如果你在--img 1280下训练,你也应该在--img 1280下测试和检测。 - Batch size。 使用你的硬件允许的最大
--batch-size。较小的批大小会产生较差的 批归一化 统计数据,应予以避免。你可以使用--batch-size -1自动为你的 GPU 选择最佳批大小。 - Learning rate。 默认的学习率调度在大多数情况下效果很好。为了更快收敛,你可以尝试使用
--cos-lr标志来启用余弦学习率调度,它会沿着余弦曲线在 epoch 间逐渐降低学习率。 - Data augmentation。 YOLOv5 包含各种增强技术,如结合多张训练图像的马赛克增强。对于最后几个 epoch,考虑使用
--close-mosaic 10来禁用马赛克增强,这有助于稳定训练。 - 超参数。 默认超参数位于 hyp.scratch-low.yaml 中。我们建议你在考虑修改任何内容之前先使用默认超参数进行训练。通常,增加增强超参数将减少并延迟过拟合,从而允许更长时间的训练和更高的最终 mAP。减少损失组件增益超参数(如
hyp['obj'])将有助于减少这些特定损失组件中的过拟合。有关优化这些超参数的自动化方法,请参阅我们的 超参数进化教程。 - Mixed precision 训练。 使用
--amp启用混合精度训练,可以在不牺牲模型准确性的情况下加快训练速度并减少显存使用。 - 多 GPU 训练。 如果你有多个 GPU,请使用
--device 0,1,2,3将训练分布到它们上面,这可以显著减少训练时间。 - 提前停止。 使用
--patience 50,如果验证指标在 50 个 epoch 内没有改善,则停止训练,从而节省时间并防止过拟合。
高级优化技术
- Transfer learning。 对于专业数据集,从预训练权重开始,并在训练期间逐渐解冻层,以使模型适应你的特定任务。
- Model pruning。 训练后,考虑修剪你的模型,以去除冗余权重并减小模型大小,而不会产生显著的性能损失。
- Model ensemble。 对于关键应用,训练多个具有不同配置的模型并结合它们的预测以提高准确性。
- Test-time augmentation。 在推理期间使用
--augment启用 TTA,通过平均输入图像增强版本的预测结果来提高准确性。
进一步阅读
如果你想了解更多,Karpathy 的“训练 神经网络 食谱”是一个很好的起点,其中包含适用于所有 ML 领域的绝佳训练建议:https://karpathy.github.io/2019/04/25/recipe/
有关训练设置和配置的更详细信息,请参阅 Ultralytics 训练设置文档,其中提供了所有可用参数的全面解释。
祝你好运 🍀,如果有任何其他问题,请告诉我们!
常见问题 (FAQ)
我如何知道我的模型是否过拟合?
如果训练损失持续下降而验证损失开始上升,你的模型可能正在过拟合。监控验证 mAP - 如果在训练损失持续改善的同时它趋于平缓或下降,这就是过拟合的迹象。解决方法包括添加更多训练数据、增加数据增强或实施正则化技术。
训练 YOLOv5 的最佳批大小是多少?
最佳批大小取决于你的 GPU 显存。较大的批大小通常提供更好的批归一化统计数据和训练稳定性。使用你的硬件可以在不耗尽显存的情况下处理的最大批大小。你可以使用 --batch-size -1 自动确定适合你配置的最佳批大小。
我怎样才能加快 YOLOv5 的训练速度?
要加快训练速度,请尝试:使用 --amp 启用混合精度训练,使用 --device 0,1,2,3 使用多个 GPU,使用 --cache 缓存你的数据集,以及优化你的批大小。如果绝对准确性不是关键,也可以考虑使用 YOLOv5s 等较小的模型变体。
