Aumento dei dati in fase di test (TTA)#
Questa guida spiega come usare la test-time augmentation (TTA) durante i test e l'inferenza per migliorare la mAP e il recall con YOLOv5.
Prima di iniziare#
Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, includendo PyTorch>=1.8. Modelli e dataset vengono scaricati automaticamente dall'ultima release di YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTest normale#
Prima di provare la TTA, definisci le prestazioni di riferimento con cui confrontare i risultati. Questo comando testa YOLOv5x su COCO val2017 con immagini da 640 pixel. yolov5x.pt è il modello P5 più grande e accurato. Tra le altre opzioni ci sono i checkpoint pretrained più piccoli yolov5n.pt, yolov5s.pt, yolov5m.pt e yolov5l.pt, oppure un tuo checkpoint ottenuto addestrando il modello su un dataset personalizzato, ad esempio runs/train/exp/weights/best.pt.
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 Instances P R mAP50 mAP50-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 Instances P R mAP50 mAP50-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 come quella con val.py: aggiungi --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 tempo di inferenza maggiore, perciò la TTA è più adatta alle applicazioni in cui l'accuratezza ha la priorità sulla velocità.
Ambienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno con dipendenze essenziali preinstallate, come CUDA, cuDNN, Python e PyTorch, per dare slancio 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.
Commenti
Fai una domanda, condividi i tuoi risultati o aiuta qualcun altro.