Übersicht über Datensätze zur Tiefenschätzung#
Bei der monokularen Tiefenschätzung wird jedem Pixel eines Bildes ein Tiefenwert in Metern zugewiesen. Tiefenzielwerte verwenden entweder skalierte 16-Bit-Graustufen-PNGs oder Gleitkomma-NPY-Arrays in Metern.
Dieser Leitfaden erklärt das von den Ultralytics YOLO-Modellen zur Tiefenschätzung verwendete Datensatzformat und führt die integrierten Datensatzkonfigurationen auf, die für Training und Validierung verfügbar sind.
Unterstütztes Datensatzformat#
Format der Tiefenkarte#
Jedes Trainingsbeispiel besteht aus einem RGB-Bild und einer zugehörigen Tiefendatei. PNG-Werte werden durch die optionale Datensatzskalierung auf Ebene depth_scale geteilt, um Meter zu erhalten. Der Standardwert ist 1000, daher entspricht ein Wert von 1500 1.5 Metern. Der Code 0 bedeutet ungültig; PNGs benötigen keine eingebetteten Metadaten.
- Tiefendateien verwenden
.png(bevorzugt) oder.npy. PNG-Karten müssen 2D-Graustufenbilder vom Typ uint16 sein. NPY-Arrays müssen 2D und Gleitkommawerte enthalten, die in Metern angegeben sind. - Setze
depth_scalenur, wenn PNGs nicht die standardmäßige Millimeterkonvention verwenden. KITTI verwendet beispielsweise256, während Virtual KITTI 2100verwendet. - Jede Tiefendatei sollte denselben Stammnamen wie die zugehörige Bilddatei haben (z. B. gehört
scene_001.pngzuscene_001.jpg). - Tiefenkarten dürfen kleiner als ihre RGB-Bilder sein, solange das Seitenverhältnis übereinstimmt; beim Training werden sie im Arbeitsspeicher skaliert.
- Der Datensatzlader findet Tiefendateien, indem er die Verzeichniskomponente
imagesdurchdepthersetzt,.pngbevorzugt und auf.npyzurückgreift. - Pixel mit der Tiefe
≤ 0werden als ungültig behandelt und von der Berechnung des Verlusts und der Metriken ausgeschlossen.
Da der Code 0 für ungültige Pixel reserviert ist, stellt ein uint16-PNG 65.535 positive Tiefenwerte bereit. Die Skalierung steuert sowohl die Genauigkeit 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 und keine empfohlenen Obergrenzen für das Training. Ein Datensatz kann unabhängig davon einen kleineren Wert für max_depth zur Kalibrierung des Verlusts oder zur Auswertung festlegen.
Das Standardlayout bewahrt Bilder und Tiefenkarten in parallelen Verzeichnissen auf:
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/Beispielsweise wird ein Bild unter images/train/scene_001.jpg 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 Anzahl von PNG-Einheiten pro Meter; Standardwert ist 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
# Load a pretrained depth model
model = YOLO("yolo26n-depth.pt")
# Train on the NYU Depth V2 dataset
results = model.train(data="nyu-depth.yaml", epochs=100, imgsz=640)Unterstützte Datensätze#
Die YOLO26-Tiefenmodelle werden auf einem breiten Multi-Dataset-Mix (~2,19 Mio. Bilder) vortrainiert, der Indoor- (≤10 m) bis Outdoor-Bereiche (~80 m) abdeckt, und anschließend an fünf Benchmarks evaluiert, zero-shot bei allen außer KITTI Eigen. Jedes Dataset hat eine eigene Seite, und mehrere Datasets werden auf der Ultralytics Platform zum Durchsuchen und für das Cloud-Training gehostet.
Fehlerbehebung
- Depth8 — 8 SUN RGB-D-Bilder in einem 1,3 MB großen, automatisch heruntergeladenen Archiv für schnelle Tests der Verarbeitungspipeline
Quellen für das Vortraining
- ARKitScenes — reale Innenbereiche, Apple ARKit LiDAR (größte reale Quelle)
- SUN RGB-D — reale Innenbereiche, RGB-D-Daten aus mehreren Sensoren
- DIODE — reale Innen- und Außenbereiche, dichte Referenzdaten eines Laserscanners
- Hypersim — synthetische fotorealistische Innenbereiche
- TartanAir — synthetisch, vielfältige Umgebungen
- Virtual KITTI 2 — synthetische Außenbereiche für das Fahren
- KITTI — reale Außenbereiche für das Fahren, Velodyne LiDAR (auch ein Evaluierungsbenchmark)
- ImageNet (pseudo-gelabelt) — durch Pseudolabels gekennzeichneter Destillationsdatensatz, größte Einzelquelle
Evaluierungsbenchmarks
- NYU Depth V2 — primärer Benchmark für Innenbereiche
- KITTI Eigen — Benchmark für das Fahren im Außenbereich
- ETH3D — Innen- und Außenbereiche mit hoher Präzision
- Make3D — Außenbereiche, außerhalb der Trainingsverteilung
- iBims-1 — hochwertige Innenbereiche (Kanten und ebene Oberflächen)
Die Genauigkeit der einzelnen Modelle auf diesen Benchmarks und die herunterladbaren vortrainierten Gewichte sind auf der Aufgabenseite zur Tiefenschätzung aufgeführt. Eine Datensatz-YAML-Datei, deren Feld train mehrere Bildverzeichnisse auflistet, kombiniert diese Quellen für das Training mit großen gemischten Datensätzen.
Eigenen Datensatz hinzufügen#
- Speichere RGB-Bilder in Teilmengenverzeichnissen wie
images/trainundimages/val. - Speichere für jedes Bild eine Tiefen-PNG- oder NPY-Datei in den entsprechenden Ordnern
depth/trainunddepth/valund verwende dabei denselben Stammnamen wie für das Bild. Verwendesave_depth_png(), um Meter-Arrays in kompakte Millimeter-PNGs umzuwandeln. - Stelle sicher, dass die dekodierten Tiefenwerte in Metern angegeben sind und ungültige oder fehlende Pixel
0oder negative Werte verwenden. - Erstelle eine Dataset-YAML 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: 1000FAQ#
Verwende skalierte 16-Bit-Graustufen-PNGs für kompakte Datensätze. Standardmäßig entspricht jeder Ganzzahlschritt einem Millimeter; lege
depth_scalein der Datensatz-YAML-Datei für eine andere Skalierung fest.ultralytics.data.utils.save_depth_png()wandelt Meter-Arrays in das Standardformat um. Gleitkomma-NPY-Karten in Metern funktionieren ebenfalls direkt.Pixel mit den Tiefenwerten
≤ 0werden als ungültig behandelt und sowohl bei der Verlustberechnung als auch bei der Auswertung der Metriken maskiert. Dies umfasst Sensorrauschen, Himmelsbereiche und reflektierende Oberflächen, bei denen die Tiefe nicht zuverlässig gemessen werden kann.Die Validierung der Tiefenschätzung gibt den standardmäßigen Metriksatz von Depth Anything aus:
- delta1 / delta2 / delta3 — prozentualer Anteil der Pixel innerhalb der Schwellenwerte 1,25×, 1,25²× und 1,25³×. Höhere Werte sind besser.
- abs_rel – mittlerer absoluter relativer Fehler. Niedrigere Werte sind besser.
- rmse – Wurzel des mittleren quadratischen Fehlers in Metern. Niedrigere Werte sind besser.
- silog – skaleninvarianter logarithmischer Fehler. Niedrigere Werte sind besser.
Ja. Jede Tiefendatei
.pngoder.npymuss denselben Stammnamen wie das entsprechende Bild haben. Der Lader leitet den Tiefenpfad ab, indem er die Verzeichniskomponenteimagesdurchdepthersetzt, PNG bevorzugt und auf NPY zurückgreift. Bilder, deren Tiefendatei fehlt oder nicht lesbar ist, werden während des Scans des zwischengespeicherten Datensatzes mit einer Warnung entfernt.