Test-Time Augmentation (TTA)
📚 Dieser Leitfaden erklärt, wie Sie Test Time Augmentation (TTA) während des Testens und der Inferenz verwenden können, um den mAP-Wert und den Recall mit YOLOv5 🚀 zu verbessern.
Bevor Sie beginnen
Repository klonen und requirements.txt in einer Python>=3.8.0-Umgebung installieren, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Normal testen
Bevor wir TTA ausprobieren, wollen wir eine Baseline-Performance festlegen, mit der wir vergleichen können. Dieser Befehl testet YOLOv5x auf COCO val2017 bei einer Bildgröße von 640 Pixeln. yolov5x.pt
ist das größte und genaueste verfügbare Modell. Andere Optionen sind yolov5s.pt
, yolov5m.pt
und yolov5l.pt
, oder Ihren eigenen Checkpoint aus dem Training eines benutzerdefinierten Datensatzes übergeben ./weights/best.pt
. Einzelheiten zu allen verfügbaren Modellen finden Sie in unserem YOLOv5 Dokumentation.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
Ausgabe:
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
Testen mit TTA
Anhängen --augment
zu einem bestehenden val.py
Befehl zum Aktivieren von TTA und zum Erhöhen der Bildgröße um etwa 30 % für verbesserte Ergebnisse. Beachten Sie, dass die Inferenz mit aktiviertem TTA typischerweise etwa 2-3 Mal so lange dauert wie die normale Inferenz, da die Bilder links-rechts gespiegelt und in 3 verschiedenen Auflösungen verarbeitet werden, wobei die Ausgaben vor dem Zusammenführen zusammengeführt werden NMS. Ein Teil der Geschwindigkeitsreduzierung ist einfach auf größere Bildgrößen zurückzuführen (832 vs. 640), ein anderer Teil auf die eigentlichen TTA-Operationen.
python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --half
Ausgabe:
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
Inferenz mit TTA
detect.py
TTA-Inferenz funktioniert identisch mit val.py
TTA: einfach anhängen --augment
zu einem bestehenden detect.py
Befehl:
python detect.py --weights yolov5s.pt --img 832 --source data/images --augment
Ausgabe:
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 ist automatisch in alle integriert YOLOv5 PyTorch Hub Modelle und kann durch Übergabe von zugegriffen werden augment=True
zur Inferenzzeit.
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.
Anpassen
Sie können die im angewendeten TTA-Operationen anpassen. YOLOv5 forward_augment()
Methode.
Vorteile der Testzeit-Augmentierung
Testzeit-Augmentierung bietet mehrere entscheidende Vorteile für Objekterkennungsaufgaben:
- Verbesserte Genauigkeit: Wie in den obigen Ergebnissen gezeigt, erhöht TTA die mAP von 0,504 auf 0,516 und die mAR von 0,681 auf 0,696.
- Bessere Erkennung kleiner Objekte: TTA verbessert insbesondere die Erkennung kleiner Objekte, wobei sich die AP für kleine Bereiche von 0,351 auf 0,361 verbessert.
- Erhöhte Robustheit: Durch das Testen mehrerer Variationen jedes Bildes reduziert TTA die Auswirkungen von Blickwinkel, Beleuchtung und anderen Umweltfaktoren.
- Einfache Implementierung: Erfordert nur das Hinzufügen des
--augment
zu bestehenden Befehlen.
Der Kompromiss ist eine erhöhte Inferenzzeit, wodurch TTA besser für Anwendungen geeignet ist, bei denen die Genauigkeit Vorrang vor der Geschwindigkeit hat.
Unterstützte Umgebungen
Ultralytics bietet eine Reihe von gebrauchsfertigen Umgebungen, die jeweils mit wichtigen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorinstalliert sind, um Ihre Projekte zu starten.
- Kostenlose GPU Notebooks:
- Google Cloud: GCP Quickstart-Anleitung
- Amazon: AWS Quickstart-Anleitung
- Azure: AzureML Quickstart-Anleitung
- Docker: Docker Quickstart-Anleitung
Projektstatus
Dieses Badge zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen rigoros die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jedem neuen Commit durchgeführt werden.