YOLOv5 模型集成

📚 本指南介绍了如何在测试和推理期间使用 Ultralytics YOLOv5 🚀 模型集成(model ensembling),以提高 mAP 和 Recall

关于 集成学习

集成建模是一个通过创建多个不同的模型来预测结果的过程,既可以使用许多不同的建模算法,也可以使用不同的 训练数据 集。集成模型随后汇总每个基模型的预测结果,从而得出针对未见数据的最终预测。使用集成模型的目标是降低预测的泛化误差。只要基模型具有多样性和独立性,使用集成方法时模型的预测误差就会降低。这种方法在进行预测时寻求“群体智慧”。尽管集成模型在内部包含多个基模型,但它表现得就像一个单一模型。

在你开始之前

Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

正常测试

在进行集成之前,请先确定单个模型的基准性能。此命令用于测试 YOLOv5x 在 COCO val2017 数据集上、图像尺寸为 640 像素时的表现。yolov5x.pt 是目前可用且最精确的模型。其他选项包括 yolov5s.ptyolov5m.ptyolov5l.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/exp-5/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/exp-3/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/exp-2
Done. (0.223s)
YOLO inference result

模型集成的优势

使用 YOLOv5 进行模型集成具有以下几个优势:

  1. 更高的准确性:如上述示例所示,集成多个模型可以将 mAP 从 0.504 提高到 0.515,将 mAR 从 0.681 提高到 0.689。
  2. 更好的泛化能力:结合多样化的模型有助于减少过拟合,并提高在不同数据上的表现。
  3. 增强的鲁棒性:集成模型通常对数据中的噪声和异常值更加稳健。
  4. 互补的优势:不同的模型可能擅长检测不同类型的物体或在不同的环境条件下表现出色。

主要的权衡是推理时间增加,如速度指标所示(单个模型为 22.4 毫秒,而集成模型为 39.5 毫秒)。

何时使用模型集成

在以下场景中考虑使用模型集成:

  • 当准确性比推理速度更重要时
  • 对于必须尽量减少漏报(False Negatives)的关键应用
  • 处理具有不同光照、遮挡或尺度挑战的图像时
  • 在需要最高性能的竞赛或基准测试期间

对于有严格延迟要求的实时应用,使用单个模型推理可能更合适。

支持的环境

Ultralytics 提供了一系列开箱即用的环境,每个环境都预装了 CUDACUDNNPythonPyTorch 等关键依赖项,助你快速启动项目。

项目状态

YOLOv5 CI

此徽章表示所有 YOLOv5 GitHub Actions 持续集成 (CI) 测试均成功通过。这些 CI 测试严格检查 YOLOv5 在各个关键方面的功能和性能:训练验证推理导出基准测试。它们确保了在 macOS、Windows 和 Ubuntu 上的一致且可靠的运行,测试每 24 小时以及在每次新提交时进行。

评论