Link to this sectionVirtual KITTI 2 Tiefendatensatz#
Virtual KITTI 2 (vKITTI2) ist eine fotorealistische synthetische Nachbildung der KITTI-Fahrszenen. Es klont 5 Sequenzen aus dem ursprünglichen KITTI-Datensatz und rendert sie unter verschiedenen Wetter- und Lichtbedingungen neu, wodurch ein dichtes Ground-Truth pro Pixel bereitgestellt wird.
Als synthetischer Datensatz für das Fahren im Freien bietet vKITTI2 ein dichtes Gegenstück zu den spärlichen echten KITTI-LiDAR-Daten und ist damit eine nützliche Quelle für saubere Geometrie für das Training monokularer Tiefenschätzungs-Modelle.
Link to this sectionHauptfunktionen#
- Fotorealistische synthetische Nachbildung von KITTI-Fahrszenen.
- 5 geklonte Sequenzen, gerendert unter variierenden Wetter- und Lichtbedingungen.
- Outdoor-Fahrumgebungen.
- Dichtes Ground-Truth pro Pixel (ein dichtes Gegenstück zum spärlichen echten KITTI-LiDAR).
- Tiefenbereich ~80 m.
- Trägt 42.520 Bilder (25.780 Training / 16.740 Validierung) zum Ultralytics Tiefentrainings-Mix bei.
Link to this sectionDatensatzstruktur#
Der Virtual KITTI 2 Tiefendatensatz ist in zwei Teilmengen unterteilt:
- Train: 25.780 Bilder mit zugehörigen dichten Tiefenkarten für das Training.
- Val: 16.740 Bilder mit zugehörigen dichten Tiefenkarten für die Validierung während des Trainings.
Jedes RGB-Bild ist mit einer .npy float32-Tiefenkarte gepaart, die die Abstände pro Pixel in Metern speichert, gemäß dem Ultralytics depth dataset format.
Link to this sectionRolle bei YOLO26-Depth#
Virtual KITTI 2 ist eine der Trainingsquellen in der breiten Multi-Datensatz-Mischung (~2,19 Mio. Bilder), die zum Vortrainieren der Ultralytics YOLO26-Depth-Modelle verwendet wird. Innerhalb dieser Mischung bietet vKITTI2 ein dichtes synthetisches Gegenstück für das Fahren im Freien zur spärlichen echten KITTI-LiDAR-Ground-Truth.
Es gibt in diesem Setup kein eigenständiges, isoliertes vKITTI2-Benchmark. Stattdessen werden die resultierenden Modelle auf den Standard-Monokular-Tiefenbenchmarks evaluiert: NYU Depth V2, KITTI, Make3D, ETH3D und iBims-1.
Link to this sectionDatensatz-YAML#
Eine YAML-Datei (Yet Another Markup Language) wird verwendet, um die Datensatzkonfiguration zu definieren. Sie enthält Informationen über die Pfade des Datensatzes, Klassen und andere relevante Informationen. Für Virtual KITTI 2 definiert die depth-vkitti2.yaml-Datei die Pfade und die einzelne depth-Klasse.
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Virtual KITTI 2 dataset for monocular depth estimation — photorealistic synthetic outdoor driving, dense per-pixel depth
# Documentation: https://docs.ultralytics.com/datasets/depth/vkitti2
# Example usage: yolo depth train data=depth-vkitti2.yaml model=yolo26n-depth.pt
# parent
# ├── ultralytics
# └── datasets
# └── depth-vkitti2 ← downloads here (15 GB archives, ~85 GB converted)
# ├── images/{train,val} # RGB images
# └── depth/{train,val} # paired *.npy, float32 meters (images/ -> depth/)
# If an interrupted download leaves a partial dataset, delete the depth-vkitti2 dir and re-run to rebuild it.
path: depth-vkitti2 # dataset root dir (relative to Ultralytics settings 'datasets_dir')
train: images/train # train images (relative to 'path') 25780 images
val: images/val # val images (relative to 'path') 16740 images
max_depth: 80 # (m) maximum valid depth; GT beyond this is excluded from val metrics
nc: 1
names:
0: depth
channels: 3
# Download script/URL (optional)
download: |
import shutil
from pathlib import Path
import cv2
import numpy as np
from ultralytics.utils import TQDM
from ultralytics.utils.downloads import download
# Download and extract the official RGB + depth tars (~15 GB), then convert: Scene20 -> val, all
# other scenes -> train; depth PNGs are uint16 centimeters (sky = 655.35 m), clipped at 80 m
dir = Path(yaml["path"]) # dataset root dir
urls = [f"https://download.europe.naverlabs.com/virtual_kitti_2.0.3/vkitti_2.0.3_{s}.tar" for s in ("rgb", "depth")]
download(urls, dir=dir / "source", delete=True)
for split in ("train", "val"):
(dir / "images" / split).mkdir(parents=True, exist_ok=True)
(dir / "depth" / split).mkdir(parents=True, exist_ok=True)
for im in TQDM(sorted((dir / "source").rglob("rgb_*.jpg")), desc="Converting"):
scene, variation, camera = im.parts[-6], im.parts[-5], im.parts[-2] # Scene01/clone/frames/rgb/Camera_0/rgb_00000.jpg
split = "val" if scene == "Scene20" else "train"
name = f"{scene}_{variation}_{camera}_{im.stem[4:]}"
depth = cv2.imread(str(im.parents[2] / "depth" / camera / f"depth_{im.stem[4:]}.png"), cv2.IMREAD_ANYDEPTH)
np.save(dir / "depth" / split / f"{name}.npy", (depth.astype(np.float32) / 100.0).clip(max=80)) # cm -> m
im.replace(dir / "images" / split / f"{name}.jpg")
shutil.rmtree(dir / "source")Link to this sectionVerwendung#
Um ein YOLO26n-Depth-Modell auf dem Virtual KITTI 2 Datensatz mit einer Bildgröße von 640 zu trainieren, kannst du die folgenden Code-Snippets verwenden. Eine vollständige Liste der verfügbaren Argumente findest du auf der Seite Training.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="depth-vkitti2.yaml", epochs=100, imgsz=640)Link to this sectionVortrainierte Modelle#
Die YOLO26-Tiefenfamilie (yolo26n-depth.pt, yolo26s-depth.pt, yolo26m-depth.pt, yolo26l-depth.pt, yolo26x-depth.pt) lädt sich automatisch aus dem v8.4.0 Release herunter und ist auf der breiten Multi-Datensatz-Mischung trainiert, zu der auch Virtual KITTI 2 gehört.
Link to this sectionZitate und Danksagungen#
Wenn du den Virtual KITTI 2 Datensatz in deiner Forschung oder Entwicklungsarbeit verwendest, zitiere bitte das folgende Papier:
@article{cabon2020vkitti2,
title={Virtual KITTI 2},
author={Yohann Cabon and Naila Murray and Martin Humenberger},
journal={arXiv preprint arXiv:2001.10773},
year={2020}
}Wir möchten den Entwicklern von Virtual KITTI 2 dafür danken, dass sie diesen synthetischen Fahr-Datensatz der Computer-Vision-Community zur Verfügung gestellt haben.