Ultralytics YOLO27: Trag dich in die Warteliste ein.
Get Started
Mit der Ultralytics Platform entwickeln·Dataset erstellen·Lektion 2/10
LektionFortgeschrittene

Daten hinzufügen und vorbereiten

Prüfe ein Dataset lokal vor dem Upload, wähle Videoframes gezielt aus und bringe ein Plattform-Dataset gleich beim ersten Versuch auf „Ready“.

Der günstigste Fehler in einem Dataset ist der, den du vor dem Hochladen entdeckst. Pascal-VOC-Labels werden unbemerkt übersprungen, Bilder mit weniger als 28 Pixeln werden abgelehnt und aus einem 30-minütigen Video werden nur 100 Frames übernommen, von denen die meisten eine leere Szene zeigen. In dieser Lektion führst du eine zweiminütige Prüfung vor dem Upload durch, wählst Videoframes gezielt aus und wertest die Verarbeitungssignale der Plattform aus, damit deine Trainingsdaten vollständig ankommen.

Lernergebnis

Du kannst ein lokales Dataset vor dem Upload prüfen, ein langes Video auf die Frames reduzieren, die sich zu kennzeichnen lohnen, und ein Plattform-Dataset erstellen, das mit einem Ready-Abzeichen versehen ist.

Schnellkurs
Wenn du dich bereits auskennst, findest du hier die Kurzfassung.
  1. Führe die Prüfung vor dem Upload durch: Bild- und Labelanzahl pro Aufteilung, zu kleine oder zu große Bilder, nicht unterstützte Dateien und VOC-Labels.

  2. Klicke in Annotate auf New Dataset; wähle Quelle, Aufgabentyp und die Sichtbarkeit „Private“ aus.

  3. Wähle bei langen Videos vor dem Upload selbst die Frames aus: Die Plattform übernimmt höchstens 100 Frames pro Video.

  4. Lies die Registerkarten Errors und Charts und klicke dann auf das Abzeichen, bis dort Ready steht.

Praxisnah

Dataset erstellen#

Profilseite der Ultralytics Platform mit der Registerkarte „Datasets“, Dataset-Karten und einer Schaltfläche „New Dataset“

Öffne Annotate in der Seitenleiste und klicke auf New Dataset. Im Dialog wirst du nach einer Quelle, einem Namen, dem Aufgabentyp, einer optionalen Lizenz, dem Verwischen von Gesichtern und der Sichtbarkeit gefragt:

Dialog „New Dataset“ in der Ultralytics Platform mit den Quellregisterkarten „Upload“, „URL“, „Cloud“ und „On Premise“, einem Upload-Bereich mit Angaben zu akzeptierten Formaten und Größenbeschränkungen sowie den Einstellungen „Task Type“, „License“, „Blur faces“ und „Visibility“

QuelleWann du diese Option verwendestPlan
UploadDateien befinden sich auf deinem Rechner: Bilder, Videos, Archive oder NDJSON-ExporteAlle
URLEin öffentlicher Link zu .zip, .tar, .tar.gz, .tgz oder .ndjson ist verfügbar; die Plattform lädt die Dateien serverseitig herunterAlle
CloudDie Daten befinden sich bereits in Google Cloud Storage, Amazon S3 oder Azure Blob Storage und sollen dort bleibenPro, Enterprise
Vor-Ort-BetriebDie Bilddaten dürfen deine Rechner niemals verlassenEnterprise

Entscheidungsregel: Lade für diesen Kurs eine Kopie hoch. Bei Cloud- und Vor-Ort-Datasets bleiben die Bilddaten außerhalb der Plattform; daher sind intelligente Annotation, Clustering, Klonen und Versions-Schnappschüsse nicht verfügbar.

Der Aufgabentyp bestimmt, welche Werkzeuge und Modelle angezeigt werden. Die Plattform unterstützt alle sieben Ultralytics-YOLO-Aufgaben:

