YOLOv5 模型集成#
📚 本指南介绍如何在测试和推理期间使用 Ultralytics YOLOv5 🚀 模型集成,以提升 mAP 和 召回率。
来自集成学习:
集成建模是一种创建多个多样化模型来预测结果的过程,可以使用许多不同的建模算法,也可以使用不同的训练数据集。集成模型随后会聚合每个基础模型的预测结果,并为未见过的数据生成一个最终预测。使用集成模型的动机是降低预测的泛化误差。只要基础模型具有多样性且彼此独立,采用集成方法就能降低模型的预测误差。这种方法利用群体智慧来进行预测。尽管集成模型内部包含多个基础模型,但它的行为和性能表现都像一个单一模型。
开始之前#
在 Python>=3.8.0 环境中克隆仓库并安装 requirements.txt,其中包括 PyTorch>=1.8。模型 和数据集 会自动从最新的 YOLOv5 版本下载。
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install正常测试#
在进行模型集成之前,先确定单个模型的基线性能。此命令会在 COCO val2017 上以 640 像素的图像尺寸测试 YOLOv5x。yolov5x.pt 是可用的最大且精度最高的模型。其他选项包括 yolov5s.pt、yolov5m.pt 和 yolov5l.pt,或者你也可以使用在自定义数据集上训练得到的自定义检查点 ./weights/best.pt。有关所有可用模型的详细信息,请参阅预训练检查点表。
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half输出:
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00, 1.05it/s]
all 5000 36335 0.746 0.626 0.68 0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640) # <--- baseline speed
Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.504 # <--- baseline mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.688
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.382
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.628
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.681 # <--- baseline mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826集成测试#
在测试和推理时,只需将其他模型附加到任何现有 val.py 或 detect.py 命令中的 --weights 参数,即可将多个预训练模型集成在一起。以下示例会同时测试由 2 个模型组成的集成模型:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half你可以列出任意数量的检查点,包括 runs/train/exp5/weights/best.pt 等自定义权重。YOLOv5 会自动运行每个模型,按图像对齐预测结果,并在执行 NMS 前对输出结果求平均。
输出:
val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt'] # Ensemble notice
val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00, 1.52s/it]
all 5000 36335 0.747 0.637 0.692 0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640) # <--- ensemble speed
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.515 # <--- ensemble mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.699
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.557
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.638
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.689 # <--- ensemble mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844集成推理#
将其他模型附加到 --weights 参数,即可运行集成推理:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images输出:
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']
image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
模型集成的优势#
使用 YOLOv5 进行模型集成具有以下优势:
- 精度提升:如上述示例所示,将多个模型进行集成后,mAP 会从 0.504 提升到 0.515,mAR 会从 0.681 提升到 0.689。
- 更好的泛化能力:组合多样化模型有助于减少过拟合,并提升模型在多样化数据上的性能。
- 更强的鲁棒性:集成模型通常能够更好地应对数据中的噪声和异常值。
- 互补优势:不同模型可能擅长检测不同类型的对象,或适应不同的环境条件。
主要的权衡是推理时间增加,如速度指标所示(单个模型为 22.4ms,集成模型为 39.5ms)。
何时使用模型集成#
可以考虑在以下场景中使用模型集成:
- 当精度比推理速度更重要时
- 对于必须将漏检降至最低的关键应用
- 处理具有不同光照、遮挡或尺度的复杂图像时
- 在需要最大性能的竞赛或基准测试期间
对于具有严格延迟要求的实时应用,使用单模型推理可能更合适。
支持的环境#
Ultralytics 提供一系列可直接使用的环境,每个环境都预装了 CUDA、CUDNN、Python 和 PyTorch 等必要依赖项,帮助你快速启动项目。
- 免费 GPU 笔记本:
- Google Cloud:GCP 快速入门指南
- Amazon:AWS 快速入门指南
- Azure:AzureML 快速入门指南
- Docker: Docker 快速入门指南
项目状态#
此徽章表示所有 YOLOv5 GitHub Actions 持续集成(CI)测试均已成功通过。这些 CI 测试会严格检查 YOLOv5 在多个关键方面的功能和性能:训练、验证、推理、导出和基准测试。它们确保 YOLOv5 在 macOS、Windows 和 Ubuntu 上持续稳定地运行,并且每 24 小时以及每次新提交时都会执行测试。