YOLOv5 Modell-Ensembling

📚 Dieser Leitfaden erklärt, wie du das Ultralytics YOLOv5 🚀 Modell-Ensembling während des Tests und der Inferenz nutzt, um mAP und Recall zu verbessern.

Vom 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 den Einsatz unterschiedlicher Trainingsdaten-Sätze. Das Ensemble-Modell aggregiert dann die Vorhersage jedes Basismodells und führt zu einer finalen Vorhersage für die unbekannten Daten. Die Motivation für die Nutzung von Ensemble-Modellen liegt darin, den Generalisierungsfehler der Vorhersage zu reduzieren. Solange die Basismodelle divers und unabhängig sind, sinkt der Vorhersagefehler des Modells, wenn der Ensemble-Ansatz verwendet wird. Der Ansatz sucht die Weisheit der Masse bei der Erstellung einer Vorhersage. Obwohl das Ensemble-Modell mehrere Basismodelle innerhalb des Modells enthält, agiert und performt es wie ein einzelnes Modell.

Bevor du beginnst

Klon das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch vom neuesten YOLOv5-Release heruntergeladen.

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

Normaler Test

Etabliere 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 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 --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 während des Tests und 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 gemeinsam:

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

Du 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 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/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.844

Ensemble-Inferenz

Hänge zusätzliche Modelle an das --weights-Argument an, um die 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/exp-2
Done. (0.223s)
YOLO inference result

Vorteile des Modell-Ensemblings

Das Modell-Ensembling mit YOLOv5 bietet mehrere Vorteile:

  1. Verbesserte Genauigkeit: Wie in den obigen Beispielen gezeigt, erhöht das Ensembling mehrerer Modelle den mAP von 0,504 auf 0,515 und die mAR von 0,681 auf 0,689.
  2. Bessere Generalisierung: Die Kombination verschiedener Modelle hilft, Overfitting zu reduzieren und verbessert die Leistung bei unterschiedlichen Daten.
  3. Erhöhte Robustheit: Ensembles sind in der Regel robuster gegenüber Rauschen und Ausreißern in den Daten.
  4. Komplementäre Stärken: Verschiedene Modelle können sich durch die Erkennung unterschiedlicher Objekttypen oder unter unterschiedlichen Umgebungsbedingungen auszeichnen.

Der primäre Kompromiss ist die erhöhte Inferenzzeit, wie in den Geschwindigkeitsmetriken gezeigt (22,4 ms für das Einzelmodell gegenüber 39,5 ms für das Ensemble).

Wann man Modell-Ensembling verwendet

Erwäge die Verwendung von Modell-Ensembling in folgenden Szenarien:

  • Wenn Genauigkeit wichtiger ist als Inferenzgeschwindigkeit
  • Für kritische Anwendungen, bei denen falsch-negative Ergebnisse minimiert werden müssen
  • Bei der Verarbeitung herausfordernder Bilder mit unterschiedlicher Beleuchtung, Verdeckung oder Skalierung
  • Während 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 sofort einsatzbereiter Umgebungen, die jeweils mit wesentlichen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorinstalliert sind, um deine Projekte zu starten.

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle Continuous Integration (CI)-Tests der YOLOv5 GitHub Actions erfolgreich durchlaufen. Diese CI-Tests prüfen rigoros die Funktionalität und Leistung von YOLOv5 über verschiedene wichtige Aspekte hinweg: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb auf macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jedem neuen Commit durchgeführt werden.

Kommentare