AufgabeSo kennzeichnest du es
ErkennenRechteck oder intelligente Annotation mit SAM und YOLO
SegmentierenPolygon oder intelligente Annotation mit SAM und YOLO
Semantisch segmentierenPolygon oder intelligente Annotation mit SAM und YOLO; PNG-Masken lassen sich direkt importieren
PoseKeypoints auf integrierten oder benutzerdefinierten Skeletten; YOLO-Pose-Modelle für intelligente Annotation
OBBOrientierte Box oder intelligente Annotation mit SAM und YOLO
KlassifizierenKlassenauswahl in der Seitenleiste
TiefenschätzungKeine Zeichnungen: Lade Bilder mit zugehörigen Tiefenkarten hoch (nur Upload oder URL)

Praxisbeispiel: Prüfe den Datensatz vor dem Upload#

Die Plattform akzeptiert JPEG-, PNG-, WebP-, BMP-, TIFF-, HEIC-, AVIF-, JP2-, DNG- und MPO-Bilder mit einer Größe von bis zu 50 MB und mindestens 28 px an der kürzeren Seite. Außerdem liest sie Labels im Format YOLO, COCO, LabelMe, Ultralytics oder Labelbox NDJSON sowie semantische PNG-Masken. Pascal-VOC-XML wird erkannt, aber nicht importiert. Dieses Skript prüft einen lokalen YOLO-Datensatz anhand dieser Regeln, hier den öffentlichen Datensatz medical pills:

from collections import Counter
from pathlib import Path

from PIL import Image

from ultralytics.data.utils import check_det_dataset

ACCEPTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".heic", ".avif", ".jp2", ".dng", ".mpo"}
data = check_det_dataset("medical-pills.yaml")  # your local dataset YAML
root = Path(data["path"])

problems = Counter()
for split in ("train", "val", "test"):
    if not data.get(split):
        continue
    files = [p for p in Path(data[split]).rglob("*") if p.is_file()]
    images = [p for p in files if p.suffix.lower() in ACCEPTED]
    labeled = 0
    for img in images:
        label = Path(str(img).replace("images", "labels")).with_suffix(".txt")
        labeled += label.exists() and label.stat().st_size > 0
        if min(Image.open(img).size) < 28:
            problems["under 28 px (rejected)"] += 1
        if img.stat().st_size > 50 * 1024**2:
            problems["over 50 MB (rejected)"] += 1
    problems["unsupported files (skipped)"] += len(files) - len(images)
    print(f"{split:<5} {len(images):>4} images, {labeled:>4} labeled, {len(images) - labeled:>3} background")
problems["Pascal VOC .xml labels (not imported)"] += len(list(root.rglob("*.xml")))
print("classes:", data["names"])
print("problems:", {k: v for k, v in problems.items() if v} or "none")
train   92 images,   92 labeled,   0 background
val     23 images,   23 labeled,   0 background
classes: {0: 'pill'}
problems: none

Was die Ausgabe aussagt:

  • Anzahlen pro Split. Bilder in den Ordnern train/, val/ und test/ behalten beim Upload ihren Split. Diese Zahlen werden also auf der Plattform angezeigt. Fehlt die Zeile val, erstellt die Plattform automatisch einen zufälligen Validierungssplit für dich (siehe die folgende Fehlerquelle).
  • Hintergrundbilder (ohne Labeldatei) sind in Maßen in Ordnung; sie bringen dem Modell bei, wie „hier ist nichts“ aussieht. Hunderte davon bedeuten meist, dass die Labels nicht exportiert wurden.
  • problems: none bedeutet, dass jedes Bild verarbeitet wird. Jeder hier angezeigte Eintrag ist eine Datei, die im Tab Errors landet oder gar nicht erst ankommt.

Zippe den Datensatzordner samt data.yaml und ziehe das Archiv auf die Galerie. Die Plattform erkennt das Format automatisch, speichert identische Bilder nur einmal und fragt bei einem Konflikt mit bereits im Datensatz vorhandenen Bildern, ob du sie Überspringen, Beide behalten oder Ersetzen möchtest.

Praxisbeispiel: Prüfe Videos, bevor die Plattform sie verarbeitet#

Die Plattform entnimmt jedem Video ein Bild pro Sekunde und behält höchstens 100 Bilder. Bei Clips mit einer Länge von mehr als 100 Sekunden vergrößert sie den Abstand:

