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.
Praxisnah
Dataset erstellen#

Ö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:

| Quelle | Wann du diese Option verwendest | Plan |
|---|---|---|
| Upload | Dateien befinden sich auf deinem Rechner: Bilder, Videos, Archive oder NDJSON-Exporte | Alle |
| URL | Ein öffentlicher Link zu .zip, .tar, .tar.gz, .tgz oder .ndjson ist verfügbar; die Plattform lädt die Dateien serverseitig herunter | Alle |
| Cloud | Die Daten befinden sich bereits in Google Cloud Storage, Amazon S3 oder Azure Blob Storage und sollen dort bleiben | Pro, Enterprise |
| Vor-Ort-Betrieb | Die Bilddaten dürfen deine Rechner niemals verlassen | Enterprise |
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:
| Aufgabe | So kennzeichnest du es |
|---|---|
| Erkennen | Rechteck oder intelligente Annotation mit SAM und YOLO |
| Segmentieren | Polygon oder intelligente Annotation mit SAM und YOLO |
| Semantisch segmentieren | Polygon oder intelligente Annotation mit SAM und YOLO; PNG-Masken lassen sich direkt importieren |
| Pose | Keypoints auf integrierten oder benutzerdefinierten Skeletten; YOLO-Pose-Modelle für intelligente Annotation |
| OBB | Orientierte Box oder intelligente Annotation mit SAM und YOLO |
| Klassifizieren | Klassenauswahl in der Seitenleiste |
| Tiefenschätzung | Keine 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: noneWas die Ausgabe aussagt:
- Anzahlen pro Split. Bilder in den Ordnern
train/,val/undtest/behalten beim Upload ihren Split. Diese Zahlen werden also auf der Plattform angezeigt. Fehlt die Zeileval, 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: nonebedeutet, dass jedes Bild verarbeitet wird. Jeder hier angezeigte Eintrag ist eine Datei, die im TabErrorslandet 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änge | Beibehaltene Bilder | Abstand |
|---|---|---|
| 60 Sekunden | 60 | 1 Sekunde |
| 100 Sekunden | 100 | 1 Sekunde |
| 30 Minuten (54.000 Bilder bei 30 fps) | 100 | 18 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.jpgFü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 framesvid_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:

- Der Tab
Errorswird 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
Chartszeigt 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
Readyan, sobald die Verarbeitung abgeschlossen ist und der Datensatz mindestens ein Bild austrain, ein Bild ausvalodertestsowie ein gelabeltes Bild enthält. Klicke aufNot Ready, um zu sehen, welche Bedingung nicht erfüllt ist.

Beginne mit einem öffentlichen Datensatz#

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#
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.
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).
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.
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.