Ultralytics YOLO27: Trag dich in die Warteliste ein.
Get Started
LektionAnfänger

Datensatzspezifikation definieren

Plane Szenarien, Mengen, Variationen, Sonderfälle und Hintergrundbilder vor der Datenerfassung und richte den Umfang des Plans an den Mengenzielen von Ultralytics aus.

Teams ohne Spezifikation enden oft mit 5.000 gut beleuchteten Tagesaufnahmen von einer Kamera und einem Modell, das am ersten Produktionstag in der Abenddämmerung versagt. Eine Datensatzspezifikation ist eine Einkaufsliste für Bilder: alle Szenarien, die das Modell bewältigen muss, die benötigte Bildanzahl für jedes Szenario und seltene Fälle, von denen zusätzliche Beispiele erfasst werden sollen. Das Schreiben dauert eine Stunde und legt fest, wohin der Erfassungsaufwand fließt.

Lernergebnis

Erstelle eine Szenariotabelle mit Mengenangaben, die deine Variationsdimensionen und Sonderfälle abdeckt, und ermittle, wie weit ein gekennzeichneter Datensatz von den Mengenzielen für den Produktionseinsatz entfernt ist.

Schnellkurs
Wenn du dich bereits auskennst, findest du hier die Kurzfassung.
  1. Führe Szenarien als Zeilen auf: Kamera, Standort, Zeitpunkt und Bedingungen – jeweils mit einer Mengenangabe.

  2. Richte die Mengen an ≥1.500 Bildern und ≥10.000 gekennzeichneten Instanzen pro Klasse für den Produktionseinsatz aus.

  3. Gib jedem bekannten Sonderfall eine eigene Zeile und erfasse überproportional viele Beispiele dafür.

  4. Reserviere 0–10 % der Bilder als Hintergrundbilder ohne Objekte.

Praxisnah

Wo die Spezifikation einzuordnen ist#

Die Spezifikation bildet die Brücke zwischen dem Ziel und der Kamera. Sie steuert die Datenerfassung und ist die Seite, zu der du zurückkehrst, wenn das erste Modell sein Ziel verfehlt:

Der Prozess führt zurück zur Spezifikation, nicht zu den Trainingseinstellungen: Wird ein Ziel verfehlt, liegt das meist an einem Szenario, das die Spezifikation nicht abgedeckt hat. Der Leitfaden zu den Schritten eines Computer-Vision-Projekts beschreibt denselben Lebenszyklus.

Szenarien als Zeilen aufführen#

Ein Szenario ist eine Kombination von Aufnahmebedingungen, die das Modell bewältigen muss. Zeilen mit Mengenangaben machen Lücken sichtbar, bevor jemand eine Kamera in die Hand nimmt:

SzenarioKamerasStandorteTageszeitBedingungMengeHinweise
Andienungsbereich bei Tagcam-1 bis cam-4Bereiche A–C08:00–17:00beliebig1,200Stoßzeiten
Andienungsbereich bei Nachtcam-1 bis cam-4Bereiche A–C22:00–04:00beliebig400Natriumdampfbeleuchtung, weniger Menschen
Verladung bei Regencam-2, cam-3Bereich Bbeliebignur Regen200selten, aber kritisch
gestapeltbeliebigbeliebigbeliebigPaletten > 2 hoch150verdeckt dahinterstehende Personen
Hintergrundbeliebigbeliebigbeliebigleerer Andienungsbereich150keine Objekte, keine Kennzeichnungen

Ein Szenario, das du nicht aufschreiben kannst, sieht das Modell nicht im Training – und genau dieses Szenario wird im Produktionseinsatz zum Problem.

Den Umfang der Spezifikation an den Mengenzielen ausrichten#

Die Tipps von Ultralytics für optimale Trainingsergebnisse enthalten bewährte Richtwerte für den Produktionseinsatz:

ZielwertEmpfehlung
Bilder pro Klasse≥ 1,500
Gekennzeichnete Instanzen pro Klasse≥ 10,000
Hintergrundbilder (ohne Kennzeichnungen)0–10 % des Datensatzes; COCO enthält etwa 1 %
VielfaltUnterschiedliche Tageszeiten, Jahreszeiten, Wetterbedingungen, Lichtverhältnisse, Blickwinkel, Quellen und Kameras

Das sind die Richtwerte für ein Modell im Produktionseinsatz. Ein paar hundert gekennzeichnete Objekte pro Klasse reichen für erste Experimente; mit diesem ersten Modell findest du am schnellsten heraus, für welche Szenarien mehr Daten benötigt werden. Ermittle durch Zählen, wie weit ein Datensatz von den Richtwerten entfernt ist. Dieses Skript läuft mit COCO128, einem Ausschnitt aus COCO mit 128 Bildern, der automatisch heruntergeladen wird:

