YOLO Vision 2026:

获得最佳 YOLOv5 训练结果的技巧#

📚 本指南介绍如何使用 YOLOv5 获得最佳 mAP 和训练结果 🚀。

大多数情况下,只要你的数据集足够大且标注质量高,无需更改模型或训练设置即可获得良好结果。如果一开始没有获得良好结果,你可以采取一些措施进行改进,但我们始终建议用户在考虑任何更改之前,先使用所有默认设置进行训练。这有助于建立性能基线并发现可改进的方面。

如果你对训练结果有疑问,我们建议你尽可能提供最多的信息,以便获得有帮助的回复,包括结果图(训练损失、验证损失、P、R、mAP)、PR 曲线、混淆矩阵、训练马赛克图、测试结果,以及 labels.png 等数据集统计图像。所有这些文件都位于你的 project/name 目录中,通常为 yolov5/runs/train/exp

下面我们为希望在 YOLOv5 训练中获得最佳结果的用户整理了一份完整指南。

数据集#

  • 每个类别的图像数量。 建议每个类别至少有 1500 张图像
  • 每个类别的实例数量。 建议每个类别至少有 10000 个实例(已标注对象)
  • 图像多样性。 必须能够代表部署环境。对于实际应用场景,我们建议使用来自不同时间段、不同季节、不同天气、不同光照、不同角度和不同来源(在线抓取、本地采集、不同相机等)的图像。
  • 标注一致性。 所有图像中的所有类别的所有实例都必须进行标注。部分标注将无法正常工作。
  • 标注准确性 标注必须紧密包围每个对象。对象与其边界框之间不应存在空隙。任何对象都不应缺少标注。
  • 训练集/验证集划分规范。 确保验证图像和测试图像不会出现在训练集中,以避免指标过于乐观。保持各划分之间的类别分布相似。
  • 标注验证。 在训练开始时查看 train_batch*.jpg,以验证你的标注是否正确显示,即查看示例马赛克图。
  • 背景图像。 背景图像是指不含任何对象、添加到数据集中以减少误报(FP)的图像。我们建议使用约 0-10% 的背景图像来帮助减少 FP(COCO 提供了 1000 张背景图像作为参考,占总数的 1%)。背景图像无需标注。

COCO dataset class distribution analysis

模型选择#

像 YOLOv5x 和 YOLOv5x6 这样的大型模型在几乎所有情况下都能产生更好的结果,但它们的参数更多,需要更多 CUDA 内存进行训练,运行速度也更慢。对于移动端部署,我们建议使用 YOLOv5s/m;对于云端部署,我们建议使用 YOLOv5l/x。请参阅 README 中的表格,以完整比较所有模型。

YOLOv5 Models

  • 从预训练权重开始。 推荐用于中小型数据集(例如 VOCVisDroneGlobalWheat)。将模型名称传递给 --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
  • 从头开始训练。 推荐用于大型数据集(例如 COCOObjects365OIv6)。传入你感兴趣的模型架构 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 中找到。

  • 训练轮数 从 300 个 epoch 开始。如果过早出现过拟合,可以减少 epoch 数。如果训练 300 个 epoch 后没有出现过拟合,则延长训练时间,例如训练 600、1200 个 epoch 等。
  • 图像尺寸。 COCO 以 --img 640 的原生分辨率进行训练,但由于数据集中包含大量小对象,在 --img 1280 等更高分辨率下训练可能会受益。如果小对象很多,自定义数据集将受益于以原生或更高分辨率进行训练。在训练所用的相同 --img 下可获得最佳推理结果,也就是说,如果你以 --img 1280 进行训练,也应以 --img 1280 进行测试和检测。
  • 批量大小 使用硬件允许的最大 --batch-size。较小的批量大小会产生较差的批归一化统计数据,应当避免。你可以使用 --batch-size -1 自动为 GPU 选择最佳批量大小。
  • 学习率 默认学习率调度策略在大多数情况下都能正常工作。为了更快收敛,你可以尝试使用 --cos-lr 标志启用余弦学习率调度,使学习率在各个 epoch 中沿余弦曲线逐渐降低。
  • 数据增强 YOLOv5 包含多种增强技术,例如将多张训练图像组合起来的马赛克增强。通过 --hyp 文件中的 mosaic 超参数调整增强强度,有助于稳定训练。
  • 超参数。 默认超参数位于 hyp.scratch-low.yaml 中。我们建议你先使用默认超参数进行训练,再考虑修改任何参数。通常,增加数据增强超参数可以减少并延缓过拟合,从而支持更长时间的训练并获得更高的最终 mAP。减少损失分量增益超参数(如 hyp['obj'])有助于减少特定损失分量中的过拟合。如需使用自动化方法优化这些超参数,请参阅我们的超参数演化教程
  • 混合精度训练。 检测到受支持的 GPU 时,YOLOv5 会自动启用自动混合精度(AMP),在不牺牲模型准确性的情况下加快训练并减少内存使用。
  • 多 GPU 训练。 如果你有多个 GPU,请使用 --device 0,1,2,3 在多个 GPU 之间分配训练,这可以显著减少训练时间。
  • 提前停止。 使用 --patience 50,在验证指标连续 50 个 epoch 没有改善时停止训练,从而节省时间并防止过拟合。

高级优化技术#

  • 迁移学习 对于专业数据集,从预训练权重开始,并在训练期间逐步解冻各层,使模型适应你的特定任务。
  • 模型剪枝 训练完成后,可以考虑对模型进行剪枝,移除冗余权重并减小模型大小,同时避免明显的性能损失。
  • 模型集成 对于关键应用,使用不同配置训练多个模型,并结合它们的预测结果以提高准确性。
  • 测试时增强 在推理期间使用 --augment 启用 TTA,通过对输入图像增强版本的结果取平均值来提高预测准确性。

延伸阅读#

如果你想了解更多,一个很好的起点是 Karpathy 的《训练神经网络的配方》,其中包含适用于各种 ML 领域的优秀训练思路:https://karpathy.github.io/2019/04/25/recipe/

如需了解训练设置和配置的更多详细信息,请参阅 Ultralytics 训练设置文档,其中全面解释了所有可用参数。

祝你好运 🍀,如果还有其他问题,请告诉我们!

常见问题#

  • 如果训练损失持续下降,而验证损失开始上升,你的模型可能出现了过拟合。监控验证 mAP——如果它趋于平稳或下降,而训练损失仍在持续改善,这就是过拟合的迹象。解决方案包括增加训练数据、加强数据增强,或采用正则化技术。

  • 最佳批量大小取决于你的 GPU 内存。较大的批量大小通常能提供更好的批归一化统计数据和训练稳定性。使用硬件能够处理且不会耗尽内存的最大批量大小。你可以使用 --batch-size -1 自动确定适合你配置的最佳批量大小。

  • 要加快训练,可以尝试:使用多个 GPU 和 --device 0,1,2,3,使用 --cache 缓存数据集,以及优化批量大小(受支持的 GPU 会自动启用混合精度)。如果绝对准确性并非关键,也可以考虑使用 YOLOv5s 等更小的模型变体。

评论