Überblick über Datensätze für semantische Segmentierung

Semantische Segmentierung weist jedem Pixel in einem Bild ein Klassen-Label zu. Im Gegensatz zur Instanz-Segmentierung unterscheidet die semantische Segmentierung nicht zwischen einzelnen Objekten derselben Klasse. Das Trainingsziel ist eine dichte Klassenkarte, bei der jedes Pixel eine Klassen-ID speichert.

Dieser Leitfaden erklärt das Datensatzformat, das von Ultralytics YOLO Modellen für semantische Segmentierung verwendet wird, und listet die integrierten Datensatzkonfigurationen auf, die für Training und Validierung verfügbar sind.

Unterstützte Datensatzformate

Zwei Label-Formate werden unterstützt. Der Datensatz-Loader wählt den Pfad basierend darauf aus, ob das Datensatz-YAML einen masks_dir Schlüssel definiert.

PNG-Maskenformat

Datensätze für semantische Segmentierung verwenden eine Bilddatei und eine Maskendatei pro Stichprobe. Die Maske ist ein einkanaliges Bild, normalerweise im PNG-Format, bei dem jeder Pixelwert der Klassen-Index für das entsprechende Bildpixel ist.

  • Pixelwerte 0, 1, 2, ... repräsentieren Klassen-IDs aus der names-Zuordnung des Datensatzes.
  • Der Pixelwert 255 wird als Ignore-Label behandelt und bei der Berechnung von Verlusten und Metriken ausgeschlossen.
  • Maskendateien sollten denselben Dateinamenstamm wie die zugehörige Bilddatei verwenden, zum Beispiel frankfurt_000000_000294.png.
  • Unterstützte Maskenerweiterungen sind .png, .PNG, .bmp und .tif.

Das Standard-Layout bewahrt Bilder und Masken in parallelen Ordnern. Der masks_dir Wert aus dem Datensatz-YAML ersetzt den images Pfad-Bestandteil, um Masken zu finden.

dataset/
├── images/
│   ├── train/
│   └── val/
└── masks/
    ├── train/
    └── val/

Zum Beispiel wird ein Bild unter images/train/aachen_000000_000019.png mit einer Maske unter masks/train/aachen_000000_000019.png gepaart, wenn masks_dir: masks gesetzt ist.

YOLO Polygon-Label-Format

Wenn dein Datensatz bereits über Ultralytics YOLO Polygon-Labels verfügt (eine .txt Datei pro Bild mit Zeilen im Format <class-index> <x1> <y1> <x2> <y2> ...), kannst du die semantische Segmentierung direkt damit trainieren – eine Konvertierung in PNG-Masken ist nicht erforderlich. Sieh dir das Datensatzformat für Instanz-Segmentierung für das zeilenbasierte Layout an.

Dieser Pfad wird automatisch ausgewählt, wenn das Datensatz-YAML masks_dir auslässt. Verhalten:

  • Polygone werden beim Laden in eine semantische Maske pro Bild konvertiert, sortiert nach Fläche, sodass kleinere Objekte in Überlappungsbereichen größere überschreiben.
  • Mehrklassen (N > 1 in names): Eine zusätzliche background-Klasse wird nach deinen deklarierten Klassen für Pixel angehängt, die von keinem Polygon abgedeckt werden. Das Modell wird mit N + 1 Ausgabekanälen erstellt und der letzte Kanal ist der Hintergrund.
  • Einzelklasse (N == 1 in names): Wird weiterhin als 1 Klasse trainiert. Die Maske ist binär, wobei deine deklarierte Klasse als 1 angezeigt wird und Pixel, die nicht von einem Polygon abgedeckt sind, als 0. Es wird keine zusätzliche Hintergrundklasse zu names hinzugefügt.
  • Pixel, die durch Augmentierungs-Padding (z. B. zufälliger Ausschnitt) hinzugefügt wurden, verwenden weiterhin 255 als Ignore-Label.

