YOLOv5 Modellzusammenstellung
In diesem Leitfaden wird erklärt, wie Ultralytics YOLOv5 🚀 Modell-Ensembling während des Testens und der Inferenz zur Verbesserung von mAP und Recall verwendet werden kann.
Vom Ensemble-Lernen:
Bei der Ensemble-Modellierung werden mehrere verschiedene Modelle erstellt, um ein Ergebnis vorherzusagen, indem entweder viele verschiedene Modellierungsalgorithmen oder verschiedene Trainingsdatensätze verwendet werden. Das Ensemblemodell fasst dann die Vorhersage jedes Basismodells zusammen und ergibt eine endgültige Vorhersage für die ungesehenen Daten. Der Grund für die Verwendung von Ensemble-Modellen ist die Verringerung des Generalisierungsfehlers der Vorhersage. Solange die Basismodelle unterschiedlich und unabhängig sind, sinkt der Vorhersagefehler des Modells, wenn der Ensemble-Ansatz verwendet wird. Bei diesem Ansatz wird die Weisheit der Masse für eine Vorhersage genutzt. Auch wenn das Ensemble-Modell mehrere Basismodelle enthält, verhält es sich wie ein einziges Modell.
Bevor Sie beginnen
Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Test Normalerweise
Vor dem Ensembling sollte die Basisleistung eines einzelnen Modells ermittelt werden. 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 Kontrollpunkt aus dem Training eines eigenen Datensatzes ./weights/best.pt
. Einzelheiten zu allen verfügbaren Modellen finden Sie in der Tabelle der vortrainierten Kontrollpunkte.
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_hybrid=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ügt 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
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_hybrid=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ängen Sie zusätzliche Modelle an die --weights
Argument, um die Ensemble-Inferenz durchzuführen:
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 Modellzusammenstellung mit YOLOv5 bietet mehrere Vorteile:
- Verbesserte Genauigkeit: Wie in den obigen Beispielen gezeigt, erhöht sich durch die Zusammenstellung mehrerer Modelle mAP von 0,504 auf 0,515 und mAR von 0,681 auf 0,689.
- Bessere Verallgemeinerung: Durch die Kombination verschiedener Modelle wird die Überanpassung reduziert und die Leistung bei unterschiedlichen Daten verbessert.
- Verbesserte 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 verschiedener Objektarten oder unter verschiedenen Umgebungsbedingungen auszeichnen.
Der primäre Kompromiss ist eine längere Inferenzzeit, wie die Geschwindigkeitsmetrik zeigt (22,4 ms für ein einzelnes Modell gegenüber 39,5 ms für das Ensemble).
Wann sollte man Model Ensembling verwenden?
Erwägen Sie in diesen Szenarien die Verwendung von Modell-Ensembling:
- Wenn die Genauigkeit wichtiger ist als die Geschwindigkeit der Schlussfolgerungen
- Für kritische Anwendungen, bei denen falsch-negative Ergebnisse minimiert werden müssen
- Bei der Verarbeitung schwieriger Bilder mit unterschiedlicher Beleuchtung, Verdeckung oder Skalierung
- Bei Wettbewerben oder Benchmarking, wo maximale Leistung gefordert ist
Für Echtzeitanwendungen mit strengen Latenzanforderungen ist die Inferenz eines einzelnen Modells möglicherweise besser geeignet.
Unterstützte Umgebungen
Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.
- Kostenlose GPU Notizbücher:
- Google Wolke: GCP-Schnellstart-Anleitung
- Amazon: AWS Schnellstart-Anleitung
- Azure: AzureML-Schnellstart-Anleitung
- Docker: Docker-Schnellstart-Anleitung
Projektstatus
Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen 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 jeder neuen Übertragung durchgeführt werden.