Ensemble di modelli YOLOv5#
📚 Questa guida spiega come utilizzare l'ensemble di modelli di Ultralytics YOLOv5 🚀 durante il testing e l'inferenza per migliorare l'mAP e il Recall.
Dall'ensemble learning:
L'ensemble modeling è un processo in cui vengono creati più modelli diversi per prevedere un risultato, utilizzando molti algoritmi di modellazione differenti o diversi set di dati di addestramento. Il modello di ensemble aggrega quindi la previsione di ciascun modello di base e produce una previsione finale per i dati non visti. La motivazione per l'uso dei modelli di ensemble è ridurre l'errore di generalizzazione della previsione. Finché i modelli di base sono diversificati e indipendenti, l'errore di previsione del modello diminuisce quando si utilizza l'approccio di ensemble. L'approccio cerca la saggezza della folla nel fare una previsione. Anche se il modello di ensemble include più modelli di base al suo interno, si comporta e funziona come un unico modello.
Prima di iniziare#
Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, inclusi 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 # installTest standard#
Prima di effettuare l'ensemble, stabilisci le prestazioni di base di un singolo modello. Questo comando testa YOLOv5x su COCO val2017 a una dimensione di immagine di 640 pixel. yolov5x.pt è il modello più grande e accurato disponibile. Altre opzioni sono yolov5s.pt, yolov5m.pt e yolov5l.pt, oppure il tuo checkpoint derivante dall'addestramento di un dataset personalizzato ./weights/best.pt. Per i dettagli su tutti i modelli disponibili, consulta la tabella dei checkpoint pre-addestrati.
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 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.826Test Ensemble#
È possibile combinare più modelli pre-addestrati in un ensemble durante il test e l'inferenza semplicemente aggiungendo modelli extra all'argomento --weights in qualsiasi comando val.py o detect.py esistente. Questo esempio testa un ensemble di 2 modelli insieme:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfPuoi elencare tutti i checkpoint che desideri, inclusi pesi personalizzati come runs/train/exp-5/weights/best.pt. YOLOv5 eseguirà automaticamente ciascun modello, allineerà le previsioni su base immagine per immagine e ne farà 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/exp-3/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.844Inferenza Ensemble#
Aggiungi modelli extra all'argomento --weights per eseguire l'inferenza con l'ensemble:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/imagesOutput:
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/exp-2
Done. (0.223s)
Vantaggi dell'ensemble di modelli#
L'ensemble di modelli con YOLOv5 offre diversi vantaggi:
- Accuratezza migliorata: Come dimostrato negli esempi precedenti, l'ensemble di più modelli aumenta l'mAP da 0.504 a 0.515 e l'mAR da 0.681 a 0.689.
- Migliore generalizzazione: Combinare modelli diversi aiuta a ridurre l'overfitting e migliora le prestazioni su dati vari.
- Maggiore robustezza: Gli ensemble sono solitamente più robusti rispetto al rumore e ai valori anomali nei dati.
- Punti di forza complementari: Modelli diversi possono eccellere nel rilevare tipi differenti di oggetti o in condizioni ambientali diverse.
Il compromesso principale è un aumento del tempo di inferenza, come mostrato nelle metriche di velocità (22.4ms per il modello singolo contro 39.5ms per l'ensemble).
Quando utilizzare l'ensemble di modelli#
Valuta l'utilizzo dell'ensemble di modelli in questi scenari:
- Quando l'accuratezza è più importante della velocità di inferenza
- Per applicazioni critiche in cui i falsi negativi devono essere ridotti al minimo
- Quando elabori immagini complesse con illuminazione, occlusione o scala variabili
- Durante competizioni o benchmark dove sono richieste prestazioni massime
Per applicazioni real-time con rigidi requisiti di latenza, l'inferenza con modello singolo potrebbe essere più appropriata.
Ambienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno preinstallato con dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.
- Notebook GPU Gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida AWS
- Azure: Guida rapida 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 su vari aspetti chiave: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e a ogni nuovo commit.