Dataset di profondità Virtual KITTI 2#
Virtual KITTI 2 (vKITTI2) è una ricreazione sintetica e fotororealistica delle scene di guida KITTI. Clona 5 sequenze dal dataset KITTI originale e le rielabora sotto varie condizioni atmosferiche e di illuminazione, fornendo una ground truth densa per pixel.
Come dataset sintetico di guida all'aperto, vKITTI2 offre una controparte densa rispetto ai dati LiDAR sparsi del KITTI reale, rendendolo una fonte utile di geometria di guida pulita all'aperto per l'addestramento di modelli di depth estimation monoculari.
Caratteristiche principali#
- Ricreazione sintetica fotorealistica delle scene di guida di KITTI.
- 5 sequenze clonate renderizzate in condizioni meteorologiche e di illuminazione variabili.
- Ambienti di guida all'aperto.
- Ground truth per singolo pixel densa (una controparte densa del LiDAR reale sparso di KITTI).
- Intervallo di profondità ~80 m.
- Contribuisce con 42.520 immagini (25.780 di addestramento / 16.740 di validazione) al mix di addestramento per la profondità di Ultralytics.
Struttura del dataset#
Il dataset di profondità Virtual KITTI 2 è suddiviso in due sottoinsiemi:
- Train: 25.780 immagini con mappe di profondità dense abbinate per l'addestramento.
- Val: 16.740 immagini con mappe di profondità dense abbinate per la validazione durante l'addestramento.
Ciascuna immagine RGB è abbinata a una mappa di profondità float32 .npy che memorizza le distanze per pixel in metri, seguendo il formato del dataset di profondità Ultralytics.
Ruolo in YOLO26-Depth#
Virtual KITTI 2 è una delle fonti di addestramento nell'ampio mix multi-dataset (~2,19 milioni di immagini) utilizzato per pre-addestrare i modelli Ultralytics YOLO26-Depth. All'interno di questo mix, vKITTI2 fornisce una controparte sintetica densa della guida all'aperto alla ground truth sparsa del LiDAR reale di KITTI.
Non esiste un benchmark vKITTI2 separato in questa configurazione. Invece, i modelli risultanti vengono valutati sui benchmark standard di profondità monoculare: NYU Depth V2, KITTI, Make3D, ETH3D e iBims-1.
Dataset YAML#
Un file YAML (Yet Another Markup Language) viene utilizzato per definire la configurazione del dataset. Contiene informazioni sui percorsi del dataset, sulle classi e altre informazioni pertinenti. Per Virtual KITTI 2, il file depth-vkitti2.yaml definisce i percorsi e la singola classe depth.
# 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")Utilizzo#
Per addestrare un modello YOLO26n-Depth sul dataset Virtual KITTI 2 con una dimensione dell'immagine pari a 640, puoi utilizzare i seguenti frammenti di codice. Per un elenco completo degli argomenti disponibili, fai riferimento alla pagina di Training del modello.
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)Modelli pre-addestrati#
La famiglia YOLO26 depth (yolo26n-depth.pt, yolo26s-depth.pt, yolo26m-depth.pt, yolo26l-depth.pt, yolo26x-depth.pt) si scarica automaticamente dalle release di Ultralytics ed è addestrata sull'ampio mix multi-dataset di cui fa parte Virtual KITTI 2. Esplora YOLO26x-depth su Ultralytics Platform.
Citazioni e riconoscimenti#
Se utilizzi il dataset Virtual KITTI 2 nel tuo lavoro di ricerca o sviluppo, ti preghiamo di citare il seguente documento:
@article{cabon2020vkitti2,
title={Virtual KITTI 2},
author={Yohann Cabon and Naila Murray and Martin Humenberger},
journal={arXiv preprint arXiv:2001.10773},
year={2020}
}Desideriamo ringraziare i creatori di Virtual KITTI 2 per aver reso disponibile questo dataset di guida sintetica alla comunità della visione artificiale.