أمن جاهز للمؤسسات: متوافقة مع ISO 27001 و SOC 2 Type I.

Link to this sectionمجموعة بيانات العمق KITTI#

مجموعة بيانات KITTI هي معيار مرجعي للعالم الحقيقي في مجال القيادة الذاتية تم التقاطه من مركبة متحركة في مدينة كارلسروه وما حولها. لتقدير العمق الأحادي، يتم اشتقاق عمق الحقيقة الأرضية (ground-truth) من ماسح Velodyne HDL-64 LiDAR وتكثيفه باستخدام طريقة Uhrig et al. 2017. تظل خرائط العمق الناتجة متفرقة، حيث تحمل حوالي 16–20% من البكسلات قيمة عمق صالحة. تعد KITTI المصدر الوحيد الحقيقي طويل المدى في الهواء الطلق في مزيج التدريب المسبق لـ YOLO26-Depth كما تعمل كمعيار تقييم KITTI Eigen.

Link to this sectionالميزات الرئيسية#

  • مشاهد قيادة حقيقية في الهواء الطلق بأعماق تمتد إلى حوالي 80 متراً، وهي أبعد بكثير من النطاق الداخلي المعتاد.
  • تم الحصول على عمق الحقيقة الأرضية من Velodyne HDL-64 LiDAR وتم تكثيفه باستخدام نهج Sparsity Invariant CNNs الخاص بـ Uhrig et al. 2017.
  • إشراف متفرق: حوالي 16–20% فقط من البكسلات لكل صورة تحمل قيمة عمق صالحة؛ يتم إخفاء البكسلات غير الصالحة من الخسارة والمقاييس.
  • توفر أزواج الصور المجسمة (اليسرى image_02 واليمنى image_03) وجهات نظر إضافية للتدريب.
  • يتم تخزين قيم العمق كمصفوفات .npy بتنسيق float32 بالأمتار، باتباع تنسيق مجموعة بيانات العمق Ultralytics.

Link to this sectionهيكل مجموعة البيانات#

بيانات عمق KITTI المستخدمة من قبل Ultralytics مقسمة إلى مجموعتين فرعيتين:

  1. تقسيم التدريب: 60,040 صورة (اليسرى image_02 واليمنى image_03). تم استبعاد رحلات اختبار KITTI Eigen الـ 28 من التدريب للحفاظ على عدالة التقييم.
  2. تقسيم التقييم: تقسيم اختبار KITTI Eigen، ويحتوي على 32,378 صورة (لكلا الكاميرتين). يستخدم التقييم اقتصاص Garg، وحد عمق 80 متراً، ومطابقة المربعات الصغرى اللوغاريتمية بين التنبؤات والحقيقة الأرضية.

يصل نطاق العمق إلى ما يقرب من 80 متراً، ويقوم ملف YAML الخاص بمجموعة البيانات (depth-kitti.yaml) بضبط max_depth: 80 وفقاً لذلك.

Link to this sectionدورها في YOLO26-Depth#

توفر KITTI الإشراف الوحيد الحقيقي طويل المدى في الهواء الطلق في مزيج التدريب المسبق لـ YOLO26-Depth، مما يكمل المصادر الداخلية في الغالب. كما أنها معيار KITTI Eigen القياسي للإبلاغ عن دقة العمق في مشاهد القيادة.

تعد KITTI مثالاً رئيسياً على سبب كون رأس العمق غير محدود (وضع log): لا يمكن لسقف إخراج ثابت عند 10 أمتار تمثيل مشاهد قيادة بـ 80 متراً. راجع صفحة مهمة العمق للحصول على تفاصيل حول نطاق إخراج الرأس ومعالجة max_depth.

Link to this sectionالنتائج#

دقة delta1 لـ KITTI Eigen حسب حجم النموذج (كلما زادت كانت أفضل):

النموذجKITTI Eigen δ1
YOLO26n-Depth0.888
YOLO26s-Depth0.882
YOLO26m-Depth0.924
YOLO26l-Depth0.927
YOLO26x-Depth0.939

Link to this sectionYAML مجموعة البيانات#

يستخدم ملف 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الاستخدام#

لتدريب نموذج YOLO26n-Depth على مجموعة بيانات KITTI لمدة 100 دورة تدريبية، يمكنك استخدام مقتطفات الكود التالية. للحصول على قائمة شاملة بالوسائط المتاحة، راجع صفحة التدريب الخاصة بالنموذج.

مثال على التدريب
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 المدربة مسبقاً تلقائياً من إصدار أصول v8.4.0 الخاص بـ Ultralytics عند الإشارة إليها بالاسم لأول مرة:

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، وUhrig et al. لطريقة تكثيف العمق التي تجعل الإشراف الكثيف ممكناً.

المساهمون

التعليقات