엔터프라이즈급 보안: ISO 27001 및 SOC 2 Type I 준수.

Link to this sectionKITTI Depth 데이터셋#

KITTI 데이터셋은 Karlsruhe 시내 및 주변에서 이동 중인 차량으로부터 촬영된 실제 야외 자율 주행 벤치마크입니다. 단안 깊이 추정을 위해, 지상 진실(ground-truth) 깊이는 Velodyne HDL-64 LiDAR 스캐너에서 도출되며 Uhrig et al. 2017의 방식을 사용하여 밀도를 높였습니다. 결과적으로 생성된 깊이 맵은 여전히 희소하며, 전체 픽셀의 약 16~20%만이 유효한 깊이 값을 가집니다. KITTI는 YOLO26-Depth 사전 학습 조합에서 유일한 실제 야외 장거리 소스이며, KITTI Eigen 평가 벤치마크 역할도 합니다.

Link to this section주요 특징#

  • 일반적인 실내 범위를 훨씬 뛰어넘는, 최대 약 80m에 이르는 깊이를 포함하는 실제 야외 주행 장면입니다.
  • Velodyne HDL-64 LiDAR에서 얻고 Uhrig et al. 2017의 Sparsity Invariant CNNs 접근 방식을 사용하여 밀도를 높인 깊이 지상 진실입니다.
  • 희소 지도(Sparse supervision): 이미지당 약 16~20%의 픽셀만이 유효한 깊이 값을 가집니다. 유효하지 않은 픽셀은 손실 및 지표에서 마스킹 처리됩니다.
  • 스테레오 이미지 쌍(왼쪽 image_02 및 오른쪽 image_03)은 학습을 위한 추가 시점을 제공합니다.
  • Depth values are stored as .npy float32 arrays in meters, following the Ultralytics depth dataset format.

Link to this section데이터셋 구조#

Ultralytics에서 사용하는 KITTI 깊이 데이터는 두 개의 하위 세트로 나뉩니다:

  1. 학습 데이터셋(Training split): 60,040개의 이미지(왼쪽 image_02 및 오른쪽 image_03). 공정한 평가를 위해 28개의 KITTI Eigen 테스트 드라이브는 학습에서 제외됩니다.
  2. 평가 데이터셋(Evaluation split): KITTI Eigen 테스트 분할, 32,378개의 이미지(양쪽 카메라 모두). 평가는 Garg 자르기(crop), 80m 깊이 제한, 예측값과 지상 진실 간의 로그 최소 자승 정렬을 사용합니다.

깊이 범위는 약 80m에 달하며, 데이터셋 YAML(depth-kitti.yaml)은 그에 따라 max_depth: 80으로 설정되어 있습니다.

Link to this sectionYOLO26-Depth에서의 역할#

KITTI는 주로 실내 소스로 구성된 YOLO26-Depth 사전 학습 조합에서 유일한 실제 야외 장거리 지도 데이터를 제공합니다. 또한 주행 장면 깊이 정확도를 보고하기 위한 표준 KITTI Eigen 벤치마크이기도 합니다.

KITTI is a key example of why the depth head is unbounded (log mode): a fixed 10 m output ceiling cannot represent 80 m driving scenes. See the depth task page for details on the head output range and max_depth handling.

Link to this section결과#

모델 크기별 KITTI Eigen delta1 정확도(높을수록 좋음):

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

Link to this section데이터셋 YAML#

데이터셋 구성을 정의하기 위해 YAML(Yet Another Markup Language) 파일이 사용됩니다. 이 파일에는 데이터셋의 경로, 클래스, 그리고 최대 깊이와 같은 기타 관련 정보가 포함되어 있습니다.

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 section사용법#

KITTI 데이터셋에서 YOLO26n-Depth 모델을 100 에포크(epoch) 동안 학습하려면 다음 코드 조각을 사용할 수 있습니다. 사용 가능한 전체 인수 목록은 모델 학습(Training) 페이지를 참조하십시오.

훈련 예제
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 section사전 학습된 모델#

사전 학습된 YOLO26-Depth 모델은 이름으로 처음 참조될 때 Ultralytics v8.4.0 에셋 릴리스에서 자동 다운로드됩니다:

Link to this section인용 및 감사의 글#

연구 또는 개발 작업에서 KITTI 데이터셋을 사용하는 경우, 다음 논문을 인용해 주십시오:

인용
@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}
}

KITTI 데이터셋을 생성하고 유지 관리해 준 Karlsruhe Institute of Technology와 Toyota Technological Institute at Chicago, 그리고 밀도 높은 지도가 가능하도록 깊이 밀도화 방법을 제공한 Uhrig et al.에게 감사를 표합니다.

기여자

댓글