Modellvalidierung mit Ultralytics YOLO#
Einführung#
Die Validierung ist ein entscheidender Schritt in der Pipeline für maschinelles Lernen und ermöglicht es dir, die Qualität deiner trainierten Modelle zu beurteilen. Der Val-Modus von Ultralytics YOLO26 bietet eine umfassende Auswahl an Werkzeugen und Metriken zur Bewertung der Leistung deiner Modelle zur Objekterkennung. Dieser Leitfaden erklärt ausführlich, wie du den Val-Modus effektiv einsetzt, um sicherzustellen, dass deine Modelle sowohl genau als auch zuverlässig sind.
Vorläufige Validierungsergebnisse findest du in der Vorschauversion von YOLO27.
Ansehen: Tutorial zu den Ultralytics-Modi: Validierung
Warum mit Ultralytics YOLO validieren?#
Darum ist der Val-Modus von YOLO26 von Vorteil:
- Präzision: Ermittle genaue Kennzahlen wie mAP50, mAP75 und mAP50-95, um dein Modell umfassend zu bewerten.
- Komfort: Nutze integrierte Funktionen, die sich an die Trainingseinstellungen erinnern und so den Validierungsprozess vereinfachen.
- Flexibilität: Validiere dein Modell mit denselben oder anderen Datensätzen und Bildgrößen.
- Hyperparameteroptimierung: Nutze Validierungskennzahlen, um dein Modell für eine bessere Leistung fein abzustimmen.
Wichtige Funktionen des Val-Modus#
Dies sind die wichtigsten Funktionen des Val-Modus von YOLO26:
- Automatische Einstellungen: Modelle speichern ihre Trainingskonfigurationen für eine unkomplizierte Validierung.
- Unterstützung mehrerer Kennzahlen: Bewerte dein Modell anhand einer Reihe von Genauigkeitskennzahlen.
- CLI und Python-API: Wähle für die Validierung je nach Vorliebe die Befehlszeile oder die Python-API.
- Datenkompatibilität: Funktioniert nahtlos sowohl mit den während des Trainings verwendeten als auch mit benutzerdefinierten Datensätzen.
- YOLO26-Modelle speichern ihre Trainingseinstellungen automatisch. Daher validiert
yolo val model=path/to/best.ptoderYOLO("path/to/best.pt").val()mit der beim Training verwendeten Bildgröße auf dem ursprünglichen Datensatz. Bei offiziellen Gewichten wird auf den für die Aufgabe standardmäßig vorgesehenen Datensatz zurückgegriffen; mitdatakannst du diesen überschreiben.
Anwendungsbeispiele#
Validiere die Genauigkeit eines trainierten YOLO26n-Modells. Dafür sind keine Argumente erforderlich, da model die beim Training verwendeten data und Argumente als Modellattribute speichert: path/to/best.pt validiert auf dem Datensatz, mit dem das Modell trainiert wurde. Offizielle Gewichte speichern einen Trainingsdatensatzpfad, der auf deinem Rechner nicht vorhanden ist. Daher wird mit einer Warnung auf den für die Aufgabe standardmäßig vorgesehenen coco8.yaml zurückgegriffen. Mit data kannst du die Validierung auf einem anderen Datensatz durchführen. Eine vollständige Liste der Validierungsargumente findest du weiter unten im Abschnitt „Argumente“.
Unter Windows kann beim Starten der Validierung als Skript ein RuntimeError auftreten. Füge vor deinem Validierungscode einen Block if __name__ == "__main__": ein, um das Problem zu beheben.
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt") # Ein offizielles Modell laden
model = YOLO("path/to/best.pt") # Ein benutzerdefiniertes Modell laden
# Das Modell validieren
metrics = model.val() # Keine Argumente erforderlich, Datensatz und Einstellungen werden gespeichert
metrics.box.map # map50-95
metrics.box.map50 # map50
metrics.box.map75 # map75
metrics.box.maps # Eine Liste mit mAP50-95-Werten für jede Kategorie
metrics.box.image_metrics # Kennzahlenverzeichnis pro Bild mit Präzision, Trefferquote, F1, TP, FP und FNArgumente für die YOLO-Modellvalidierung#
Bei der Validierung von YOLO-Modellen lassen sich verschiedene Argumente fein abstimmen, um den Auswertungsprozess zu optimieren. Diese Argumente steuern unter anderem die Eingabebildgröße, die Stapelverarbeitung und Leistungsschwellenwerte. Im Folgenden findest du eine ausführliche Erläuterung der einzelnen Argumente, damit du deine Validierungseinstellungen gezielt anpassen kannst.
| Argument | Typ | Standard | Beschreibung |
|---|---|---|---|
data | str | None | Gibt den Pfad zur Dataset-YAML-Datei an (z. B. coco8.yaml), die den Pfad zu den Validierungsdaten enthalten sollte. Für die Klassifizierung wird stattdessen ein Dataset-Verzeichnis oder der Name eines integrierten Datensatzes verwendet (z. B. imagenet10). |
imgsz | int | 640 | Legt die Größe der Eingabebilder fest. Vor der Verarbeitung werden alle Bilder auf diese Abmessungen skaliert. Größere Abmessungen können die Genauigkeit bei kleinen Objekten verbessern, erhöhen aber den Rechenaufwand. |
batch | int | 16 | Legt die Anzahl der Bilder pro Batch fest. Höhere Werte nutzen den GPU-Speicher effizienter, benötigen aber mehr VRAM. Passe den Wert an die verfügbaren Hardwareressourcen an. |
save_json | bool | False | Wenn True aktiviert ist, werden die Ergebnisse zur weiteren Analyse, zur Einbindung in andere Werkzeuge oder zur Übermittlung an Evaluierungsserver wie COCO in einer JSON-Datei gespeichert. Bei Erkennungsdatensätzen werden die Vorhersagen außerdem mit faster-coco-eval ausgewertet. Die mAP-Werte für kleine, mittlere und große Objekte werden während des Trainings in results.csv als metrics/mAP_small(B), metrics/mAP_medium(B) und metrics/mAP_large(B) protokolliert. |
conf | float | 0.001 | Legt den Mindestkonfidenzschwellenwert für Erkennungen fest. Niedrigere Werte erhöhen den Recall, können aber mehr falsch-positive Ergebnisse verursachen. Präzisions-Recall-Kurven, mAP und Erkennungskonfusionsmatrizen verwenden diesen Wert. Ein höherer Wert für conf, etwa 0.25, führt zu einer Matrix, die der Vorhersageausgabe stärker entspricht, kann aber die mAP senken. Die zusammengefassten Werte für Präzision und Recall verwenden die Konfidenz mit dem maximalen F1-Wert und können daher von den aus confusion_matrix.png abgeleiteten Werten abweichen. Für die OBB-Validierung standardmäßig 0.01, um den Speicherbedarf zu verringern. |
iou | float | 0.7 | Legt den Schwellenwert für die Schnittmenge über Vereinigungsmenge für die Nichtmaximalwertunterdrückung fest. Steuert das Entfernen doppelter Erkennungen. |
max_det | int | 300 | Begrenzt die maximale Anzahl der Erkennungen pro Bild. Bei detect, segment, pose und OBB wird der Wert 300 auf die größte Anzahl beschrifteter Objekte im validierten Split angehoben, falls ein Bild diesen Wert überschreitet; dabei wird eine Warnung ausgegeben. Jeder andere Wert bleibt unverändert; wird er von einem Bild überschritten, weist eine Warnung darauf hin, dass der Recall begrenzt sein kann. |
quantize | int oder str | None | Validierungspräzision: 16/"fp16" und 32/"fp32"/nicht gesetzt wählen die FP16- oder FP32-Berechnung für PyTorch- und TorchScript-Modelle; andere Formate berechnen mit der Präzision, die ihr Artefakt und ihre Laufzeitumgebung vorgeben. Bei 16 rundet OpenVINO die Eingabe auf Clientseite weiterhin auf FP16 und erweitert sie anschließend wieder auf FP32, ohne die Präzision der Berechnung durch die Laufzeitumgebung zu ändern. INT8/PTQ-Quantisierung wird beim Export konfiguriert und anschließend bei der Validierung des exportierten Modells verwendet. Ersetzt das veraltete Flag half. |
device | str | None | Gibt das Gerät für die Validierung an (cpu, cuda:0, npu, npu:0 usw.). Bei None wird automatisch das beste verfügbare Gerät ausgewählt. Mehrere CUDA-Geräte können durch Kommas getrennt angegeben werden. |
dnn | bool | False | Wenn True aktiviert ist, verwendet die Inferenz von ONNX-Modellen das DNN-Modul von OpenCV als Alternative zu PyTorch-Inferenzmethoden. |
plots | bool | True | Bei True werden Vorhersagen im Vergleich zu den Ground-Truth-Daten, Konfusionsmatrizen und PR-Kurven zur visuellen Bewertung der Modellleistung erstellt und gespeichert. |
classes | list[int] | None | Gibt eine Liste der auszuwertenden Klassen-IDs an. Nützlich, um während der Auswertung bestimmte Klassen herauszufiltern und sich auf sie zu konzentrieren. |
rect | bool | True | Wenn True aktiviert ist, wird für das Batching die rechteckige Inferenz verwendet. Dadurch verringert sich die Auffüllung, und die Verarbeitung der Bilder mit ihrem ursprünglichen Seitenverhältnis kann Geschwindigkeit und Effizienz verbessern. Bei der Validierung von depth wird die Option ignoriert, da dort jedes Bild auf ein festes quadratisches imgsz-Format gestreckt statt aufgefüllt wird. |
split | str | 'val' | Legt den für die Validierung verwendeten Datensatz-Split fest (val, test oder train). So kannst du flexibel auswählen, welcher Datenabschnitt zur Leistungsbewertung verwendet wird. |
fraction | float, int oder list | 1.0 | Teilmenge des validierten Splits. Bei einer Liste in [train, val, test] gilt der Eintrag, der zu split passt (1 = vollständiger Split, Ganzzahlen über 1 = Anzahl der Bilder; ausgelassene Einträge entsprechen dem vollständigen Split). Ein einzelner Wert gilt nur für split=train; val und test verwenden dann den vollständigen Split. |
project | str | None | Name des Projektverzeichnisses, in dem die Validierungsausgaben gespeichert werden. Hilft dabei, Ergebnisse verschiedener Experimente oder Modelle zu organisieren. |
name | str | None | Name des Validierungslaufs. Dient zum Erstellen eines Unterverzeichnisses im Projektordner, in dem Validierungsprotokolle und -ausgaben gespeichert werden. |
verbose | bool | True | Wenn True aktiviert ist, werden während der Validierung ausführliche Informationen angezeigt, darunter Kennzahlen für jede Klasse, der Batch-Fortschritt und zusätzliche Informationen zur Fehlersuche. |
save_txt | bool | False | Wenn True aktiviert ist, werden Erkennungsergebnisse in Textdateien gespeichert, jeweils eine Datei pro Bild. Nützlich für weiterführende Analysen, benutzerdefinierte Nachbearbeitung oder die Einbindung in andere Systeme. |
save_conf | bool | False | Wenn True aktiviert ist, werden Konfidenzwerte in die gespeicherten Textdateien aufgenommen, sofern save_txt aktiviert ist. Dadurch stehen detailliertere Ausgaben für Analysen und Filterungen zur Verfügung. |
workers | int | 8 | Anzahl der Worker-Threads für das Laden von Daten. Höhere Werte können die Datenvorverarbeitung beschleunigen, aber die CPU-Auslastung erhöhen. Bei 0 wird der Hauptthread verwendet, was in manchen Umgebungen stabiler sein kann. |
augment | bool | False | Aktiviert Testzeit-Augmentierung (TTA) während der Validierung. Durch Inferenz auf transformierten Versionen der Eingabe kann sich die Erkennungsgenauigkeit verbessern, allerdings auf Kosten der Inferenzgeschwindigkeit. Nur für Ultralytics-PyTorch-Modelle verfügbar. |
agnostic_nms | bool | False | Aktiviert klassenunabhängige Nichtmaximalwertunterdrückung, bei der sich überlappende Boxen mit niedrigeren Konfidenzwerten unabhängig von der vorhergesagten Klasse unterdrückt werden. Nützlich für Anwendungen, bei denen einzelne Objekte im Mittelpunkt stehen. Bei der NMS-freien Inferenz (nms=False mit YOLO26 oder YOLOv10) verhindert dies lediglich, dass dieselbe Erkennung mit mehreren Klassenbezeichnungen erscheint (Duplikate mit IoU=1.0), und unterdrückt keine unterschiedlichen Boxen anhand eines IoU-Schwellenwerts. |
single_cls | bool | False | Behandelt während der Validierung alle Klassen als eine einzige Klasse. Nützlich, um die Modellleistung bei binären Erkennungsaufgaben zu bewerten oder wenn Klassenunterscheidungen keine Rolle spielen. |
visualize | bool | False | Visualisiert für jedes Bild die Ground-Truth-Daten, richtig-positiven, falsch-positiven und falsch-negativen Ergebnisse. Nützlich für die Fehlersuche und die Interpretation des Modells. |
show_labels | bool | True | Zeigt Klassenbezeichnungen in Validierungsvisualisierungen an, wenn visualize=True aktiviert ist. Setze den Wert auf False, um Übereinstimmungen und Fehler übersichtlicher darzustellen. |
show_conf | bool | True | Zeigt Konfidenzwerte in Validierungsvisualisierungen an, wenn visualize=True aktiviert ist. Setze den Wert auf False, um Übereinstimmungen und Fehler übersichtlicher darzustellen. |
compile | bool oder str | False | Aktiviert die PyTorch-2.x-Graphkompilierung torch.compile mit backend='inductor'. Akzeptiert True → "default", False → deaktiviert oder einen Zeichenfolgenmodus wie "default", "reduce-overhead", "max-autotune-no-cudagraphs". Bei Nichtunterstützung wird mit einer Warnung auf den Eager-Modus zurückgegriffen. |
channels_last | bool | None | Verwendet für die native PyTorch-Validierung das Speicherformat channels_last (NHWC). None aktiviert es automatisch auf oneDNN-fähigen Linux- und Windows-x86-CPUs mit PyTorch 1.13 oder neuer, False deaktiviert es und True fordert es auf unterstützten x86-CPUs oder CUDA-Geräten an. ARM64, MPS, ältere PyTorch-Versionen, CPUs ohne oneDNN und exportierte Formate bleiben unverändert; bei der Validierung während des Trainings bleibt das Layout des Trainingsmodells erhalten. |
nms | bool, optional | None | Führt standardmäßig eine Viele-zu-eins-Inferenz mit NMS aus (None oder True). Setze False, um den NMS-freien Eins-zu-eins-Kopf zu verwenden, sofern verfügbar. Weitere Informationen findest du in der Anleitung zur End-to-End-Erkennung. |
Jede dieser Einstellungen spielt eine wichtige Rolle bei der Validierung und ermöglicht eine anpassbare und effiziente Auswertung von YOLO-Modellen. Wenn du diese Parameter an deine spezifischen Anforderungen und Ressourcen anpasst, findest du die optimale Balance zwischen Genauigkeit und Leistung.
Beispiel: Validierung mit Argumenten#
Ansehen: So exportierst du Modellvalidierungsergebnisse als CSV, JSON, SQL, Polars-DataFrame und mehr
Die folgenden Beispiele zeigen, wie du ein YOLO-Modell mit benutzerdefinierten Argumenten in Python und über die CLI validierst.
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt")
# Validierungseinstellungen anpassen
metrics = model.val(data="coco8.yaml", imgsz=640, batch=16, conf=0.25, iou=0.7, device="0")Mit dem bereitgestellten Code kannst du die Ergebnisse der ConfusionMatrix auch in verschiedenen Formaten speichern.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.val(data="coco8.yaml", plots=True)
print(results.confusion_matrix.to_df())Bei der Validierung werden Kennzahlen pro Bild zu Präzision, Trefferquote, F1, TP, FP und FN (bei einem IoU-Schwellenwert von 0.5) für alle Aufgaben außer der Klassifizierung gespeichert. Nach Abschluss der Validierung kannst du über results.box.image_metrics auf die Kennzahlen für Detektion und OBB, über results.seg.image_metrics auf die Kennzahlen für Segmentierung und über results.pose.image_metrics auf die Kennzahlen für Pose zugreifen.
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt")
# Validieren und auf Kennzahlen pro Bild zugreifen
results = model.val(data="coco8.yaml")
# image_metrics ist ein Verzeichnis mit Bilddateinamen als Schlüsseln
print(results.box.image_metrics)
# Ausgabe: {'image1.jpg': {'precision': 0.85, 'recall': 0.92, 'f1': 0.88, 'tp': 17, 'fp': 3, 'fn': 1}, ...}
# Auf Kennzahlen für ein bestimmtes Bild zugreifen
results.box.image_metrics["image1.jpg"] # {'precision': 0.85, 'recall': 0.92, 'f1': 0.88, 'tp': 17, 'fp': 3, 'fn': 1}Jeder Eintrag in image_metrics enthält die folgenden Schlüssel:
| Schlüssel | Beschreibung |
|---|---|
precision | Präzisionswert für das Bild (tp / (tp + fp)). |
recall | Trefferquotenwert für das Bild (tp / (tp + fn)). |
f1 | Harmonisches Mittel von Präzision und Trefferquote. |
tp | Anzahl der richtig-positiven Erkennungen für das Bild. |
fp | Anzahl der falsch-positiven Erkennungen für das Bild. |
fn | Anzahl der falsch-negativen Erkennungen für das Bild. |
Diese Funktion ist für die Aufgaben Detektion, Segmentierung, Pose und OBB verfügbar.
Das zurückgegebene Kennzahlenobjekt bietet außerdem Exporthilfen für nachgelagerte Analysen:
| Methode | Rückgabetyp | Beschreibung |
|---|---|---|
summary() | List[Dict[str, Any]] | Wandelt die Validierungsergebnisse in ein zusammengefasstes Wörterbuch um. |
to_df() | DataFrame | Gibt die Validierungsergebnisse als strukturierten Polars-DataFrame zurück. |
to_csv() | str | Exportiert die Validierungsergebnisse im CSV-Format und gibt die CSV-Zeichenfolge zurück. |
to_json() | str | Exportiert die Validierungsergebnisse im JSON-Format und gibt die JSON-Zeichenfolge zurück. |
Weitere Informationen findest du in der Dokumentation zur Klasse DataExportMixin.
Wie geht es weiter?#
Zufrieden mit den Kennzahlen? Exportiere das Modell in ein Bereitstellungsformat. Wenn die Genauigkeit nicht stimmt, kehre zurück und trainiere erneut – mit anderen Hyperparametern oder mehr Trainingsdaten.
Häufig gestellte Fragen#
Um dein YOLO26-Modell zu validieren, kannst du den von Ultralytics bereitgestellten Val-Modus verwenden. Mit der Python-API kannst du zum Beispiel ein Modell laden und die Validierung folgendermaßen ausführen:
from ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # Das Modell validieren metrics = model.val() print(metrics.box.map) # map50-95Alternativ kannst du die Befehlszeile (CLI) verwenden:
yolo detect val model=yolo26n.pt data=coco8.yamlFür weitere Anpassungen kannst du sowohl im Python- als auch im CLI-Modus verschiedene Argumente wie
imgsz,batchundconfändern. Die vollständige Liste der Parameter findest du im Abschnitt Argumente für die YOLO-Modellvalidierung.Bei der Validierung eines YOLO26-Modells werden mehrere wichtige Kennzahlen zur Bewertung der Modellleistung ermittelt. Dazu gehören:
- mAP50 (mittlere durchschnittliche Präzision bei einem IoU-Schwellenwert von 0.5)
- mAP75 (mittlere durchschnittliche Präzision bei einem IoU-Schwellenwert von 0.75)
- mAP50-95 (mittlere durchschnittliche Präzision über mehrere IoU-Schwellenwerte von 0.5 bis 0.95)
Mit der Python-API kannst du wie folgt auf diese Kennzahlen zugreifen:
metrics = model.val() # setzt voraus, dass `model` geladen wurde print(metrics.box.map) # mAP50-95 print(metrics.box.map50) # mAP50 print(metrics.box.map75) # mAP75 print(metrics.box.maps) # Liste mit mAP50-95-Werten für jede Kategorie print(metrics.box.image_metrics) # Kennzahlenverzeichnis pro Bild mit Präzision, Trefferquote, F1, TP, FP und FNFür eine vollständige Leistungsbewertung ist es wichtig, alle diese Kennzahlen zu prüfen. Weitere Informationen findest du unter Wichtige Funktionen des Val-Modus.
Die Validierung mit Ultralytics YOLO bietet mehrere Vorteile:
- Präzision: YOLO26 liefert genaue Leistungskennzahlen wie mAP50, mAP75 und mAP50-95.
- Komfort: Die Modelle speichern ihre Trainingseinstellungen, sodass sich die Validierung unkompliziert durchführen lässt.
- Flexibilität: Du kannst mit denselben oder anderen Datensätzen und Bildgrößen validieren.
- Hyperparameteroptimierung: Validierungskennzahlen helfen dabei, Modelle für eine bessere Leistung fein abzustimmen.
Diese Vorteile sorgen dafür, dass deine Modelle gründlich bewertet und für bessere Ergebnisse optimiert werden können. Weitere Informationen zu diesen Vorteilen findest du im Abschnitt Warum mit Ultralytics YOLO validieren.
Ja, du kannst dein YOLO26-Modell mit einem benutzerdefinierten Datensatz validieren. Gib für das Argument
dataden Pfad zu deiner Dataset-YAML-Datei an. Diese sollte den Pfad zu den Validierungsdaten enthalten. Für die Klassifizierung gibst du stattdessen ein Datensatzverzeichnis oder den Namen eines integrierten Datensatzes an (z. B.imagenet10).HinweisBei der Validierung werden die Klassennamen des Modells verwendet. Du kannst sie mit
model.namesanzeigen. Sie können von den Klassennamen abweichen, die im Datensatz selbst festgelegt sind.Beispiel in Python:
from ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # Mit einem benutzerdefinierten Datensatz validieren metrics = model.val(data="path/to/your/custom_dataset.yaml") print(metrics.box.map) # map50-95Beispiel mit der CLI:
yolo val model=yolo26n.pt data=path/to/your/custom_dataset.yamlWeitere Anpassungsmöglichkeiten während der Validierung findest du im Abschnitt Beispiel: Validierung mit Argumenten.
Um die Validierungsergebnisse in einer JSON-Datei zu speichern, kannst du beim Ausführen der Validierung das Argument
save_jsonaufTruesetzen. Das funktioniert sowohl mit der Python-API als auch mit der CLI.Beispiel in Python:
from ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # Validierungsergebnisse als JSON speichern metrics = model.val(save_json=True)Beispiel mit der CLI:
yolo val model=yolo26n.pt save_json=TrueBei Detektionsdatensätzen gibt
save_json=Trueüberfaster-coco-evalauch die mAP-Werte für kleine, mittlere und große Objekte aus. Weitere Informationen findest du unter Argumente für die YOLO-Modellvalidierung.