YOLOv5 Model-Ensembling#
📚 Dieser Leitfaden erklärt, wie du Ultralytics YOLOv5 🚀 für Model Ensembling beim Testen und bei der Inzidenz verwendest, um mAP und Recall zu verbessern.
Aus dem Bereich ensemble learning:
Ensemble Modeling ist ein Prozess, bei dem mehrere verschiedene Modelle erstellt werden, um ein Ergebnis vorherzusagen, entweder durch die Verwendung vieler verschiedener Modellierungsalgorithmen oder durch die Verwendung verschiedener training data-Sätze. Das Ensemble-Modell aggregiert dann die Vorhersage jedes Basismodells und liefert eine finale Vorhersage für die ungesehenen Daten. Die Motivation für die Verwendung von Ensemble-Modellen besteht darin, den Generalisierungsfehler der Vorhersage zu reduzieren. Solange die Basismodelle vielfältig und unabhängig sind, sinkt der Vorhersagefehler des Modells bei Verwendung des Ensemble-Ansatzes. Der Ansatz nutzt die Schwarmintelligenz (wisdom of crowds) für Vorhersagen. Obwohl das Ensemble-Modell mehrere Basismodelle enthält, verhält es sich wie ein einzelnes Modell und leistet Entsprechendes.
Bevor du beginnst#
Koniere das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus dem neuesten YOLOv5-Release heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installNormaler Test#
Ermittle vor dem Ensembling die Basisleistung eines einzelnen Modells. Dieser Befehl testet YOLOv5x auf COCO val2017 bei einer Bildgröße von 640 Pixeln. yolov5x.pt ist das größte und präziseste verfügbare Modell. Weitere Optionen sind yolov5s.pt, yolov5m.pt und yolov5l.pt oder dein eigener Checkpoint aus dem Training mit einem benutzerdefinierten Dataset ./weights/best.pt. Details zu allen verfügbaren Modellen findest du in der pretrained checkpoints table.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfAusgabe:
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.826Ensemble-Test#
Mehrere vortrainierte Modelle können zur Test- und Inferenzzeit zu einem Ensemble zusammengefasst werden, indem einfach weitere Modelle an das Argument --weights in jedem beliebigen val.py- oder detect.py-Befehl angehängt werden. Dieses Beispiel testet ein Ensemble aus 2 Modellen gemeinsam:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfDu kannst beliebig viele Checkpoints auflisten, einschließlich benutzerdefinierter Gewichte wie runs/train/exp-5/weights/best.pt. YOLOv5 führt jedes Modell automatisch aus, gleicht die Vorhersagen pro Bild ab und mittelt die Ergebnisse vor der Durchführung von NMS.
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/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.844Ensemble-Inferenz#
Hänge zusätzliche Modelle an das Argument --weights an, um die Ensemble-Inferenz auszuführen:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/imagesAusgabe:
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)
Vorteile des Model-Ensembling#
Model-Ensembling mit YOLOv5 bietet mehrere Vorteile:
- Verbesserte Genauigkeit: Wie in den obigen Beispielen gezeigt, erhöht das Ensembling mehrerer Modelle den mAP von 0,504 auf 0,515 und den mAR von 0,681 auf 0,689.
- Bessere Generalisierung: Die Kombination verschiedener Modelle hilft, Overfitting zu reduzieren und verbessert die Leistung bei unterschiedlichen Daten.
- Erhöhte Robustheit: Ensembles sind in der Regel robuster gegenüber Rauschen und Ausreißern in den Daten.
- Komplementäre Stärken: Verschiedene Modelle können sich bei der Erkennung unterschiedlicher Objekttypen oder unter verschiedenen Umgebungsbedingungen auszeichnen.
Der größte Kompromiss ist die erhöhte Inferenzzeit, wie in den Geschwindigkeitsmetriken zu sehen (22,4 ms für ein einzelnes Modell gegenüber 39,5 ms für das Ensemble).
Wann du Model-Ensembling verwenden solltest#
Erwäge 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 unterschiedlicher Beleuchtung, Okklusion oder Skalierung
- Bei Wettbewerben oder Benchmarking, wo 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 einsatzbereiter Umgebungen, die jeweils mit wesentlichen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorinstalliert sind, um deine Projekte zu starten.
- Kostenlose GPU-Notebooks:
- Google Cloud: GCP-Schnellstartanleitung
- Amazon: AWS-Schnellstartanleitung
- Azure: AzureML-Schnellstartanleitung
- Docker: Docker-Schnellstartanleitung
Projektstatus#
Dieses Badge zeigt an, dass alle Continuous Integration (CI)-Tests von YOLOv5 GitHub Actions erfolgreich bestanden wurden. Diese CI-Tests überprüfen streng 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 alle 24 Stunden und bei jedem neuen Commit Tests durchgeführt werden.