Link to this sectionConjunto de datos de profundidad KITTI#
El conjunto de datos KITTI es un banco de pruebas del mundo real de conducción autónoma capturado desde un vehículo en movimiento en la ciudad de Karlsruhe y sus alrededores. Para la estimación de profundidad monocular, la profundidad de referencia (ground-truth) se deriva de un escáner LiDAR Velodyne HDL-64 y se densifica utilizando el método de Uhrig et al. 2017. Los mapas de profundidad resultantes siguen siendo dispersos, con aproximadamente el 16–20% de los píxeles con un valor de profundidad válido. KITTI es la única fuente real de largo alcance en exteriores en la mezcla de preentrenamiento de YOLO26-Depth y también sirve como banco de pruebas de evaluación KITTI Eigen.
Link to this sectionCaracterísticas clave#
- Escenas reales de conducción en exteriores con profundidades que abarcan hasta aproximadamente 80 m, mucho más allá del rango típico en interiores.
- Profundidad de referencia obtenida de un LiDAR Velodyne HDL-64 y densificada con el enfoque de Sparsity Invariant CNNs de Uhrig et al. 2017.
- Supervisión dispersa: solo alrededor del 16–20% de los píxeles por imagen tienen un valor de profundidad válido; los píxeles no válidos se excluyen de la pérdida y las métricas.
- Los pares de imágenes estéreo (izquierda
image_02y derechaimage_03) proporcionan puntos de vista adicionales para el entrenamiento. - Los valores de profundidad se almacenan como matrices float32
.npyen metros, siguiendo el formato de conjunto de datos de profundidad de Ultralytics.
Link to this sectionEstructura del dataset#
Los datos de profundidad KITTI utilizados por Ultralytics se dividen en dos subconjuntos:
- División de entrenamiento: 60.040 imágenes (izquierda
image_02y derechaimage_03). Las 28 unidades de prueba KITTI Eigen se excluyen del entrenamiento para mantener una evaluación justa. - División de evaluación: la división de prueba KITTI Eigen, 32.378 imágenes (ambas cámaras). La evaluación utiliza el recorte Garg, un límite de profundidad de 80 m y la alineación log-least-squares entre las predicciones y la referencia.
El rango de profundidad alcanza aproximadamente 80 m, y el YAML del conjunto de datos (depth-kitti.yaml) establece max_depth: 80 en consecuencia.
Link to this sectionRol en YOLO26-Depth#
KITTI proporciona la única supervisión real de largo alcance en exteriores en la mezcla de preentrenamiento de YOLO26-Depth, complementando las fuentes predominantemente interiores. También es el banco de pruebas estándar KITTI Eigen para informar sobre la precisión de la profundidad en escenas de conducción.
KITTI es un ejemplo clave de por qué el cabezal de profundidad no tiene límites (modo log): un techo de salida fijo de 10 m no puede representar escenas de conducción de 80 m. Consulta la página de la tarea de profundidad para obtener más detalles sobre el rango de salida del cabezal y el manejo de max_depth.
Link to this sectionResultados#
Precisión delta1 de KITTI Eigen por tamaño de modelo (cuanto mayor sea, mejor):
| Modelo | KITTI Eigen δ1 |
|---|---|
| YOLO26n-Depth | 0.888 |
| YOLO26s-Depth | 0.882 |
| YOLO26m-Depth | 0.924 |
| YOLO26l-Depth | 0.927 |
| YOLO26x-Depth | 0.939 |
Link to this sectionYAML del dataset#
Se utiliza un archivo YAML (Yet Another Markup Language) para definir la configuración del conjunto de datos. Contiene información sobre las rutas, clases y otra información relevante del conjunto de datos, como la profundidad máxima.
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# KITTI dataset for monocular depth estimation — real outdoor driving, Velodyne HDL-64 LiDAR (densified), sparse, up to ~80 m
# Documentation: https://docs.ultralytics.com/datasets/depth/kitti
# Example usage: yolo depth train data=depth-kitti.yaml model=yolo26n-depth.pt
# parent
# ├── ultralytics
# └── datasets
# └── depth-kitti ← downloads here (~190 GB archives, ~230 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-kitti dir and re-run to rebuild it.
path: depth-kitti # dataset root dir (relative to Ultralytics settings 'datasets_dir')
train: images/train # train images (relative to 'path') 60040 images
val: images/val # val images (relative to 'path') 32378 images (KITTI Eigen test split)
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
# Drives of the 28 KITTI Eigen test scenes -> val; every other annotated drive -> train
VAL_DRIVES = """2011_09_26_drive_0002 2011_09_26_drive_0009 2011_09_26_drive_0013 2011_09_26_drive_0020
2011_09_26_drive_0023 2011_09_26_drive_0027 2011_09_26_drive_0029 2011_09_26_drive_0036 2011_09_26_drive_0046
2011_09_26_drive_0048 2011_09_26_drive_0052 2011_09_26_drive_0056 2011_09_26_drive_0059 2011_09_26_drive_0064
2011_09_26_drive_0084 2011_09_26_drive_0086 2011_09_26_drive_0093 2011_09_26_drive_0096 2011_09_26_drive_0101
2011_09_26_drive_0106 2011_09_26_drive_0117 2011_09_28_drive_0002 2011_09_29_drive_0026 2011_09_29_drive_0071
2011_09_30_drive_0016 2011_10_03_drive_0034 2011_10_03_drive_0042 2011_10_03_drive_0047""".split()
# Annotated drives excluded from the release training set (raw data was unavailable at build time)
SKIP_DRIVES = {"2011_09_28_drive_0104", "2011_09_28_drive_0135", "2011_09_28_drive_0177", "2011_09_28_drive_0214"}
# Download the improved sparse GT (~14 GB) and the raw recordings it covers (~175 GB)
dir = Path(yaml["path"]) # dataset root dir
base = "https://s3.eu-central-1.amazonaws.com/avg-kitti"
download([f"{base}/data_depth_annotated.zip"], dir=dir / "source", delete=True, exist_ok=True)
gt_drives = sorted(p for p in (dir / "source" / "data_depth_annotated").glob("*/*_sync") if p.name[:-5] not in SKIP_DRIVES)
urls = [f"{base}/raw_data/{p.name[:-5]}/{p.name}.zip" for p in gt_drives]
download(urls, dir=dir / "source" / "raw", delete=True, exist_ok=True, threads=4)
# Convert: GT PNGs are uint16 meters*256; RGB frames come from the matching raw drive
for split in ("train", "val"):
(dir / "images" / split).mkdir(parents=True, exist_ok=True)
(dir / "depth" / split).mkdir(parents=True, exist_ok=True)
for gt in TQDM(gt_drives, desc="Converting"):
drive = gt.name[:-5] # 2011_09_26_drive_0002
split = "val" if drive in VAL_DRIVES else "train"
for cam in ("image_02", "image_03"):
for png in sorted((gt / "proj_depth" / "groundtruth" / cam).glob("*.png")):
name = f"{drive}_{cam[-2:]}_{png.stem}"
depth = cv2.imread(str(png), cv2.IMREAD_ANYDEPTH).astype(np.float32) / 256.0
np.save(dir / "depth" / split / f"{name}.npy", depth)
raw = dir / "source" / "raw" / drive[:10] / gt.name / cam / "data" / png.name
raw.replace(dir / "images" / split / f"{name}.png")
shutil.rmtree(dir / "source")Link to this sectionUso#
Para entrenar un modelo YOLO26n-Depth en el conjunto de datos KITTI durante 100 épocas, puedes utilizar los siguientes fragmentos de código. Para obtener una lista completa de los argumentos disponibles, consulta la página de Entrenamiento del modelo.
from ultralytics import YOLO
# Load a pretrained depth model
model = YOLO("yolo26n-depth.pt")
# Train the model on KITTI
results = model.train(data="depth-kitti.yaml", epochs=100, imgsz=640)Link to this sectionModelos preentrenados#
Los modelos YOLO26-Depth preentrenados se descargan automáticamente desde el lanzamiento de activos v8.4.0 de Ultralytics cuando se hace referencia a ellos por primera vez por su nombre:
Link to this sectionCitas y agradecimientos#
Si utilizas el conjunto de datos KITTI en tu trabajo de investigación o desarrollo, por favor cita los siguientes artículos:
@article{geiger2013vision,
title={Vision meets Robotics: The KITTI Dataset},
author={Geiger, Andreas and Lenz, Philip and Stiller, Christoph and Urtasun, Raquel},
journal={The International Journal of Robotics Research},
year={2013},
publisher={SAGE Publications}
}
@inproceedings{uhrig2017sparsity,
title={Sparsity Invariant CNNs},
author={Uhrig, Jonas and Schneider, Nick and Schneider, Lukas and Franke, Uwe and Brox, Thomas and Geiger, Andreas},
booktitle={International Conference on 3D Vision (3DV)},
year={2017}
}Nos gustaría agradecer al Instituto de Tecnología de Karlsruhe y al Instituto Tecnológico Toyota en Chicago por crear y mantener el conjunto de datos KITTI, y a Uhrig et al. por el método de densificación de profundidad que hace posible la supervisión densa.