Segurança pronta para empresas: Em conformidade com ISO 27001 + SOC 2 Tipo I.

Link to this sectionConjunto de dados de profundidade KITTI#

O conjunto de dados KITTI é um benchmark do mundo real de condução autónoma capturado a partir de um veículo em movimento dentro e nos arredores da cidade de Karlsruhe. Para estimativa de profundidade monocular, a profundidade de referência (ground-truth) é derivada de um scanner LiDAR Velodyne HDL-64 e densificada usando o método de Uhrig et al. 2017. Os mapas de profundidade resultantes permanecem esparsos, com cerca de 16–20% dos pixéis a possuírem um valor de profundidade válido. O KITTI é a única fonte real de longo alcance ao ar livre na mistura de pré-treino do YOLO26-Depth e também serve como o benchmark de avaliação KITTI Eigen.

Link to this sectionPrincipais recursos#

  • Cenas reais de condução ao ar livre com profundidades que abrangem até cerca de 80 m, muito além do alcance interior típico.
  • Profundidade de referência obtida de um LiDAR Velodyne HDL-64 e densificada com a abordagem Sparsity Invariant CNNs de Uhrig et al. 2017.
  • Supervisão esparsa: apenas cerca de 16–20% dos pixéis por imagem possuem um valor de profundidade válido; os pixéis inválidos são mascarados da perda e das métricas.
  • Pares de imagens estéreo (esquerda image_02 e direita image_03) fornecem pontos de vista adicionais para o treino.
  • Os valores de profundidade são armazenados como arrays float32 .npy em metros, seguindo o formato de conjunto de dados de profundidade da Ultralytics.

Link to this sectionEstrutura do Dataset#

Os dados de profundidade KITTI utilizados pela Ultralytics estão divididos em dois subconjuntos:

  1. Divisão de treino: 60.040 imagens (esquerda image_02 e direita image_03). As 28 viagens de teste KITTI Eigen são excluídas do treino para manter a avaliação justa.
  2. Divisão de avaliação: a divisão de teste KITTI Eigen, com 32.378 imagens (ambas as câmaras). A avaliação utiliza o corte Garg, um limite de profundidade de 80 m e alinhamento log-least-squares entre as previsões e a referência.

O alcance de profundidade atinge aproximadamente 80 m, e o YAML do conjunto de dados (depth-kitti.yaml) define max_depth: 80 de acordo.

Link to this sectionPapel no YOLO26-Depth#

O KITTI fornece a única supervisão real de longo alcance ao ar livre na mistura de pré-treino do YOLO26-Depth, complementando as fontes predominantemente internas. É também o benchmark padrão KITTI Eigen para relatar a precisão da profundidade em cenas de condução.

O KITTI é um exemplo chave de por que a cabeça de profundidade não é limitada (modo log): um teto de saída fixo de 10 m não consegue representar cenas de condução de 80 m. Consulta a página de tarefas de profundidade para detalhes sobre o intervalo de saída da cabeça e o manuseamento de max_depth.

Link to this sectionResultados#

Precisão delta1 do KITTI Eigen por tamanho de modelo (quanto maior, melhor):

ModeloKITTI Eigen δ1
YOLO26n-Depth0.888
YOLO26s-Depth0.882
YOLO26m-Depth0.924
YOLO26l-Depth0.927
YOLO26x-Depth0.939

Link to this sectionYAML do Dataset#

Um ficheiro YAML (Yet Another Markup Language) é usado para definir a configuração do conjunto de dados. Contém informações sobre os caminhos do conjunto de dados, classes e outras informações relevantes, como a profundidade máxima.

ultralytics/cfg/datasets/depth-kitti.yaml
# 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 treinar um modelo YOLO26n-Depth no conjunto de dados KITTI durante 100 épocas, podes usar os seguintes snippets de código. Para uma lista abrangente de argumentos disponíveis, consulta a página de Treino do modelo.

Exemplo de Treinamento
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 pré-treinados#

Modelos YOLO26-Depth pré-treinados baixam automaticamente do lançamento de ativos v8.4.0 da Ultralytics quando referenciados pelo nome pela primeira vez:

Link to this sectionCitações e Agradecimentos#

Se utilizares o conjunto de dados KITTI no teu trabalho de investigação ou desenvolvimento, por favor cita os seguintes artigos:

Citação
@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}
}

Gostaríamos de agradecer ao Karlsruhe Institute of Technology e ao Toyota Technological Institute em Chicago pela criação e manutenção do conjunto de dados KITTI, e a Uhrig et al. pelo método de densificação de profundidade que torna possível a supervisão densa.

Contribuidores

Comentários