Verwende diesen Pfad, wenn deine Daten bereits als Instanz-Polygone beschriftet sind und du ein semantisches Segmentierungsmodell aus denselben Dateien erstellen möchtest.

Datensatz-YAML-Format

Datensätze für semantische Segmentierung werden mit YAML-Dateien konfiguriert. Die wichtigsten Felder sind:

SchlüsselBeschreibung
pathStammverzeichnis des Datensatzes.
trainPfad zu Trainingsbildern relativ zu path oder ein absoluter Pfad.
valPfad zu Validierungsbildern relativ zu path oder ein absoluter Pfad.
testOptionaler Pfad zu Testbildern.
masks_dirVerzeichnisname für semantische Masken. Lasse diesen Schlüssel weg, um zum YOLO Polygon-Label-Format zu wechseln.
namesZuordnung von Klassen-ID zu Klassennamen.
label_mappingOptionale Zuordnung von Quell-Datensatz-IDs zu Trainings-IDs oder ignore_label.
ultralytics/cfg/datasets/cityscapes8.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Cityscapes semantic segmentation dataset (19 classes)
# Documentation: https://docs.ultralytics.com/datasets/semantic/cityscapes8/
# Example usage: yolo semantic train data=cityscapes8.yaml model=yolo26n-sem.pt
# parent
# ├── ultralytics
# └── datasets
#     └── cityscapes8 ← downloads here (small subset)
#         └── images
#         └── masks

# Dataset root directory
path: cityscapes8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images

masks_dir: masks # semantic mask directory

# Cityscapes 19-class labels
names:
  0: road
  1: sidewalk
  2: building
  3: wall
  4: fence
  5: pole
  6: traffic light
  7: traffic sign
  8: vegetation
  9: terrain
  10: sky
  11: person
  12: rider
  13: car
  14: truck
  15: bus
  16: train
  17: motorcycle
  18: bicycle

# Map source label IDs to train IDs; ignore_label is converted to 255.
label_mapping:
  -1: ignore_label
  0: ignore_label
  1: ignore_label
  2: ignore_label
  3: ignore_label
  4: ignore_label
  5: ignore_label
  6: ignore_label
  7: 0
  8: 1
  9: ignore_label
  10: ignore_label
  11: 2
  12: 3
  13: 4
  14: ignore_label
  15: ignore_label
  16: ignore_label
  17: 5
  18: ignore_label
  19: 6
  20: 7
  21: 8
  22: 9
  23: 10
  24: 11
  25: 12
  26: 13
  27: 14
  28: 15
  29: ignore_label
  30: ignore_label
  31: 16
  32: 17
  33: 18

# Download URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/cityscapes8.zip

Verwende label_mapping, wenn die Quell-Masken-IDs nicht bereits mit den zusammenhängenden Trainings-Klassen-IDs übereinstimmen. Cityscapes und ADE20K enthalten Zuordnungen, die ursprüngliche Label-IDs in YOLO semantische Segmentierungs-Trainings-IDs umwandeln und ungenutzte Labels ignorieren.

Verwendung

Trainiere ein YOLO26 Modell für semantische Segmentierung mit Python oder CLI:

Beispiel
from ultralytics import YOLO

# Load a pretrained semantic segmentation model
model = YOLO("yolo26n-sem.pt")

# Train on the Cityscapes8 semantic segmentation dataset
results = model.train(data="cityscapes8.yaml", epochs=100, imgsz=1024)

Unterstützte Datensätze

Ultralytics stellt YAML-Dateien für semantische Segmentierungs-Datensätze für diese Datensätze bereit:

  • Cityscapes: Datensatz für semantische Segmentierung städtischer Straßenszenen mit 19 Trainingsklassen.
  • Cityscapes8: Ein 8-Bilder-Subset von Cityscapes für schnelle Tests und CI-Prüfungen.
  • ADE20K: Datensatz zur Szenenanalyse mit 150 semantischen Klassen.

Eigenen Datensatz hinzufügen

