YOLO Vision 2026:

YOLOv5-Modellensembles#

📚 Dieser Leitfaden erklärt, wie du während des Testens und der Inferenz 🚀 Modellensembles von Ultralytics YOLOv5 für ein verbessertes mAP und einen höheren Recall verwendest.

Aus dem Ensemble-Lernen:

Ensemble-Modellierung ist ein Verfahren, bei dem mehrere unterschiedliche Modelle erstellt werden, um ein Ergebnis vorherzusagen – entweder durch die Verwendung vieler verschiedener Modellierungsalgorithmen oder verschiedener Datensätze mit Trainingsdaten. Das Ensemble-Modell aggregiert anschließend die Vorhersage jedes Basismodells und erzeugt eine endgültige Vorhersage für die bisher unbekannten Daten. Der Grund 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 durch den Einsatz des Ensemble-Ansatzes. Dieser Ansatz nutzt die Weisheit der Vielen für die Erstellung einer Vorhersage. Obwohl das Ensemble-Modell mehrere Basismodelle umfasst, verhält und leistet es sich wie ein einzelnes Modell.

Bevor du beginnst#

Klone das Repository und installiere requirements.txt in einer Python>=3.8.0-Umgebung einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus der neuesten YOLOv5-Version heruntergeladen.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Normal testen#

Bevor du ein Ensemble bildest, solltest du die Basisleistung eines einzelnen Modells ermitteln. Dieser Befehl testet YOLOv5x auf COCO val2017 mit einer Bildgröße von 640 Pixeln. yolov5x.pt ist das größte und genaueste verfügbare Modell. Weitere Optionen sind yolov5s.pt, yolov5m.pt und yolov5l.pt oder dein eigener Checkpoint aus dem Training eines benutzerdefinierten Datensatzes ./weights/best.pt. Einzelheiten zu allen verfügbaren Modellen findest du in der 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 zum Testzeitpunkt und während der Inferenz gemeinsam als Ensemble verwendet werden, indem du in einem beliebigen bestehenden val.py- oder detect.py-Befehl einfach weitere Modelle an das Argument --weights anhängst. Dieses Beispiel testet ein Ensemble aus 2 Modellen:

  • YOLOv5x
  • YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half

Du kannst beliebig viele Checkpoints angeben, einschließlich benutzerdefinierter Gewichte wie runs/train/exp5/weights/best.pt. YOLOv5 führt automatisch jedes Modell aus, richtet die Vorhersagen bildweise aus und mittelt die Ausgaben, 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/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#

Hänge weitere Modelle an das Argument --weights an, um eine Ensemble-Inferenz auszuführen:

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)
YOLO inference result

Vorteile von Modellensembles#

Modellensembles mit YOLOv5 bieten mehrere Vorteile:

  1. Höhere Genauigkeit: Wie die obigen Beispiele zeigen, erhöht die Kombination mehrerer Modelle den mAP von 0.504 auf 0.515 und den mAR von 0.681 auf 0.689.
  2. Bessere Generalisierung: Die Kombination vielfältiger Modelle trägt dazu bei, Overfitting zu reduzieren und die Leistung bei unterschiedlichen Daten zu verbessern.
  3. Höhere Robustheit: Ensembles sind in der Regel robuster gegenüber Rauschen und Ausreißern in den Daten.
  4. Ergänzende Stärken: Verschiedene Modelle können bei der Erkennung unterschiedlicher Objektarten oder unter verschiedenen Umgebungsbedingungen besonders leistungsfähig sein.

Der wichtigste Nachteil ist die längere Inferenzzeit, wie die Geschwindigkeitsmetriken zeigen (22.4 ms für ein einzelnes Modell gegenüber 39.5 ms für ein Ensemble).

Wann du Modellensembles verwenden solltest#

Ziehe den Einsatz von Modellensembles in diesen Szenarien in Betracht:

  • Wenn Genauigkeit wichtiger ist als Inferenzgeschwindigkeit
  • Bei kritischen Anwendungen, bei denen falsch-negative Ergebnisse minimiert werden müssen
  • Bei der Verarbeitung anspruchsvoller Bilder mit unterschiedlicher Beleuchtung, Verdeckung oder Skalierung
  • Bei Wettbewerben oder beim Benchmarking, wenn 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 stellt eine Reihe sofort einsatzbereiter Umgebungen bereit, in denen wichtige Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch bereits installiert sind, damit du deine Projekte schnell starten kannst.

Projektstatus#

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle GitHub-Actions für YOLOv5-Tests zur kontinuierlichen Integration (CI) erfolgreich durchlaufen. Diese CI-Tests prüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen wichtigen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden sowie bei jedem neuen Commit durchgeführt.

Kommentare