CliplängeBeibehaltene BilderAbstand
60 Sekunden601 Sekunde
100 Sekunden1001 Sekunde
30 Minuten (54.000 Bilder bei 30 fps)10018 Sekunden

Das eignet sich für einen schnellen Blick, scheitert aber bei den meisten realen Projekten: Aus einer 30-minütigen Schichtaufzeichnung werden 100 Bilder, überwiegend von einem leeren Gang. Ziehe aus langen Aufnahmen selbst Bilder und lade sie hoch:

Für eine gleichmäßige Auswahl reicht FFmpeg:

mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpg

Für eine ereignisbasierte Auswahl kannst du ein vortrainiertes Ultralytics YOLO-Modell nur Bilder mit deinem Objekt behalten lassen:

from pathlib import Path

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # or your latest fine-tune
out = Path("frames")
out.mkdir(exist_ok=True)

source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
seen = kept = 0
for i, result in enumerate(model.predict(source, stream=True, vid_stride=5, classes=[0], conf=0.5, verbose=False)):
    seen += 1
    if len(result.boxes):  # keep only frames where a person was detected
        cv2.imwrite(str(out / f"frame_{i:05d}.jpg"), result.orig_img)
        kept += 1
print(f"Kept {kept} of {seen} sampled frames")
Kept 12 of 12 sampled frames

vid_stride=5 prüft jedes fünfte Bild, classes=[0] beschränkt die Erkennung auf Personen und conf=0.5 ignoriert unsichere Vorhersagen. In diesem belebten Demo-Clip sind in jedem ausgewählten Bild Personen zu sehen. Bei einer Aufnahme einer größtenteils leeren Szene sinkt der Anteil der beibehaltenen Bilder stark – und damit auch deine Kosten fürs Labeln. Erhöhe vid_stride, bis benachbarte beibehaltene Bilder nicht mehr identisch aussehen.

Verstehe die Verarbeitungsanzeigen der Plattform#

Nach dem Upload prüft und normalisiert die Plattform die Dateien (Bilder mit mehr als 4.096 px werden skaliert), erstellt Vorschaubilder, verarbeitet Labels und berechnet Statistiken. Prüfe drei Stellen:

Datensatzseite der Ultralytics Platform mit geöffnetem Tab „Errors“: Ein Banner zeigt, dass 1 Bild nicht verarbeitet werden konnte, und eine Tabellenzeile lautet „Unable to read image file“ mit einem Hinweis zur Behebung

  • Der Tab Errors wird nur angezeigt, wenn Dateien fehlschlagen: beschädigte Dateien, nicht unterstützte Formate, Bilder unter 28 px oder CMYK- und indizierte Farbmodi. Zu jedem Problem gibt es einen Hinweis zur Behebung. Exportiere die Dateien erneut oder lade sie noch einmal hoch.
  • Der Tab Charts zeigt die Split-Verteilung, die häufigsten Klassen, Bildabmessungen, Dateigrößen, Positionen der Annotationen, Boxgrößen und Objekte pro Bild. Achte auf Klassen, die nur selten vorkommen, sehr kleine Bilder oder Boxen, die sich in einer Ecke häufen.
  • Das Symbol in der Kopfzeile des Datensatzes zeigt Ready an, sobald die Verarbeitung abgeschlossen ist und der Datensatz mindestens ein Bild aus train, ein Bild aus val oder test sowie ein gelabeltes Bild enthält. Klicke auf Not Ready, um zu sehen, welche Bedingung nicht erfüllt ist.

Tab „Charts“ der Ultralytics Platform im Datensatz medical-pills mit Ringdiagrammen für Split-Verteilung und häufigste Klassen sowie Histogrammen für Bildabmessungen und Bilddateigröße

Beginne mit einem öffentlichen Datensatz#

Dialog „Clone Dataset“ der Ultralytics Platform für einen öffentlichen Datensatz zu persönlicher Schutzausrüstung auf Baustellen mit Feldern für den neuen Namen, URL-Slug, die Beschreibung, den Aufgabentyp, die Lizenz und einem Sichtbarkeitsschalter

