Link to this sectionYOLOv5 Model-Ensembling#
📚 Dieser Leitfaden erklärt, wie du Ultralytics YOLOv5 🚀 Model-Ensembling während des Testens und der Inferenz einsetzt, um mAP und Recall zu verbessern.
Vom Ensemble Learning:
Ensemble-Modellierung ist ein Prozess, bei dem mehrere verschiedene Modelle erstellt werden, um ein Ergebnis vorherzusagen, entweder durch die Verwendung vieler unterschiedlicher Modellierungsalgorithmen oder durch die Nutzung verschiedener Trainingsdaten-Sätze. Das Ensemble-Modell aggregiert dann die Vorhersage jedes Basismodells und führt zu einem Endergebnis für die unbekannten Daten. Die Motivation für die Verwendung von Ensemble-Modellen liegt darin, den Generalisierungsfehler der Vorhersage zu verringern. Solange die Basismodelle vielfältig und unabhängig sind, sinkt der Vorhersagefehler des Modells, wenn der Ensemble-Ansatz verwendet wird. Der Ansatz sucht die Weisheit der Vielen bei der Erstellung einer Vorhersage. Obwohl das Ensemble-Modell mehrere Basismodelle innerhalb des Modells enthält, agiert und funktioniert es wie ein einzelnes Modell.
Link to this sectionBevor du beginnst#
Klone das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5-Release heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installLink to this sectionNormaler Test#
Bevor du mit dem Ensembling beginnst, bestimme 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 genaueste verfügbare Modell. Andere Optionen sind yolov5s.pt, yolov5m.pt und yolov5l.pt oder dein eigener Checkpoint aus dem Training eines benutzerdefinierten Datensatzes ./weights/best.pt. Details zu allen verfügbaren Modellen findest du in der Tabelle der vortrainierten Checkpoints.
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.826Link to this sectionEnsemble-Test#
Mehrere vortrainierte Modelle können beim Testen und bei der Inferenz zusammengefügt werden, indem einfach zusätzliche Modelle an das --weights-Argument in jedem bestehenden val.py- oder detect.py-Befehl angehängt werden. Dieses Beispiel testet ein Ensemble aus 2 Modellen zusammen:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfDu kannst so viele Checkpoints auflisten, wie du möchtest, einschließlich benutzerdefinierter Gewichte wie runs/train/exp-5/weights/best.pt. YOLOv5 führt automatisch jedes Modell aus, gleicht die Vorhersagen pro Bild ab und mittelt die Ergebnisse, bevor NMS durchgeführt wird.
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.844Link to this sectionEnsemble-Inferenz#
Hänge zusätzliche Modelle an das --weights-Argument an, um eine 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)
Link to this sectionVorteile 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).
Link to this sectionWann 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.
Link to this sectionUnterstützte Umgebungen#
Ultralytics bietet eine Reihe sofort 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 Schnellstart-Anleitung
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Link to this sectionProjektstatus#
Dieses Badge zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich sind. Diese CI-Tests überprüfen rigoros die Funktionalität und Leistung von YOLOv5 in verschiedenen wichtigen Aspekten: 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.