Ultralytics YOLO27:
Get Started

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

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

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

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

我们为希望在 YOLOv5 训练中获得最佳效果的用户编写了完整指南,见下文。

数据集#

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

COCO dataset class distribution analysis

模型选择#

YOLOv5x 和 YOLOv5x6 等更大的模型几乎在所有情况下都能取得更好的效果,但参数更多、训练时需要更多 CUDA 内存,运行速度也更慢。对于移动端部署,我们推荐 YOLOv5s/m;对于云端部署,我们推荐 YOLOv5l/x。查看我们的 README表格,了解所有模型的完整对比。

YOLOv5 Models

  • 从预训练权重开始。 推荐用于中小型数据集(例如 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 参数解析器中找到。

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

高级优化技术#

  • 迁移学习。 对于专业领域的数据集,可以从预训练权重开始,并可选择使用 --freeze 冻结层,使模型适应特定任务。
  • 模型剪枝。 训练结束后,可以考虑剪除模型中的冗余权重,在不显著损失性能的情况下降低模型大小。
  • 模型集成。 对于关键应用,可以使用不同配置训练多个模型,并组合它们的预测结果来提高准确率。
  • 测试时增强。 在推理时通过 --augment 启用 TTA,对输入图像的增强版本进行预测并取平均,从而提高预测准确率。

延伸阅读#

如果你想了解更多,可以从 Karpathy 的《神经网络训练秘诀》入手,其中介绍了适用于各种机器学习领域的实用训练思路:https://karpathy.github.io/2019/04/25/recipe/

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

常见问题#

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

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

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

评论