Übersicht über Datensätze zur Tiefenschätzung#
Bei der monokularen Tiefenschätzung wird jedem Pixel eines Bildes ein Tiefenwert in Metern zugewiesen. Tiefenzielwerte werden entweder als skalierte 16-Bit-Graustufen-PNGs oder als NPY-Arrays mit Gleitkommazahlen in Metern gespeichert.
Dieser Leitfaden erläutert das Datensatzformat für Ultralytics-YOLO-Modelle zur Tiefenschätzung und führt die integrierten Datensatzkonfigurationen für Training und Validierung auf.
Unterstütztes Datensatzformat#
Format der Tiefenkarten#
Jede Trainingsstichprobe besteht aus einem RGB-Bild und einer zugehörigen Tiefendatei. PNG-Werte werden durch den optionalen Datensatzparameter depth_scale geteilt, um Meterwerte zu erhalten. Standardmäßig ist dieser Parameter auf 1000 gesetzt, sodass der Wert 1500 1.5 Metern entspricht. Der Code 0 kennzeichnet ungültige Werte. PNGs benötigen keine eingebetteten Metadaten.
- Tiefendateien verwenden
.png(bevorzugt) oder.npy. PNG-Tiefenkarten müssen zweidimensionale uint16-Graustufenbilder sein. NPY-Arrays müssen zweidimensional sein und Gleitkommawerte in Metern enthalten. - Setze
depth_scalenur, wenn die PNGs nicht die standardmäßige Konvention in Millimetern verwenden. KITTI verwendet beispielsweise256, Virtual KITTI 2 hingegen100. - Jede Tiefendatei sollte denselben Dateinamenstamm wie die zugehörige Bilddatei haben (z. B. gehört
scene_001.pngzuscene_001.jpg). - Tiefenkarten dürfen kleiner als ihre RGB-Bilder sein, sofern das Seitenverhältnis übereinstimmt. Beim Training werden sie im Arbeitsspeicher skaliert.
- Der Datensatzlader sucht nach Tiefendateien, indem er den Verzeichnispfad
imagesdurchdepthersetzt. Dabei wird.pngbevorzugt und andernfalls.npyverwendet. - Pixel mit dem Tiefenwert
≤ 0gelten als ungültig und werden von der Berechnung des Verlusts und der Metriken ausgeschlossen.
Da der Code 0 für ungültige Pixel reserviert ist, bietet eine uint16-PNG 65,535 positive Tiefenwerte. Die Skalierung bestimmt sowohl die Präzision als auch den Wertebereich:
| Konvention | depth_scale | Auflösung | Maximale Tiefe |
|---|---|---|---|
| Standard / ARKitScenes | 1000 | 1 mm | 65.535 m |
| KITTI | 256 | 3.90625 mm | 255.99609375 m |
| Virtual KITTI 2 | 100 | 1 cm | 655.35 m |
Dies sind Speichergrenzen, keine empfohlenen Obergrenzen für das Training. Für die Verlustkalibrierung oder Auswertung kann ein Datensatz unabhängig davon einen kleineren Wert für max_depth festlegen.
Bei der Standardverzeichnisstruktur liegen Bilder und Tiefenkarten in parallelen Ordnern:
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/Ein Bild unter images/train/scene_001.jpg wird beispielsweise mit einer Tiefenkarte unter depth/train/scene_001.png verknüpft.
YAML-Format für Datensätze#
Datensätze zur Tiefenschätzung werden mit YAML-Dateien konfiguriert. Die wichtigsten Felder sind:
| Schlüssel | Beschreibung |
|---|---|
path | Stammverzeichnis des Datensatzes. |
train | Pfad zu den Trainingsbildern relativ zu path oder ein absoluter Pfad. |
val | Pfad zu den Validierungsbildern relativ zu path oder ein absoluter Pfad. |
test | Optionaler Pfad zu den Testbildern. |
nc | Anzahl der Klassen – bei der Tiefenschätzung immer 1. |
names | Zuordnung der Klassennamen – immer {0: depth}. |
depth_scale | Optionale PNG-Einheiten pro Meter; standardmäßig 1000. |
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# NYU Depth V2 dataset for monocular depth estimation
# Documentation: https://cs.nyu.edu/~fergus/datasets/nyu_depth_v2.html
# 795 train + 654 val (Eigen test split) images, 480x640, indoor scenes, depth in meters
# Example usage: yolo depth train data=nyu-depth.yaml model=yolo26n-depth.pt
# parent
# ├── ultralytics
# └── datasets
# └── nyu-depth-png ← downloads here (≈1.5 GB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: nyu-depth-png # dataset root dir (relative to Ultralytics settings 'datasets_dir')
train: images/train # train images (relative to 'path') 795 images
val: images/val # val images (relative to 'path') 654 images
# Depth maps are paired uint16 millimeter PNGs under depth/<split>/, resolved by
# swapping '/images/' -> '/depth/' on each image path.
# Classes
nc: 1
names:
0: depth
channels: 3
depth_scale: 1000
# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/nyu-depth-png.zipVerwendung#
Trainiere ein YOLO26-Modell zur Tiefenschätzung mit Python oder der CLI:
from ultralytics import YOLO
# Vortrainiertes Tiefenmodell laden
model = YOLO("yolo26n-depth.pt")
# Mit dem Datensatz NYU Depth V2 trainieren
results = model.train(data="nyu-depth.yaml", epochs=100, imgsz=640)Unterstützte Datensätze#
Die YOLO26-Tiefenmodelle werden mit einer breit gefächerten Mischung aus mehreren Datensätzen vortrainiert (~2.19M Bilder), die Innenbereiche (≤10 m) bis hin zu Außenbereichen (~80 m) abdeckt. Anschließend werden sie anhand von fünf Benchmarks ausgewertet, bei allen außer KITTI Eigen im Zero-Shot-Verfahren. Für jeden Datensatz gibt es eine eigene Seite. Einige Datensätze sind auf der Ultralytics Platform zum Durchsuchen und für das Cloud-Training verfügbar.
Fehlersuche
- Depth8 — 8 SUN-RGB-D-Bilder in einem 1.3 MB großen Archiv mit automatischem Download, zum schnellen Testen der Verarbeitungskette
Quellen für das Vortraining
- ARKitScenes — reale Innenräume, Apple-ARKit-LiDAR (größte Quelle mit realen Daten)
- SUN RGB-D — reale Innenräume, RGB-D-Daten von mehreren Sensoren
- DIODE — reale Innen- und Außenbereiche, dichte Referenzdaten von Laserscannern
- Hypersim — fotorealistische synthetische Innenräume
- TartanAir — synthetische Daten aus vielfältigen Umgebungen
- Virtual KITTI 2 — synthetische Daten für das Fahren im Außenbereich
- KITTI — reale Fahrdaten aus Außenbereichen, Velodyne-LiDAR (auch ein Benchmark für die Auswertung)
- ImageNet (mit Pseudolabels) — Destillationsdatensatz mit Pseudolabels, die größte einzelne Quelle
Benchmarks für die Auswertung
- NYU Depth V2 — primärer Benchmark für Innenräume
- KITTI Eigen — Benchmark für das Fahren im Außenbereich
- ETH3D — hohe Präzision in Innen- und Außenbereichen
- Make3D — Außenbereiche, Verteilung außerhalb der Trainingsdaten
- iBims-1 — hochwertige Daten aus Innenräumen (Kanten und ebene Flächen)
Die Genauigkeit der einzelnen Modelle auf diesen Benchmarks und die herunterladbaren vortrainierten Gewichte sind auf der Seite zur Aufgabe Tiefenschätzung aufgeführt. Eine YAML-Datei für einen Datensatz, deren Feld train mehrere Bildverzeichnisse aufführt, kombiniert diese Quellen für ein groß angelegtes Training mit gemischten Daten.
Eigenen Datensatz hinzufügen#
- Speichere RGB-Bilder in Unterordnern für die einzelnen Datensatzaufteilungen, zum Beispiel
images/trainundimages/val. - Speichere für jedes Bild eine Tiefen-PNG- oder NPY-Datei in den entsprechenden Ordnern
depth/trainunddepth/val. Verwende dabei denselben Dateinamenstamm wie für das Bild. Mitsave_depth_png()kannst du Meter-Arrays in kompakte Millimeter-PNGs umwandeln. - Stelle sicher, dass die dekodierten Tiefenwerte in Metern angegeben sind und ungültige oder fehlende Pixel den Wert
0oder negative Werte haben. - Erstelle eine YAML-Datei für den Datensatz mit
path,train,val,nc: 1undnames: {0: depth}.
path: path/to/my-depth-dataset
train: images/train
val: images/val
nc: 1
names:
0: depth
# Optional: PNG integer units per meter (default 1000)
depth_scale: 1000Häufig gestellte Fragen#
Verwende für kompakte Datensätze skalierte 16-Bit-Graustufen-PNGs. Standardmäßig entspricht jeder ganzzahlige Schritt einem Millimeter. Lege in der YAML-Datei des Datensatzes
depth_scalefest, wenn du eine andere Skalierung verwenden möchtest. Mitultralytics.data.utils.save_depth_png()wandelst du Meter-Arrays in das Standardformat um. Tiefenkarten im NPY-Format mit Gleitkommawerten in Metern funktionieren ebenfalls direkt.Pixel mit dem Tiefenwert
≤ 0gelten als ungültig und werden sowohl bei der Verlustberechnung als auch bei der Auswertung der Metriken maskiert. Dies betrifft Bildrauschen von Sensoren, Himmelsbereiche und reflektierende Oberflächen, bei denen sich die Tiefe nicht zuverlässig messen lässt.Bei der Validierung der Tiefenschätzung wird der standardmäßige Metriksatz von Depth Anything ausgegeben:
- delta1 / delta2 / delta3 — Anteil der Pixel innerhalb der Schwellenwerte 1.25×, 1.25²× und 1.25³×. Höhere Werte sind besser.
- abs_rel — mittlerer absoluter relativer Fehler. Niedriger ist besser.
- rmse — Wurzel des mittleren quadratischen Fehlers in Metern. Niedriger ist besser.
- silog — skaleninvarianter logarithmischer Fehler. Niedriger ist besser.
Ja. Jede Tiefendatei
.pngoder.npymuss denselben Dateinamenstamm wie das zugehörige Bild haben. Der Lader leitet den Tiefenpfad ab, indem er den Verzeichnispfadimagesdurchdepthersetzt. Dabei wird PNG bevorzugt und andernfalls NPY verwendet. Bilder, deren Tiefendatei fehlt oder nicht lesbar ist, werden beim Zwischenspeichern des Datensatzes nach einer Warnung aussortiert.