テスト時オーギュメンテーション (TTA)#
📚 このガイドでは、YOLOv5 🚀 を使用してテストおよび推論時にテスト時データ拡張(TTA)を活用し、mAP と Recall を向上させる方法について説明します。
始める前に#
リポジトリをクローンし、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通常のテスト#
TTA を試す前に、比較のためのベースライン性能を設定します。このコマンドは、画像サイズ 640 ピクセルで COCO val2017 を使用して YOLOv5x をテストします。yolov5x.pt は利用可能な中で最大かつ最も正確なモデルです。その他のオプションには yolov5s.pt、yolov5m.pt、yolov5l.pt、またはカスタムデータセットのトレーニングによる独自のチェックポイント ./weights/best.pt があります。利用可能なすべてのモデルの詳細については、YOLOv5 ドキュメントを参照してください。
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.826TTAを使用したテスト#
TTAを有効にするには、既存の val.py コマンドに --augment を追加し、精度向上のために画像サイズを約30%大きくします。TTAを有効にした推論では、画像が左右反転されて3つの異なる解像度で処理され、出力が NMS の前に統合されるため、通常、通常の推論の約2〜3倍の時間がかかることに注意してください。速度低下の一部は単に画像サイズが大きくなること(832対640)によるものであり、一部は実際のTTA処理によるものであるため、--img を増やす前にGPUに十分なメモリの余裕があることを確認してください。
python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --half出力:
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=832, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=True, 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...
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)
return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
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, 2885.61it/s]
val: New cache created: ../datasets/coco/val2017.cache
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [07:29<00:00, 2.86s/it]
all 5000 36335 0.718 0.656 0.695 0.503
Speed: 0.2ms pre-process, 80.6ms inference, 2.7ms NMS per image at shape (32, 3, 832, 832) # <--- TTA speed
Evaluating pycocotools mAP... saving runs/val/exp-2/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.516 # <--- TTA mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.701
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.562
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.361
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.564
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.656
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.388
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.640
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.696 # <--- TTA mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.553
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.744
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.833TTAを使用した推論#
detect.py のTTA推論は、val.py のTTAと同様に動作します。既存の detect.py コマンドに --augment を追加するだけです。
python detect.py --weights yolov5s.pt --img 832 --source data/images --augment出力:
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Downloading https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt to yolov5s.pt...
100% 14.1M/14.1M [00:00<00:00, 81.9MB/s]
Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 /content/yolov5/data/images/bus.jpg: 832x640 4 persons, 1 bus, 1 fire hydrant, Done. (0.029s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 480x832 3 persons, 3 ties, Done. (0.024s)
Results saved to runs/detect/exp
Done. (0.156s)
PyTorch Hub TTA#
TTA はすべての YOLOv5 PyTorch Hub モデルに自動的に統合されており、推論時に augment=True を渡すことでアクセスできます。
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s") # or yolov5m, yolov5x, custom
# Images
img = "https://ultralytics.com/images/zidane.jpg" # or file, PIL, OpenCV, numpy, multiple
# Inference
results = model(img, augment=True) # <--- TTA inference
# Results
results.print() # or .show(), .save(), .crop(), .pandas(), etc.カスタマイズ#
YOLOv5 forward_augment() メソッドで適用される TTA 操作をカスタマイズできます。
テスト時オーギュメンテーションの利点#
テスト時データ拡張には、物体検出タスクにおいていくつかの重要な利点があります:
- 精度の向上: 上記の結果で示されているように、TTAはmAPを0.504から0.516に、mARを0.681から0.696に向上させます。
- 小さな物体の検出精度向上: TTAは特に小さな物体の検出を強化し、小さな領域のAPを0.351から0.361に向上させます。
- 堅牢性の向上: 各画像の複数のバリエーションをテストすることで、TTAは視野角、照明、その他の環境要因の影響を低減します。
- 簡単な実装: 既存のコマンドに
--augmentフラグを追加するだけです。
トレードオフとして推論時間が増加するため、TTAは速度よりも精度が優先されるアプリケーションに適しています。
サポートされている環境#
Ultralytics は、プロジェクトを迅速に開始できるように、CUDA、CUDNN、Python、PyTorch などの必須依存関係が事前にインストールされた、すぐに使用できるさまざまな環境を提供しています。
- 無料GPUノートブック:
- Google Cloud: GCPクイックスタートガイド
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Dockerクイックスタートガイド
プロジェクトの状態#
このバッジは、すべての YOLOv5 GitHub Actions 継続的インテグレーション(CI)テストが正常に合格していることを示しています。これらの CI テストは、学習、検証、推論、エクスポート、ベンチマークの主要な側面全体で、YOLOv5 の機能とパフォーマンスを厳格にチェックします。これらは、24 時間ごとおよび新しいコミットごとにテストが実施され、macOS、Windows、Ubuntu での一貫した信頼性の高い動作を保証します。