YOLOv5 Model Ensembling
📚 Questa guida spiega come utilizzare l'ensemble di modelli Ultralytics YOLOv5 🚀 durante il testing e l'inferenza per migliorare la mAP e il Recall.
La modellazione di ensemble è un processo in cui vengono creati più modelli diversi per prevedere un risultato, utilizzando molti algoritmi di modellazione diversi o utilizzando diversi set di dati di addestramento. Il modello di ensemble aggrega quindi la previsione di ciascun modello base e produce una previsione finale per i dati non visti. La motivazione per l'utilizzo di modelli di ensemble è ridurre l'errore di generalizzazione della previsione. Finché i modelli base sono diversi e indipendenti, l'errore di previsione del modello diminuisce quando viene utilizzato l'approccio di ensemble. L'approccio cerca la saggezza della folla nel fare una previsione. Anche se il modello di ensemble ha più modelli base all'interno del modello, agisce e si comporta come un singolo modello.
Prima di iniziare
Clona il repository e installa i requirements.txt in un ambiente Python>=3.8.0, incluso PyTorch>=1.8. I modelli e i 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 dell'assemblaggio, stabilisci le prestazioni di base 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 preciso disponibile. Altre opzioni sono yolov5s.pt
, yolov5m.pt
e yolov5l.pt
, o il tuo checkpoint derivante dall'addestramento di un dataset personalizzato ./weights/best.pt
. Per dettagli su tutti i modelli disponibili, consultare il tabella dei checkpoint pre-addestrati.
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 di Ensemble
È possibile combinare più modelli pre-addestrati in fase di test e inferenza semplicemente aggiungendo modelli extra al --weights
argomento in qualsiasi comando val.py o detect.py esistente. Questo esempio testa un insieme di 2 modelli insieme:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
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 di Ensemble
Aggiungi modelli extra al --weights
argomento per eseguire l'inferenza di insieme:
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)
Vantaggi dell'Ensembling di Modelli
L'ensemble di modelli con YOLOv5 offre diversi vantaggi:
- Maggiore precisione: Come dimostrato negli esempi precedenti, l'ensemble di più modelli aumenta la mAP da 0.504 a 0.515 e la mAR da 0.681 a 0.689.
- Migliore Generalizzazione: La combinazione di modelli diversi aiuta a ridurre l'overfitting e migliora le prestazioni su dati variabili.
- Maggiore robustezza: Gli ensemble sono in genere più resistenti al rumore e ai valori anomali nei dati.
- Punti di forza complementari: Modelli diversi possono eccellere nel rilevamento di diversi tipi di oggetti o in diverse condizioni ambientali.
Il principale compromesso è l'aumento del tempo di inferenza, come mostrato nelle metriche di velocità (22.4ms per il modello singolo vs. 39.5ms per l'ensemble).
Quando utilizzare il Model Ensembling
Considera l'utilizzo dell'ensemble di modelli in questi scenari:
- Quando la precisione è più importante della velocità di inferenza
- Per applicazioni critiche in cui è necessario ridurre al minimo i falsi negativi
- Quando si elaborano immagini complesse con illuminazione, occlusione o scala variabili
- Durante competizioni o benchmark in cui è richiesta la massima performance
Per applicazioni in tempo reale con requisiti di latenza rigorosi, l'inferenza di un singolo modello potrebbe essere più appropriata.
Ambienti supportati
Ultralytics fornisce una gamma di ambienti pronti all'uso, ciascuno preinstallato con dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per avviare i tuoi progetti.
- Notebook GPU gratuiti:
- Google Cloud: Guida rapida GCP
- Amazon: Guida rapida 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 vengono superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 attraverso vari aspetti chiave: training, validation, inference, export e benchmarks. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test eseguiti ogni 24 ore e ad ogni nuovo commit.