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.
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:
| Szenario | Kameras | Standorte | Tageszeit | Bedingung | Menge | Hinweise |
|---|---|---|---|---|---|---|
| Andienungsbereich bei Tag | cam-1 bis cam-4 | Bereiche A–C | 08:00–17:00 | beliebig | 1,200 | Stoßzeiten |
| Andienungsbereich bei Nacht | cam-1 bis cam-4 | Bereiche A–C | 22:00–04:00 | beliebig | 400 | Natriumdampfbeleuchtung, weniger Menschen |
| Verladung bei Regen | cam-2, cam-3 | Bereich B | beliebig | nur Regen | 200 | selten, aber kritisch |
| gestapelt | beliebig | beliebig | beliebig | Paletten > 2 hoch | 150 | verdeckt dahinterstehende Personen |
| Hintergrund | beliebig | beliebig | beliebig | leerer Andienungsbereich | 150 | keine 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:
| Zielwert | Empfehlung |
|---|---|
| Bilder pro Klasse | ≥ 1,500 |
| Gekennzeichnete Instanzen pro Klasse | ≥ 10,000 |
| Hintergrundbilder (ohne Kennzeichnungen) | 0–10 % des Datensatzes; COCO enthält etwa 1 % |
| Vielfalt | Unterschiedliche 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
namesoder erfasse sie vor dem Training.
Variationsdimensionen abdecken#

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:
| Dimension | Beispiele |
|---|---|
| Zeit | Tag, Nacht, Morgendämmerung, Abenddämmerung |
| Wetter | Sonne, bedeckt, Regen, Nebel, Schnee |
| Beleuchtung | Hell, schwach beleuchtet, Blendung, harte Schatten, gemischte Lichtquellen |
| Kamera | Modell, Objektiv, Montagehöhe, Sichtfeld |
| Geografie | Standorte, Städte, Länder |
| Personen und Bedienpersonal | Schichten, Teams, Uniformen, Schutzausrüstung |
| Produktvarianten | Artikelnummern, Verpackungsrevisionen, Farben |
| Objektgröße | Nah und groß, mittlere Entfernung, fern und klein |
| Verdeckung | Unverdeckt, teilweise verdeckt, stark verdeckt, hinter Glas |
| Zustand der Ausrüstung | Verschmutzte 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.
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.
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.
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.
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:
| Klasse | Instanzen pro Bild | Benötigte Bilder für 10.000 Instanzen | Benötigte Bilder für die Mindestmenge von 1.500 Bildern | Plan |
|---|---|---|---|---|
car | 3.0 | ≈ 3,300 | 1,500 | 3.300 Bilder |
truck | 0.5 | ≈ 20,000 | 1,500 | Gezielte 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.