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%)。背景图像不需要标注。
模型选择#
像 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 中找到。
- 轮数。 从 300 个轮数开始。如果这过早导致过拟合,那么你可以减少轮数。如果在 300 个轮数后没有发生过拟合,则训练更长时间,例如 600、1200 等轮数。
- 图像大小。 COCO 在
--img 640的原生分辨率下进行训练,不过由于数据集中包含大量小对象,它可以通过在更高分辨率(如--img 1280)下训练来获益。如果存在许多小对象,自定义数据集将受益于在原生或更高分辨率下进行训练。最佳推理结果是在与训练时相同的--img下获得的,即如果你在--img 1280下训练,你也应该在--img 1280下进行测试和检测。 - 批次大小。 使用硬件允许的最大的
--batch-size。较小的批次大小会产生较差的批归一化统计数据,应予以避免。你可以使用--batch-size -1为你的 GPU 自动选择最佳批次大小。 - 学习率。 默认的学习率调度在大多数情况下都表现良好。为了更快收敛,你可以尝试使用
--cos-lr标志来启用余弦学习率调度,该调度在各个轮数中按照余弦曲线逐渐降低学习率。 - **Data augmentation。**YOLOv5 包含各种增强技术,例如 mosaic(马赛克),它会组合多张训练图像。你可以通过
mosaic文件中的--hyp超参数来调整增强强度,以帮助稳定训练。 - 超参数。 默认超参数位于 hyp.scratch-low.yaml 中。我们建议你首先使用默认超参数进行训练,然后再考虑修改任何参数。通常,增加增强超参数会减少并延迟过拟合,从而允许更长的训练和更高的最终 mAP。减少像
hyp['obj']这样的损失分量增益超参数将有助于减少这些特定损失分量中的过拟合。有关优化这些超参数的自动化方法,请参阅我们的超参数演化教程。 - 混合精度训练。 当检测到受支持的 GPU 时,YOLOv5 会自动启用自动混合精度 (AMP),在不牺牲模型准确率的情况下加快训练速度并减少内存使用。
- 多 GPU 训练。 如果你有多个 GPU,请使用
--device 0,1,2,3在它们之间分发训练,这可以显着减少训练时间。 - 早停法。 如果验证指标在 50 个轮数内没有改善,请使用
--patience 50停止训练,以节省时间并防止过拟合。
高级优化技术#
- 迁移学习。 对于专业数据集,从预训练权重开始,并在训练期间逐渐解冻层,使模型适应你的特定任务。
- 模型剪枝。 训练后,考虑修剪你的模型以移除冗余权重,并在没有显着性能损失的情况下减小模型大小。
- 模型集成。 对于关键应用,使用不同的配置训练多个模型并结合它们的预测以提高准确率。
- 测试时增强。 在推理期间使用
--augment启用 TTA,通过平均来自输入图像增强版本的预测结果来提高准确率。
延伸阅读#
如果你想了解更多信息,一个好的起点是 Karpathy 的“训练神经网络的秘诀”,其中包含适用于所有 ML 领域的极佳训练思路:https://karpathy.github.io/2019/04/25/recipe/
有关训练设置和配置的更多详细信息,请参考 Ultralytics 训练设置文档,其中提供了对所有可用参数的全面解释。
祝你好运 🍀,如果有其他问题请告诉我们!
常见问题解答#
如果训练损失持续下降而验证损失开始上升,则模型可能过拟合了。监控验证 mAP - 如果它在训练损失持续改善时趋于平稳或下降,那就是过拟合的迹象。解决方案包括增加更多训练数据、增加数据增强或实施正则化技术。
最佳批次大小取决于你的 GPU 内存。较大的批次大小通常提供更好的批归一化统计数据和训练稳定性。使用硬件可以处理而不会耗尽内存的最大批次大小。你可以使用
--batch-size -1自动确定适合你设置的最佳批次大小。为了加速训练,请尝试:使用带有
--device 0,1,2,3的多个 GPU,使用--cache缓存你的数据集,以及优化你的批次大小(混合精度在受支持的 GPU 上自动启用)。如果绝对准确率不关键,还可以考虑使用更小的模型变体,例如 YOLOv5s。
