Ultralytics YOLO27:
Get Started

テスト時拡張(TTA)#

📚 このガイドでは、YOLOv5 🚀のテストおよび推論時にテスト時拡張(TTA)を使用して、mAPと再現率を向上させる方法を説明します。

開始する前に#

リポジトリをクローンし、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

通常のテスト#

TTAを試す前に、比較の基準となるパフォーマンスを確認します。このコマンドは、画像サイズ640ピクセルでCOCO val2017を使用してYOLOv5xをテストします。yolov5x.ptは、利用可能なモデルの中で最も大きく、最も高精度なモデルです。ほかの選択肢はyolov5n.pt、yolov5s.pt、yolov5m.pt、yolov5l.pt、またはカスタムデータセットでの学習によって得た独自のチェックポイント(runs/train/exp/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.826

TTAを使用したテスト#

既存のval.pyコマンドに--augmentを追加するとTTAが有効になり、画像サイズを約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/exp2/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.833

TTAを使用した推論#

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)
YOLOv5 test time augmentations

PyTorch HubのTTA#

TTAはすべてのYOLOv5 PyTorch Hubモデルに自動的に統合されており、推論時にaugment=Trueを渡すことで利用できます。

import torch

# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")  # またはyolov5m、yolov5x、custom

# Images
img = "https://ultralytics.com/images/zidane.jpg"  # またはfile、PIL、OpenCV、numpy、multiple

# Inference
results = model(img, augment=True)  # <--- TTA推論

# 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などの必須依存関係をあらかじめインストールした、すぐに使えるさまざまな環境を提供しています。

プロジェクトのステータス#

YOLOv5 CI

このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常に合格していることを示します。これらのCIテストでは、トレーニング、検証、推論、エクスポート、ベンチマークなど、さまざまな重要な側面におけるYOLOv5の機能とパフォーマンスを厳密に確認します。これにより、macOS、Windows、Ubuntuで一貫して信頼性の高い動作が保証されます。テストは24時間ごと、および新しいコミットごとに実施されます。

よくある質問#

  • 各画像を3つのスケールと左右反転で処理し、NMSの前に予測結果を統合します。追加の視点により、特に小さな物体の再現率が向上しますが、計算量は増加します。

  • 通常の推論時間の約2~3倍を見込んでください。処理時間が増える一因は--imgのサイズが大きくなることです。サイズを大きくする前に、GPUのメモリに十分な余裕があることを確認してください。

  • 832など、640より約30%大きい解像度で実行すると、マルチスケール処理で利用できる詳細情報が増え、上記のベンチマークで最良の結果が得られました。

  • いいえ。拡張されたフォワードパスはPyTorchのDetectionModel内にあるため、--augmentは.ptチェックポイントにのみ適用されます。エクスポート済みのONNX、TensorRT、その他の形式では無視されます。

コメント