YOLOv5のモデルアンサンブル#
📚 このガイドでは、テストと推論時にUltralytics YOLOv5 🚀のモデルアンサンブルを使用して、mAPと再現率を向上させる方法を説明します。
アンサンブル学習より:
アンサンブルモデリングとは、さまざまなモデリングアルゴリズムを使用したり、異なるトレーニングデータセットを利用したりして複数の多様なモデルを作成し、結果を予測するプロセスです。アンサンブルモデルは、各ベースモデルの予測を集約し、未知のデータに対する最終的な予測を1つ生成します。アンサンブルモデルを使用する目的は、予測の汎化誤差を減らすことです。ベースモデルが多様かつ独立している限り、アンサンブル手法を使用するとモデルの予測誤差は減少します。この手法では、予測に群衆の知恵を活用します。アンサンブルモデルには複数のベースモデルが含まれていますが、単一のモデルとして動作し、機能します。
開始する前に#
リポジトリをクローンし、Python>=3.8.0環境(PyTorch>=1.8を含む)でrequirements.txtをインストールします。モデルとデータセットは、最新のYOLOv5リリースから自動的にダウンロードされます。
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install通常のテスト#
アンサンブルを行う前に、単一モデルのベースライン性能を確立します。このコマンドは、画像サイズ640ピクセルでCOCO val2017上のYOLOv5xをテストします。yolov5x.ptは、利用可能な中で最大かつ最も精度の高いモデルです。その他の選択肢は、yolov5n.pt、yolov5s.pt、yolov5m.pt、yolov5l.pt、またはカスタムデータセットのトレーニングで作成した独自のチェックポイント(例:runs/train/exp/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の機能とパフォーマンスを厳密に確認します。これにより、macOS、Windows、Ubuntuで一貫して信頼性の高い動作が保証されます。テストは24時間ごと、および新しいコミットごとに実施されます。
よくある質問#
数に制限はありません。
--weightsの後にすべてのチェックポイントを指定します(例:--weights yolov5x.pt yolov5l6.pt runs/train/exp/weights/best.pt)。推論時間はモデル数にほぼ比例して増加します。はい。NMSの前に予測を連結するため、すべてのモデルを同じクラスリスト、同じ順序でトレーニングする必要があります。入力サイズとアーキテクチャは異なっていてもかまいません。
はい。同じ
val.pyまたはdetect.pyコマンドに--augmentを追加すると、アンサンブル内のすべてのモデルにTTAを適用できます。アンサンブルは
models/experimental.py内のPyTorchのEnsembleモジュールによって処理されるため、.ptチェックポイントにのみ適用されます。ONNXまたはTensorRTファイルが必要な場合は、各モデルを個別にエクスポートしてください。