Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Inizia

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 # install

Test 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 --half

Output:

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.826

Test 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 --half

Output:

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.833

Inferenza 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 --augment

Output:

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 augmentation inference results

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 --augment ai 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.

Stato del progetto#

YOLOv5 CI

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 DetectionModel di PyTorch, quindi --augment influisce 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.