Ultralytics YOLO27:
Get Started

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

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

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

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

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

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