Noch keine Daten? Auf der Explore-Seite findest du offizielle und von der Community erstellte Datensätze. Clone Dataset kopiert Bilder, Annotationen und Klassen in deinen Arbeitsbereich, zählt zu deinem Speicherplatz und übernimmt standardmäßig die öffentliche Sichtbarkeit der Quelle. Wenn du also sensible Daten hinzufügst, ändere den Schalter im Dialog.

Stolperfallen#

Pascal-VOC-Bezeichnungen verschwinden unbemerkt

Symptom: Der Upload ist erfolgreich, aber alle Bilder kommen ohne Bezeichnungen an. Lösung: Platform erkennt Pascal-VOC-XML-Dateien, importiert sie aber nicht. Wandle sie zuerst in YOLO-.txt-Bezeichnungen oder COCO-JSON um; die Prüfung vor dem Upload zählt .xml-Dateien, damit du das Problem vor dem Hochladen bemerkst.

Die automatische Aufteilung zur Validierung verteilt Video-Frames auf beide Datensätze

Symptom: Die Validierungs-mAP ist hervorragend, aber das bereitgestellte Modell nicht. Lösung: Wenn bei einem Upload keine Aufteilung ausgewählt ist und val leer bleibt, verschiebt Platform nach dem Zufallsprinzip etwa 20 % der Trainingsbilder nach val. Bei Video-Frames landen dadurch nahezu identische benachbarte Frames in beiden Aufteilungen. Lade stattdessen Ordner train/ und val/ hoch, die nach Video oder Kamera aufgeteilt sind (Lektion 4).

Anmerkungswerkzeuge fehlen

Symptom: Du findest das Polygonwerkzeug oder die Keypoints nicht. Lösung: Der Aufgabentyp bestimmt die Werkzeuge. Ändere ihn in der Kopfzeile des Datensatzes; für jedes Bild werden Bezeichnungen für alle Aufgaben gespeichert, sodass beim Wechsel die Bezeichnungen der anderen Aufgaben ausgeblendet und nicht gelöscht werden.

Ausprobieren

Führe preflight.py auf deinem eigenen Datensatz (oder auf medical pills) aus und behebe alle gemeldeten Probleme. Erstelle dann einen privaten Plattform-Datensatz, lade den Datensatz und ein Video hoch und schätze anhand der Tabelle, wie viele Bilder das Video erzeugt, bevor du die Galerie prüfst.

Abgeschlossen, wenn
Du hast die Lektion abgeschlossen, wenn alle folgenden Punkte zutreffen.
  • preflight.py meldet problems: none für den hochgeladenen Datensatz.

  • Die Anzahl der Bilder in der Galerie entspricht der Anzahl deiner Bilder plus der vorhergesagten Videobilder.

  • In der Kopfzeile des Datensatzes wird Ready angezeigt, oder du hast genau notiert, welche Bedingung nicht erfüllt ist.

Lösung anzeigen

Musterlösung für medical pills und ein vierminütiges Video einer Linienkamera. Prüfung vor dem Upload: 92 Trainings- und 23 Validierungsbilder, alle gelabelt und ohne Probleme. Videodauer: 240 Sekunden, also länger als 100 Sekunden. Daher erhöht sich der Abstand auf ceil(240 / 100) = 3 Sekunden, und die Plattform behält 80 Bilder bei (eines bei 0 s, 3 s, …, 237 s). Erwartete Anzahl in der Galerie: 92 + 23 + 80 = 195 Bilder. Die Videobilder kommen ungelabelt im Split an, der im Galeriefilter ausgewählt ist. Wähle Train aus, bevor du das Video hinzufügst, damit die Bilder nicht im Validierungssplit landen. Das Symbol zeigt Ready an, da Trainings-, Validierungs- und gelabelte Bilder vorhanden sind. Hättest du nur das Video hochgeladen, würde das Symbol Not Ready anzeigen: Es gibt noch kein gelabeltes Bild.

Wie es weitergeht

Als Nächstes versiehst du Bilder mithilfe eines Modells vorab mit Labels und misst, wie viel Prüfaufwand bei den einzelnen Konfidenzschwellen entsteht.