from collections import Counter
from pathlib import Path

from ultralytics.data.utils import IMG_FORMATS, check_det_dataset, img2label_paths

IMAGES_PER_CLASS, INSTANCES_PER_CLASS = 1500, 10_000  # Ultralytics production targets

data = check_det_dataset("coco128.yaml")  # downloads COCO128 (~7 MB) on first run; swap in your data YAML
images = [p for p in Path(data["train"]).rglob("*.*") if p.suffix[1:].lower() in IMG_FORMATS]
image_count, instance_count, background = Counter(), Counter(), 0
for label in map(Path, img2label_paths([str(p) for p in images])):
    classes = [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []
    instance_count.update(classes)
    image_count.update(set(classes))
    background += not classes

print(f"{len(images)} images, {background} background ({background / len(images):.0%}, target 0-10%)")
print(f"{'class':>12} {'images':>7} {'instances':>10} {'of target':>10}")
ranked = instance_count.most_common()
for cls, n in ranked[:3] + ranked[-3:]:  # best and worst covered classes
    coverage = min(image_count[cls] / IMAGES_PER_CLASS, n / INSTANCES_PER_CLASS)
    print(f"{data['names'][cls]:>12} {image_count[cls]:>7} {n:>10} {coverage:>10.1%}")

never_labeled = [name for i, name in data["names"].items() if i not in instance_count]
print(f"{len(never_labeled)} classes in names with zero labels: {never_labeled[:4]} ...")
128 images, 2 background (2%, target 0-10%)
       class  images  instances  of target
      person      61        254       2.5%
         car      12         46       0.5%
         cup      10         36       0.4%
        bear       1          1       0.0%
      banana       1          1       0.0%
        skis       1          1       0.0%
9 classes in names with zero labels: ['fire hydrant', 'parking meter', 'sheep', 'cow'] ...

So liest du die Ergebnisse:

  • Abdeckung ist der kleinere Wert aus dem Bildanteil und dem Instanzanteil, denn eine Klasse benötigt beides. Selbst person, die am besten abgedeckte Klasse, erreicht nur 2,5 % des Richtwerts für den Produktionseinsatz.
  • Klassen mit nur einer Instanz (bear, banana, skis) lassen sich weder lernen noch messen. Erfasse sie in deinem Datensatz oder entferne sie aus Version 1.
  • Klassen ohne Kennzeichnungen sind in der YAML-Datei aufgeführt, aber nie eingezeichnet. Das Modell verwendet trotzdem Kapazität darauf, sie vorherzusagen. Entferne sie aus names oder erfasse sie vor dem Training.

Variationsdimensionen abdecken#

Ultralytics YOLO-Objekterkennung auf einer Uferpromenade: Menschen und Radfahrende in Kameranähe, ein Hund und Autos in unterschiedlicher Entfernung, jeweils mit gekennzeichnetem Begrenzungsrahmen und Konfidenzwert

Schon ein einzelnes Bild zeigt Menschen in naher und ferner Entfernung, Fahrräder, einen Hund und Autos. Eine gute Spezifikation muss diese Bandbreite bewusst einplanen. Halte für jede Dimension fest, ob die Spezifikation sie abdeckt oder warum sie nicht zutrifft. Leere Zeilen stehen für Szenarien, die du erst im Produktionseinsatz entdecken wirst:

DimensionBeispiele
ZeitTag, Nacht, Morgendämmerung, Abenddämmerung
WetterSonne, bedeckt, Regen, Nebel, Schnee
BeleuchtungHell, schwach beleuchtet, Blendung, harte Schatten, gemischte Lichtquellen
KameraModell, Objektiv, Montagehöhe, Sichtfeld
GeografieStandorte, Städte, Länder
Personen und BedienpersonalSchichten, Teams, Uniformen, Schutzausrüstung
ProduktvariantenArtikelnummern, Verpackungsrevisionen, Farben
ObjektgrößeNah und groß, mittlere Entfernung, fern und klein
VerdeckungUnverdeckt, teilweise verdeckt, stark verdeckt, hinter Glas
Zustand der AusrüstungVerschmutzte oder beschlagene Objektive, beschädigte Paletten, abgenutzte Bodenmarkierungen

Variabilität ist wichtiger als Umfang: 1.500 Bilder, die sich auf diese Zeilen verteilen, sind wertvoller als 5.000 Bilder von einer Kamera zur Mittagszeit.

Hintergrundbilder und Sonderfälle einplanen#

Hintergrundbilder sind Einzelbilder ohne gekennzeichnete Objekte, zum Beispiel ein leerer Ladebereich. Sie bringen dem Modell bei, dass dort nichts ist, und verringern Fehlalarme.

Wie ein Hintergrundbild gespeichert wird

Im Ultralytics-YOLO-Format ist ein Hintergrundbild einfach ein Bild mit einer leeren oder ganz fehlenden Kennzeichnungsdatei. Das Training zählt beide Fälle in seiner Statuszeile beim Einlesen (… 1200 images, 90 backgrounds, 0 corrupt). Vergleiche diesen Wert vor der ersten Epoche mit deinem Zielwert von 0–10 %.

Sonderfälle sind starke Verdeckungen, am Bildrand abgeschnittene Objekte, ungewöhnliche Ausrichtungen, gestapelte Objekte und leicht verwechselbare Dinge wie ein Gabelstaplermast neben einer Stahlsäule. Weise jedem Sonderfall eine eigene Kontingentzeile zu.

Die natürliche Häufigkeit lässt Sonderfälle zu kurz kommen

Wenn eine von 200 Aufnahmen eine Person hinter gestapelten Paletten zeigt, enthält ein mit natürlicher Häufigkeit erhobener Datensatz bei 1.500 Bildern etwa sieben solcher Aufnahmen – viel zu wenige, um daraus zu lernen. Ziehe Sonderfälle gezielt überproportional oft heran: Ihr Anteil in der Stichprobe sollte viel größer sein als ihr Anteil an den echten Aufnahmen.

Die Spezifikation muss nicht vollständig sein

Du wirst nicht jedes Szenario auf dem Papier bedenken. Bringe die Spezifikation weitgehend in Ordnung, trainiere zügig ein erstes Modell und nutze seine Fehler, um die übersehenen Szenarien aufzudecken.

Ausprobieren

Erstelle für dein Projekt eine Szenariotabelle mit 5–10 Zeilen, jeweils mit einem numerischen Kontingent, sowie einer Hintergrundzeile und einer Zeile für jeden bekannten Sonderfall. Gehe sie mit jemandem durch, der am Einsatzort arbeitet, und ergänze alle Szenarien, die diese Person nennt. Führe dann volume_gap.py auf bereits gekennzeichneten Daten (oder COCO128) aus und notiere, welche Klassen am besten und am schlechtesten abgedeckt sind. Ergebnis: spec.md mit der Tabelle und den Abdeckungszahlen.

Abgeschlossen, wenn
Du hast die Lektion abgeschlossen, wenn alle folgenden Punkte zutreffen.
  • Die Szenariotabelle enthält mindestens 5 Zeilen mit jeweils einem numerischen Kontingent sowie Zeilen für Hintergrundbilder und Sonderfälle.

  • Mindestens 5 der 10 Variabilitätsdimensionen sind abgedeckt oder ausdrücklich ausgeschlossen.

  • Die Kontingente erreichen mindestens die Bild- und Instanzziele pro Klasse, oder die Lücke ist als Ausnahme für Version 1 dokumentiert.

Lösung anzeigen

Die Kontingente richten sich nach dem Instanzziel, nicht nur nach dem Bildziel. Angenommen, eine Fahrzeugzählung auf einem Parkplatz umfasst zwei Klassen, und im Pilotmaterial sind durchschnittlich 3 Autos und 0,5 Lastwagen pro Bild zu sehen:

KlasseInstanzen pro BildBenötigte Bilder für 10.000 InstanzenBenötigte Bilder für die Mindestmenge von 1.500 BildernPlan
car3.0≈ 3,3001,5003.300 Bilder
truck0.5≈ 20,0001,500Gezielte Aufnahme am Ladeeingang, wo Lastwagen zehnmal häufiger vorkommen

Autos werden durch gewöhnliches Filmmaterial abgedeckt. Für Lastwagen wären 20.000 zufällig aufgenommene Bilder nötig; daher ergänzt die Spezifikation eine eigene Szenariozeile (Ladeeingang, werktags 06:00–10:00), statt sechsmal mehr von allem zu sammeln. Ergänze eine Hintergrundzeile mit etwa 5 % (leerer Parkplatz bei Nacht) und Sonderfallzeilen für Schneebedeckung und teilweise außerhalb des Bildes befindliche Lastwagen.

Wie es weitergeht

Sobald die Spezifikation steht, lernst du in der nächsten Lektion, Bilder zu sammeln, die sie tatsächlich erfüllen.