Aumento dei dati in fase di test (TTA)#
📚 Questa guida spiega come usare l'aumento dei dati in fase di test (TTA) durante i test e l'inferenza per migliorare mAP e richiamo con YOLOv5 🚀.
Prima di iniziare#
Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, che includa PyTorch>=1.8. Modelli e dataset vengono scaricati automaticamente dalla versione più recente di YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTest normale#
Prima di provare la TTA, vogliamo stabilire una prestazione di riferimento con cui confrontarci. Questo comando testa YOLOv5x su COCO val2017 con immagini di 640 pixel. yolov5x.pt è il modello più grande e accurato disponibile. Le altre opzioni sono yolov5n.pt, yolov5s.pt, yolov5m.pt e yolov5l.pt, oppure un tuo checkpoint ottenuto addestrando su un dataset personalizzato, ad esempio runs/train/exp/weights/best.pt. Per i dettagli su tutti i modelli disponibili, consulta la nostra documentazione YOLOv5.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfOutput:
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.826Test con TTA#
Aggiungi --augment a qualsiasi comando val.py esistente per attivare la TTA e aumenta la dimensione dell'immagine di circa il 30% per migliorare i risultati. Tieni presente che l'inferenza con la TTA attivata richiede in genere circa 2-3 volte più tempo rispetto all'inferenza normale, poiché le immagini vengono ribaltate da sinistra a destra ed elaborate a 3 risoluzioni diverse, con i risultati uniti prima di NMS. Il calo di velocità è in parte dovuto semplicemente alle dimensioni maggiori delle immagini (832 rispetto a 640) e in parte alle operazioni TTA vere e proprie; assicurati quindi che la GPU abbia memoria sufficiente prima di aumentare --img.
python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --halfOutput:
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.833Inferenza con TTA#
L'inferenza TTA con detect.py funziona esattamente come la TTA con val.py: basta aggiungere --augment a qualsiasi comando detect.py esistente:
python detect.py --weights yolov5s.pt --img 832 --source data/images --augmentOutput:
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)
TTA con PyTorch Hub#
La TTA è integrata automaticamente in tutti i modelli YOLOv5 PyTorch Hub e può essere attivata passando augment=True al momento dell'inferenza.
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s") # oppure yolov5m, yolov5x, personalizzato
# Images
img = "https://ultralytics.com/images/zidane.jpg" # oppure file, PIL, OpenCV, numpy, multiplo
# Inference
results = model(img, augment=True) # <--- inferenza TTA
# Results
results.print() # or .show(), .save(), .crop(), .pandas(), ecc.Personalizzazione#
Puoi personalizzare le operazioni TTA applicate nel metodo forward_augment() di YOLOv5.
Vantaggi dell'aumento dei dati in fase di test#
L'aumento dei dati in fase di test offre diversi vantaggi chiave per le attività di rilevamento degli oggetti:
- Maggiore accuratezza: come mostrano i risultati precedenti, la TTA aumenta mAP da 0.504 a 0.516 e mAR da 0.681 a 0.696.
- Migliore rilevamento degli oggetti piccoli: la TTA migliora in particolare il rilevamento degli oggetti piccoli, con l'AP per le aree piccole che passa da 0.351 a 0.361.
- Maggiore robustezza: testando più varianti di ogni immagine, la TTA riduce l'impatto dell'angolo di visualizzazione, dell'illuminazione e di altri fattori ambientali.
- Implementazione semplice: basta aggiungere il flag
--augmentai comandi esistenti.
Il compromesso è un aumento del tempo di inferenza, che rende la TTA più adatta alle applicazioni in cui l'accuratezza è più importante della velocità.
Ambienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno con le dipendenze essenziali già installate, come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.
- Notebook GPU gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida ad AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto#
Questo badge indica che tutti i test di integrazione continua (CI) di YOLOv5 GitHub Actions sono superati correttamente. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in diversi ambiti chiave: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test eseguiti ogni 24 ore e a ogni nuovo commit.
Domande frequenti#
Ogni immagine viene elaborata a tre scale e ribaltata da sinistra a destra; le predizioni vengono poi unite prima di NMS. Le visualizzazioni aggiuntive migliorano il richiamo, soprattutto per gli oggetti piccoli, a costo di una maggiore potenza di calcolo.
Aspettati un tempo di inferenza circa 2-3 volte superiore al normale. Una parte del costo è dovuta alle maggiori dimensioni di
--img, quindi assicurati che la GPU abbia memoria sufficiente prima di aumentarle.Lavorare a una risoluzione superiore di circa il 30%, ad esempio 832 invece di 640, fornisce maggiori dettagli alle elaborazioni multiscala e ha prodotto i risultati migliori nei benchmark precedenti.
No. Il passaggio forward aumentato è implementato nel
DetectionModeldi PyTorch, quindi--augmentinfluisce solo sui checkpoint.pt. I formati ONNX, TensorRT e gli altri formati esportati lo ignorano.