Ultralytics YOLO27:

Virtual KITTI 2 Depth Dataset#

Virtual KITTI 2 (vKITTI2) is a photorealistic synthetic recreation of the KITTI driving scenes. It clones 5 sequences from the original KITTI dataset and re-renders them under varied weather and lighting conditions, providing dense per-pixel ground truth.

As a synthetic outdoor-driving dataset, vKITTI2 offers a dense counterpart to the sparse real KITTI LiDAR returns, making it a useful source of clean outdoor driving geometry for training monocular depth estimation models.

Key Features#

  • Photorealistic synthetic recreation of KITTI driving scenes.
  • 5 cloned sequences rendered under varied weather and lighting.
  • Outdoor driving environments.
  • Dense per-pixel ground truth (a dense counterpart to the sparse real KITTI LiDAR).
  • Depth range ~80 m.
  • Contributes 42,520 images (25,780 train / 16,740 val) to the Ultralytics depth training mix.

Dataset Structure#

The Virtual KITTI 2 depth dataset is split into two subsets:

  1. Train: 25,780 images with paired dense depth maps for training.
  2. Val: 16,740 images with paired dense depth maps for validation during training.

Each RGB image is paired with a scaled uint16 depth PNG, following the Ultralytics depth dataset format. The source and converted PNGs use centimeters (depth_scale: 100), which preserves the 80 m training range.

Role in YOLO26-Depth#

Virtual KITTI 2 is one of the training sources in the broad multi-dataset mixture (~2.19M images) used to pretrain the Ultralytics YOLO26-Depth models. Within this mix, vKITTI2 provides a dense synthetic outdoor-driving counterpart to the sparse real KITTI LiDAR ground truth.

There is no standalone held-out vKITTI2 benchmark in this setup. Instead, the resulting models are evaluated on the standard monocular depth benchmarks: NYU Depth V2, KITTI, Make3D, ETH3D, and iBims-1.

Dataset YAML#

A YAML file is used to define the dataset configuration. It contains information about the dataset's paths, classes, and other relevant information. For Virtual KITTI 2, the depth-vkitti2.yaml file defines the paths and the single depth class.

ultralytics/cfg/datasets/depth-vkitti2.yaml
# 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 16-bit *.png depth maps (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
depth_scale: 100 # source PNG value 100 = 1 meter (centimeters)

# Download script/URL (optional)
download: |
  import shutil
  from pathlib import Path

  import cv2
  import numpy as np

  from ultralytics.data.utils import save_depth_png
  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)
      save_depth_png(dir / "depth" / split / f"{name}.png", (depth.astype(np.float32) / 100.0).clip(max=80), scale=100)  # cm -> m -> cm PNG
      im.replace(dir / "images" / split / f"{name}.jpg")
  shutil.rmtree(dir / "source")

Usage#

To train a YOLO26n-Depth model on the Virtual KITTI 2 dataset with an image size of 640, you can use the following code snippets. For a comprehensive list of available arguments, refer to the model Training page.

Train Example
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)

Pretrained Models#

The YOLO26 depth family (yolo26n-depth.pt, yolo26s-depth.pt, yolo26m-depth.pt, yolo26l-depth.pt, yolo26x-depth.pt) auto-downloads from Ultralytics releases and is trained on the broad multi-dataset mix that Virtual KITTI 2 is part of. Explore YOLO26x-depth on Ultralytics Platform.

Citations and Acknowledgments#

If you use the Virtual KITTI 2 dataset in your research or development work, please cite the following paper:

Quote
@article{cabon2020vkitti2,
      title={Virtual KITTI 2},
      author={Yohann Cabon and Naila Murray and Martin Humenberger},
      journal={arXiv preprint arXiv:2001.10773},
      year={2020}
}

We would like to acknowledge the creators of Virtual KITTI 2 for making this synthetic driving dataset available to the computer vision community.

FAQ#

  • Virtual KITTI 2 (vKITTI2) is a photorealistic synthetic recreation of five KITTI driving sequences, re-rendered under varied weather and lighting. It contributes 42,520 images (25,780 train, 16,740 val) with dense per-pixel depth to roughly 80 m to the YOLO26-Depth training mix.

  • Real KITTI LiDAR depth is sparse, with only about 16 to 20% of pixels labeled, while vKITTI2 provides a dense depth value for every pixel of the same kind of driving scene. Together they give the model both real sensor statistics and complete outdoor geometry.

  • Run yolo depth train data=depth-vkitti2.yaml model=yolo26n-depth.pt epochs=100 imgsz=640, or use the Python example in the Usage section. Depth PNGs use centimeters (depth_scale: 100), which the bundled YAML already sets.

Comments