YOLO Vision 2026:

Ensemble dei modelli YOLOv5#

📚 Questa guida spiega come utilizzare l'🚀 ensemble dei modelli di Ultralytics YOLOv5 durante i test e l'inferenza per migliorare mAP e richiamo.

Dall'apprendimento ensemble:

La modellazione ensemble è un processo in cui vengono creati più modelli diversi per prevedere un risultato, utilizzando molti algoritmi di modellazione differenti oppure diversi set di dati di addestramento. Il modello ensemble aggrega quindi la previsione di ciascun modello di base e produce un'unica previsione finale per i dati non osservati. L'obiettivo dell'utilizzo dei modelli ensemble è ridurre l'errore di generalizzazione della previsione. Finché i modelli di base sono diversi e indipendenti, l'errore di previsione del modello diminuisce quando si utilizza l'approccio ensemble. Questo approccio ricerca la saggezza della folla per formulare una previsione. Sebbene il modello ensemble contenga più modelli di base, agisce e funziona come un unico modello.

Prima di iniziare#

Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, incluso PyTorch>=1.8. Models e datasets vengono scaricati automaticamente dalla [release](https://ultralytics-translation-5.invalid più recente di YOLOv5.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Esegui il test normalmente#

Prima di creare l'ensemble, stabilisci le prestazioni di riferimento di un singolo modello. Questo comando testa YOLOv5x su COCO val2017 con una dimensione dell'immagine di 640 pixel. yolov5x.pt è il modello più grande e accurato disponibile. Le altre opzioni sono yolov5s.pt, yolov5m.pt e yolov5l.pt, oppure il tuo checkpoint ottenuto dall'addestramento su un dataset personalizzato ./weights/best.pt. Per i dettagli su tutti i modelli disponibili, consulta la tabella dei checkpoint pretrained.

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 dell'ensemble#

È possibile combinare più modelli pretrained durante i test e l'inferenza semplicemente aggiungendo modelli extra all'argomento --weights in qualsiasi comando val.py o detect.py esistente. Questo esempio testa insieme un ensemble di 2 modelli:

  • YOLOv5x
  • YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half

Puoi elencare tutti i checkpoint che desideri, inclusi pesi personalizzati come runs/train/exp5/weights/best.pt. YOLOv5 eseguirà automaticamente ogni modello, allineerà le previsioni per ciascuna immagine e calcolerà la media degli output prima di eseguire NMS.

Output:

val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, 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  # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients  # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']  # Ensemble notice

val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00,  1.52s/it]
                 all       5000      36335      0.747      0.637      0.692      0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640)  # <--- ensemble speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.515  # <--- ensemble mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.699
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.557
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.387
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.638
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.689  # <--- ensemble mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844

Inferenza con ensemble#

Aggiungi modelli extra all'argomento --weights per eseguire l'inferenza con ensemble:

python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images

Output:

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
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']

image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
YOLO inference result

Vantaggi dell'ensemble dei modelli#

L'ensemble dei modelli con YOLOv5 offre diversi vantaggi:

  1. Maggiore accuratezza: come dimostrato negli esempi precedenti, l'ensemble di più modelli aumenta mAP da 0.504 a 0.515 e mAR da 0.681 a 0.689.
  2. Migliore generalizzazione: la combinazione di modelli diversi aiuta a ridurre l'overfitting e migliora le prestazioni su dati eterogenei.
  3. Maggiore robustezza: gli ensemble sono generalmente più robusti al rumore e ai valori anomali nei dati.
  4. Punti di forza complementari: modelli diversi possono eccellere nel rilevamento di diversi tipi di oggetti o in condizioni ambientali differenti.

Il principale compromesso è l'aumento del tempo di inferenza, come mostrato nelle metriche di velocità (22.4ms per il singolo modello contro 39.5ms per l'ensemble).

Quando utilizzare l'ensemble dei modelli#

Valuta l'utilizzo dell'ensemble dei modelli nei seguenti scenari:

  • Quando l'accuratezza è più importante della velocità di inferenza
  • Per applicazioni critiche in cui è necessario ridurre al minimo i falsi negativi
  • Quando elabori immagini complesse con illuminazione variabile, occlusioni o scale diverse
  • Durante competizioni o benchmark in cui sono richieste prestazioni massime

Per applicazioni in tempo reale con requisiti rigorosi di latenza, può essere più appropriata l'inferenza con un singolo modello.

Ambienti supportati#

Ultralytics offre una serie di ambienti pronti all'uso, ciascuno con dipendenze essenziali preinstallate, come CUDA, CUDNN, Python e PyTorch, per avviare rapidamente i tuoi progetti.

Stato del progetto#

YOLOv5 CI

Questo badge indica che tutti i test di GitHub Actions di YOLOv5 per l'integrazione continua (CI) vengono superati correttamente. Questi test di CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 sotto diversi aspetti fondamentali: addestramento, convalida, 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.

Commenti