Option A – PNG-Masken

  1. Speichere deine Bilder in geteilten Ordnern wie images/train und images/val.
  2. Speichere eine einkanalige Maske pro Bild in den gespiegelten Maskenordnern, wie masks/train und masks/val.
  3. Stelle sicher, dass Maskenpixelwerte Klassen-IDs sind. Verwende 255 für Pixel, die ignoriert werden sollen.
  4. Erstelle ein Datensatz-YAML mit path, train, val, masks_dir und names.
  5. Füge label_mapping nur hinzu, wenn deine Masken-IDs in zusammenhängende Trainings-IDs konvertiert werden müssen.
path: path/to/my-semantic-dataset
train: images/train
val: images/val
masks_dir: masks

names:
    0: background
    1: road
    2: building

Option B – Polygon-Labels

  1. Lege Bilder und .txt Polygon-Dateien genau wie für Instanz-Segmentierung an.
  2. Erstelle ein Datensatz-YAML mit path, train, val und nameslasse masks_dir weg.
  3. Füge names keinen "background"-Eintrag hinzu. Bei Mehrklassen-Datensätzen fügt der Loader automatisch einen hinzu; bei Einzelklassen-Datensätzen bleibt das Training bei 1 Klasse – deine deklarierte Klasse wird zu 1 in der Maske und unbedeckte Pixel werden zu 0.
path: path/to/my-polygon-dataset
train: images/train
val: images/val

names:
    0: person
    1: car

FAQ

Was ist der Unterschied zwischen Masken für semantische Segmentierung und Labels für Instanz-Segmentierung?

Masken für semantische Segmentierung sind dichte Pixelkarten. Jedes Pixel speichert eine Klassen-ID, und es gibt ein Maskenbild pro Trainingsbild. Instanz-Segmentierungs-Labels in Ultralytics YOLO verwenden Textdateien mit Polygon-Koordinaten, eine Zeile pro Objektinstanz.

Welcher Pixelwert wird während des Trainings ignoriert?

Der Pixelwert 255 wird als Ignore-Label verwendet. Diese Pixel werden bei der Berechnung von Verlusten und Metriken übersprungen, was nützlich für leere Bereiche, unbeschriftete Pixel oder Klassen außerhalb des Trainings-Label-Sets ist.

Müssen Maskendateinamen mit Bilddateinamen übereinstimmen?

Ja. Jede semantische Maske sollte denselben Dateinamenstamm wie das entsprechende Bild haben. Der Datensatz-Loader ersetzt den images Verzeichnisbestandteil durch masks_dir und sucht nach passenden Maskendateien.

Kann ich ursprüngliche Datensatz-Label-IDs direkt verwenden?

Ja, wenn sie bereits mit deinen names Klassen-IDs übereinstimmen. Wenn der Quelldatensatz nicht zusammenhängende IDs verwendet oder Labels enthält, die ignoriert werden sollten, füge einen label_mapping Bereich hinzu, um Quell-Pixelwerte in Trainings-IDs umzuwandeln.

Kann ich meinen Datensatz für Instanz-Segmentierung verwenden, um semantische Segmentierung zu trainieren?

Ja. Datensätze für Instanz-Segmentierung verwenden Ultralytics YOLO Polygon-Labels (eine .txt Datei pro Bild mit <class-index> <x1> <y1> <x2> <y2> ... Zeilen), und dieselben Dateien können für die semantische Segmentierung wiederverwendet werden – lasse einfach masks_dir im Datensatz-YAML weg. Der Loader konvertiert Polygone im laufenden Betrieb in Masken pro Bild. Für Mehrklassen-Datensätze (N > 1) wird eine zusätzliche background-Klasse angehängt und das Modell mit N + 1 Ausgabekanälen erstellt. Für Einzelklassen-Datensätze (N == 1) bleibt das Training bei 1 Klasse – die Maske zeigt deine deklarierte Klasse als 1 und unbedeckte Pixel als 0.

Kommentare