Ultralytics YOLO27:
Get Started

Virtual KITTI 2深度データセット#

Virtual KITTI 2(vKITTI2)は、KITTIの走行シーンを写実的に合成再現したデータセットです。元のKITTIデータセットから5つのシーケンスを複製し、さまざまな天候と照明条件で再レンダリングして、ピクセル単位で密なグラウンドトゥルースを提供します。

合成の屋外走行データセットであるvKITTI2は、実環境のKITTI LiDARの疎なデータを密なデータで補完します。そのため、単眼の深度推定モデルのトレーニングにおいて、クリーンな屋外走行の幾何情報を得るための有用なデータソースです。

主な機能#

  • KITTIの走行シーンを写実的に合成再現したデータセットです。
  • さまざまな天候と照明条件でレンダリングされた5つの複製シーケンスを収録しています。
  • 屋外走行環境を収録しています。
  • 密なピクセル単位のグラウンドトゥルース(実環境のKITTI LiDARの疎なデータを密なデータで補完)を提供します。
  • 深度範囲は~80 mです。
  • Ultralyticsの深度トレーニングデータに42,520枚の画像(Train 25,780枚/Val 16,740枚)を提供します。

データセットの構成#

Virtual KITTI 2深度データセットは、次の2つのサブセットに分かれています。

  1. Train:トレーニング用の密な深度マップ付き画像25,780枚。
  2. Val:トレーニング中の検証用に、密な深度マップがペアになった画像16,740枚。

各RGB画像には、Ultralytics深度データセット形式に従ったスケーリング済みuint16深度PNG画像がペアになっています。ソースデータと変換後のPNG画像ではセンチメートル単位(depth_scale: 100)を使用し、これにより80 mのトレーニング範囲を保持します。データセットYAMLはソースアーカイブ(~15 GB)をダウンロードし、初回使用時に自動で変換します。

YOLO26-Depthにおける役割#

Virtual KITTI 2は、Ultralytics YOLO26-Depthモデルの事前学習に使用される、約2.19M枚の画像からなる幅広い複数データセットの組み合わせに含まれるトレーニングソースの1つです。この組み合わせにおいて、vKITTI2は、実環境のKITTI LiDARグラウンドトゥルースの疎なデータを補完する、密な合成の屋外走行データを提供します。

この設定には、vKITTI2単独のホールドアウトベンチマークはありません。代わりに、学習後のモデルは、標準的な単眼深度ベンチマークであるNYU Depth V2、KITTI、Make3D、ETH3D、iBims-1で評価されます。

データセットYAML#

データセット設定の定義にはYAMLファイルを使用します。このファイルには、データセットのパス、クラスなどの関連情報が含まれます。Virtual KITTI 2では、depth-vkitti2.yamlファイルでパスと単一のdepthクラスを定義します。

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")

使用方法#

画像サイズ640でVirtual KITTI 2データセットを使用してYOLO26n-Depthモデルをトレーニングするには、次のコードスニペットを使用できます。利用可能な引数の一覧については、モデルのTrainingページをご覧ください。

トレーニング例
from ultralytics import YOLO

# モデルを読み込む
model = YOLO("yolo26n-depth.pt")  # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します)

# モデルをトレーニングする
results = model.train(data="depth-vkitti2.yaml", epochs=100, imgsz=640)

事前学習済みモデル#

YOLO26の深度モデルファミリー(yolo26n-depth.pt、yolo26s-depth.pt、yolo26m-depth.pt、yolo26l-depth.pt、yolo26x-depth.pt)はUltralyticsのリリースから自動ダウンロードされ、Virtual KITTI 2が含まれる幅広い複数データセットの組み合わせでトレーニングされています。Ultralytics Platform上のYOLO26x-depthをご覧ください。

引用と謝辞#

研究または開発でVirtual KITTI 2データセットを使用する場合は、次の論文を引用してください。

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

この合成走行データセットをコンピュータービジョンコミュニティに公開してくださったVirtual KITTI 2の作成者に感謝いたします。

よくある質問#

  • Virtual KITTI 2(vKITTI2)は、5つのKITTI走行シーケンスを写実的に合成再現し、さまざまな天候と照明条件で再レンダリングしたデータセットです。YOLO26-Depthのトレーニングデータに、深度が約80 mまでのピクセル単位で密なデータを含む画像42,520枚(Train 25,780枚、Val 16,740枚)を提供します。

  • 実環境のKITTI LiDARの深度データは疎で、ラベルが付いているのはピクセルの約16~20%にすぎません。一方、vKITTI2では、同種の走行シーンのすべてのピクセルに密な深度値が用意されています。これらを組み合わせることで、実センサーの統計情報と屋外の完全な幾何情報の両方をモデルに学習させることができます。

  • yolo depth train data=depth-vkitti2.yaml model=yolo26n-depth.pt epochs=100 imgsz=640を実行するか、UsageセクションのPythonサンプルを使用してください。深度PNG画像はセンチメートル単位(depth_scale: 100)を使用しており、付属のYAMLではすでに設定されています。

コントリビューター

コメント