YOLOv5 Model Ensembling
📚 Dieser Leitfaden erklärt, wie man Ultralytics YOLOv5 🚀 Model Ensembling während des Testens und der Inferenz für verbessertes mAP und Recall verwendet.
Aus dem Ensemble Learning:
Ensemble-Modellierung ist ein Prozess, bei dem mehrere unterschiedliche Modelle erstellt werden, um ein Ergebnis vorherzusagen, entweder durch die Verwendung vieler verschiedener Modellierungsalgorithmen oder durch die Verwendung unterschiedlicher Trainingsdatensätze. Das Ensemble-Modell aggregiert dann die Vorhersage jedes Basismodells und führt zu einer endgültigen Vorhersage für die ungesehenen Daten. Die Motivation für die Verwendung von Ensemble-Modellen ist die Reduzierung des Generalisierungsfehlers der Vorhersage. Solange die Basismodelle vielfältig und unabhängig sind, verringert sich der Vorhersagefehler des Modells, wenn der Ensemble-Ansatz verwendet wird. Der Ansatz sucht die Weisheit der Vielen bei der Erstellung einer Vorhersage. Auch wenn das Ensemble-Modell mehrere Basismodelle innerhalb des Modells hat, agiert und performt es als ein einzelnes Modell.
Bevor Sie beginnen
Repository klonen und requirements.txt in einer Python>=3.8.0-Umgebung installieren, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Normal testen
Ermitteln Sie die Ausgangsleistung eines einzelnen Modells, bevor Sie mit dem Ensembling beginnen. Dieser Befehl testet YOLOv5x auf COCO val2017 bei einer Bildgröße von 640 Pixeln. yolov5x.pt
ist das größte und genaueste verfügbare Modell. Andere Optionen sind yolov5s.pt
, yolov5m.pt
und yolov5l.pt
, oder Ihren eigenen Checkpoint aus dem Training eines benutzerdefinierten Datensatzes übergeben ./weights/best.pt
. Einzelheiten zu allen verfügbaren Modellen finden Sie im Tabelle der vortrainierten Checkpoints.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
Ausgabe:
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
Ensemble-Test
Mehrere vortrainierte Modelle können zur Test- und Inferenzzeit zusammengeführt werden, indem einfach zusätzliche Modelle an die --weights
Argument in einem bestehenden val.py- oder detect.py-Befehl. Dieses Beispiel testet ein Ensemble von 2 Modellen zusammen:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
Ausgabe:
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
Ensemble-Inferenz
Fügen Sie zusätzliche Modelle zum --weights
Argument zum Ausführen einer Ensemble-Inferenz:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
Ausgabe:
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)
Vorteile von Model Ensembling
Die Modell-Ensemble-Methode mit YOLOv5 bietet mehrere Vorteile:
- Verbesserte Genauigkeit: Wie in den obigen Beispielen gezeigt, erhöht das Ensembling mehrerer Modelle die mAP von 0,504 auf 0,515 und die mAR von 0,681 auf 0,689.
- Bessere Generalisierung: Die Kombination verschiedener Modelle hilft, Overfitting zu reduzieren und die Leistung bei unterschiedlichen Daten zu verbessern.
- Erhöhte Robustheit: Ensembles sind typischerweise robuster gegenüber Rauschen und Ausreißern in den Daten.
- Komplementäre Stärken: Verschiedene Modelle können sich bei der Erkennung verschiedener Arten von Objekten oder unter verschiedenen Umgebungsbedingungen auszeichnen.
Der Hauptkompromiss ist eine erhöhte Inferenzzeit, wie in den Geschwindigkeitsmetriken dargestellt (22,4 ms für ein einzelnes Modell vs. 39,5 ms für ein Ensemble).
Wann Model Ensembling verwendet werden sollte
Erwägen Sie die Verwendung von Model Ensembling in diesen Szenarien:
- Wenn Genauigkeit wichtiger ist als Inferenzgeschwindigkeit
- Für kritische Anwendungen, bei denen falsch-negative Ergebnisse minimiert werden müssen
- Bei der Verarbeitung anspruchsvoller Bilder mit unterschiedlichen Lichtverhältnissen, Verdeckungen oder Skalierungen
- Bei Wettbewerben oder Benchmarking, bei denen maximale Leistung erforderlich ist
Für Echtzeitanwendungen mit strengen Latenzanforderungen ist die Inferenz mit einem einzelnen Modell möglicherweise besser geeignet.
Unterstützte Umgebungen
Ultralytics bietet eine Reihe von gebrauchsfertigen Umgebungen, die jeweils mit wichtigen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorinstalliert sind, um Ihre Projekte zu starten.
- Kostenlose GPU Notebooks:
- Google Cloud: GCP Quickstart-Anleitung
- Amazon: AWS Quickstart-Anleitung
- Azure: AzureML Quickstart-Anleitung
- Docker: Docker Quickstart-Anleitung
Projektstatus
Dieses Badge zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen rigoros die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jedem neuen Commit durchgeführt werden.