Ultralytics YOLO27:

Bộ dữ liệu độ sâu KITTI#

Bộ dữ liệu KITTI là một benchmark lái xe tự động ngoài đời thực được ghi lại từ một phương tiện di chuyển trong và xung quanh thành phố Karlsruhe. Đối với tác vụ ước lượng chiều sâu đơn mắt, chiều sâu ground-truth được lấy từ máy quét Velodyne HDL-64 LiDAR và được làm dày bằng phương pháp của Uhrig et al. 2017. Các bản đồ chiều sâu thu được vẫn thưa thớt, với khoảng 16–20% điểm ảnh mang giá trị chiều sâu hợp lệ. KITTI là nguồn dữ liệu lái xe ngoài trời thực tế trong tập trộn tiền huấn luyện YOLO26-Depth và đồng thời đóng vai trò là benchmark đánh giá KITTI Eigen.

Tính năng chính#

  • Các cảnh lái xe ngoài trời trong thế giới thực với độ sâu lên đến khoảng 80 m, vượt xa đáng kể phạm vi trong nhà điển hình.
  • Ground truth độ sâu thu được từ LiDAR Velodyne HDL-64 và được làm dày đặc bằng phương pháp Sparsity Invariant CNNs của Uhrig và cộng sự, 2017.
  • Giám sát thưa: chỉ khoảng 16–20% pixel trong mỗi ảnh chứa giá trị độ sâu hợp lệ; các pixel không hợp lệ được mask khỏi loss và metrics.
  • Các cặp ảnh stereo (ảnh trái image_02 và ảnh phải image_03) cung cấp thêm các góc nhìn để training.
  • Các giá trị độ sâu được lưu dưới dạng PNG uint16 với 256 đơn vị trên mỗi mét (depth_scale: 256), tuân theo định dạng bộ dữ liệu độ sâu của Ultralytics.

Cấu trúc bộ dữ liệu#

Dữ liệu độ sâu KITTI được Ultralytics sử dụng được chia thành hai subset:

  1. Tập training: 55.198 ảnh (ảnh trái image_02 và ảnh phải image_03). Toàn bộ 28 lượt lái thử KITTI Eigen được loại khỏi training để đảm bảo việc đánh giá công bằng.
  2. Tập evaluation: tập test KITTI Eigen — gồm 652 frame từ camera trái có ground truth được cải thiện. Evaluation sử dụng giới hạn độ sâu 80 m và phép căn chỉnh median (chỉ theo scale) giữa prediction và ground truth.

Phạm vi độ sâu đạt khoảng 80 m, và YAML của bộ dữ liệu (depth-kitti.yaml) được thiết lập max_depth: 80 tương ứng.

Vai trò trong YOLO26-Depth#

KITTI cung cấp dữ liệu giám sát lái xe ngoài trời thực tế trong tập trộn tiền huấn luyện YOLO26-Depth, bổ sung cho các nguồn dữ liệu chủ yếu trong nhà. KITTI cũng là benchmark KITTI Eigen tiêu chuẩn để báo cáo độ chính xác chiều sâu cảnh lái xe.

KITTI là một ví dụ quan trọng cho thấy vì sao depth head là không bị giới hạn (log mode): trần đầu ra cố định 10 m không thể biểu diễn các cảnh lái xe ở khoảng cách 80 m. Xem trang tác vụ depth để biết chi tiết về phạm vi đầu ra của head và cách xử lý max_depth.

Kết quả#

Độ chính xác KITTI Eigen delta1 theo kích thước model (cao hơn là tốt hơn):

ModelKITTI Eigen δ1
YOLO26n-Depth0.878
YOLO26s-Depth0.879
YOLO26m-Depth0.913
YOLO26l-Depth0.926
YOLO26x-Depth0.932

Được đo trên tập chia chuẩn 652 khung hình với imgsz=768rect=False. Chúng không thể so sánh trực tiếp với các số liệu KITTI đã công bố: tập val kéo dãn mỗi hình ảnh thành một hình vuông imgsz và lấy mẫu lại theo hàng xóm gần nhất đối với ground-truth thưa thớt, trong khi các bộ đánh giá tham chiếu thay vào đó thay đổi kích thước dự đoán trở lại độ phân giải ground-truth gốc; DepthMetrics che ground-truth dựa trên max_depth trong khi giao thức ground-truth được cải thiện che gt > 0 và chỉ giới hạn giá trị dự đoán; và các trọng số được phát hành được huấn luyện với tập chia trước đó, đặt 72 trong số các khung hình kiểm tra này vào tập huấn luyện.

YAML của bộ dữ liệu#

Một tệp YAML được sử dụng để định nghĩa cấu hình bộ dữ liệu. Tệp YAML chứa thông tin về các đường dẫn, các lớp và các thông tin liên quan khác của bộ dữ liệu như chiều sâu tối đa.

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, ~140 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-kitti dir and re-run to rebuild it.
# The download only runs when the val images are missing (train is never checked), so a depth-kitti dir
# built before this split fix keeps the old split until it is deleted and rebuilt.

path: depth-kitti # dataset root dir (relative to Ultralytics settings 'datasets_dir')
train: images/train # train images (relative to 'path') 55198 images
val: images/val # val images (relative to 'path') 652 images (KITTI Eigen test split, left camera)
max_depth: 80 # (m) maximum valid depth; GT beyond this is excluded from val metrics

nc: 1
names:
  0: depth

channels: 3
depth_scale: 256 # KITTI PNG value 256 = 1 meter

# Download script/URL (optional)
download: |
  import shutil
  from pathlib import Path

  from ultralytics.utils import TQDM
  from ultralytics.utils.downloads import download

  # The 28 KITTI Eigen test scenes as "<drive> <frame indices>" -> val; every other annotated drive -> train. val is
  # the 697-frame Eigen et al. (NeurIPS 2014) test split restricted to frames with improved GT here: 652 left-camera.
  EIGEN_TEST = """
  2011_09_26_drive_0002 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 69
  2011_09_26_drive_0009 16 32 48 64 80 96 112 128 144 160 176 196 212 228 244 260 276 292 308 324 340 356 372 388
  2011_09_26_drive_0013 5 10 20 30 35 40 45 50 60 65 70 80 85 90 95 100 105 110 115 120 125 130 135
  2011_09_26_drive_0020 6 9 12 15 18 21 27 33 36 42 45 48 51 54 57 60 63 66 69 72 75 78
  2011_09_26_drive_0023 18 36 54 72 90 108 126 144 162 180 198 216 252 270 288 306 324 342 360 378 396 414 432 450 468
  2011_09_26_drive_0027 7 14 21 28 35 42 49 56 63 70 77 84 91 98 112 119 126 133 140 147 161 168 175 182
  2011_09_26_drive_0029 14 28 42 56 70 84 98 112 126 140 154 168 182 196 268 296 310 324 338 352 366 380 394 408
  2011_09_26_drive_0036 32 64 96 128 160 192 224 256 288 320 352 384 416 448 480 512 544 576 608 640 672 704 768
  2011_09_26_drive_0046 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115
  2011_09_26_drive_0048 5 6 7 8 9 10 11 12 13 14 15 16
  2011_09_26_drive_0052 6 8 10 12 14 16 18 20 22 26 28 30 32 36 38 40 42 44 46 48 50 52
  2011_09_26_drive_0056 11 22 33 44 55 66 77 88 99 110 121 143 154 165 176 187 198 209 220 231 242 253 264 275 286
  2011_09_26_drive_0059 14 28 42 56 70 84 98 112 126 140 154 182 196 210 224 238 274 288 302 316 330 344 358
  2011_09_26_drive_0064 22 44 66 88 110 154 176 198 220 242 264 286 308 330 352 374 396 418 440 462 484 506 528 550
  2011_09_26_drive_0084 49 62 75 88 101 114 127 140 153 179 192 205 218 231 244 257 270 283 296 309 322 335 348 361 374
  2011_09_26_drive_0086 7 34 61 88 115 142 169 196 223 250 277 304 331 358 385 412 439 466 493 520 574 601 628 655 682
  2011_09_26_drive_0093 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 256 305 321 337 353 369 385 401 417
  2011_09_26_drive_0096 19 38 57 76 95 114 133 152 171 190 209 228 247 266 285 304 323 342 361 380 399 418 437 456
  2011_09_26_drive_0101 80 114 148 182 216 284 318 352 386 420 454 488 522 556 590 624 658 692 726 760 794 828 862 896 930
  2011_09_26_drive_0106 15 35 43 51 59 67 75 83 91 99 107 115 123 131 139 147 155 163 171 179 187 195 203 211 219
  2011_09_26_drive_0117 26 52 78 104 130 156 182 208 234 260 286 312 338 364 390 416 442 468 494 546 572 598 624 650
  2011_09_28_drive_0002 6 9 12 18 21 24 30 33 36 39 45 48 51 54 57 60 63 72 78 81 84 87 90
  2011_09_29_drive_0071 36 72 108 144 180 216 252 288 324 360 396 432 468 504 540 576 612 735 771 807 879 915 951
  2011_09_30_drive_0016 11 22 33 44 55 66 77 88 110 121 132 143 154 165 176 187 198 209 220 231 242 253 264
  2011_09_30_drive_0018 107 214 428 535 642 749 856 963 1070 1177 1284 1391 1498 1605 1712 1819 1926 2033 2140 2247 2419 2526 2633 2740
  2011_09_30_drive_0027 41 82 123 164 205 246 287 328 369 410 451 492 533 574 615 656 753 794 835 876 917 958 1040 1081
  2011_10_03_drive_0027 181 362 543 734 915 1096 1277 1458 1639 1820 2001 2363 2544 2725 2906 3087 3268 3449 3630 3811 3992 4173 4354 4535
  2011_10_03_drive_0047 32 64 96 128 160 192 224 288 320 352 384 416 448 480 512 544 576 608 640 672 704 736 768 800"""
  EIGEN_TEST = {ln.split()[0]: {int(i) for i in ln.split()[1:]} for ln in EIGEN_TEST.strip().splitlines()}
  # 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 EIGEN_TEST else "train"
      # val is the canonical Eigen test split: left camera only, and only its 652 listed frames
      for cam in ("image_02",) if split == "val" else ("image_02", "image_03"):
          for png in sorted((gt / "proj_depth" / "groundtruth" / cam).glob("*.png")):
              if split == "val" and int(png.stem) not in EIGEN_TEST[drive]:
                  continue
              name = f"{drive}_{cam[-2:]}_{png.stem}"
              png.replace(dir / "depth" / split / f"{name}.png")
              raw = dir / "source" / "raw" / drive[:10] / gt.name / cam / "data" / png.name
              raw.replace(dir / "images" / split / f"{name}.png")
  shutil.rmtree(dir / "source")

Cách sử dụng#

Để training model YOLO26n-Depth trên bộ dữ liệu KITTI trong 100 epoch, bạn có thể sử dụng các đoạn code sau. Để xem danh sách đầy đủ các argument khả dụng, hãy tham khảo trang Training model.

Ví dụ huấn luyện
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)

Các model đã tiền huấn luyện#

Các model YOLO26-Depth pretrained sẽ tự động tải xuống từ bản phát hành assets v8.4.0 của Ultralytics khi được tham chiếu lần đầu theo tên:

Trích dẫn và ghi nhận đóng góp#

Nếu sử dụng bộ dữ liệu KITTI trong công việc nghiên cứu hoặc phát triển, vui lòng trích dẫn các bài báo sau:

Trích dẫn
@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}
}

Chúng tôi xin ghi nhận Karlsruhe Institute of Technology và Toyota Technological Institute at Chicago vì đã tạo và duy trì bộ dữ liệu KITTI, cũng như Uhrig và cộng sự vì phương pháp làm dày đặc độ sâu giúp khả thi việc supervision dày đặc.

FAQ#

  • KITTI là nguồn dữ liệu lái xe ngoài trời thực tế trong tập trộn tiền huấn luyện YOLO26-Depth và đồng thời đóng vai trò là benchmark đánh giá KITTI Eigen. Chiều sâu Velodyne LiDAR của KITTI đạt khoảng 80 m, đó là lý do tại sao đầu ra chiều sâu là không giới hạn thay vì bị giới hạn ở một khoảng trong nhà cố định.

  • Cấu hình Ultralytics sử dụng 55.198 hình ảnh huấn luyện từ camera trái và phải, loại trừ toàn bộ 28 lượt lái thử KITTI Eigen, và đánh giá trên 652 khung hình kiểm tra Eigen camera trái với ground-truth được cải thiện. Các tệp PNG chiều sâu sử dụng 256 đơn vị trên mỗi mét (depth_scale: 256) và tệp YAML thiết lập max_depth: 80.

  • Chạy yolo depth train data=depth-kitti.yaml model=yolo26n-depth.pt epochs=100 imgsz=640, hoặc sử dụng ví dụ Python trong phần Sử Dụng. Trang Huấn Luyện liệt kê mọi đối số có sẵn.

  • Các giá trị trong phần Kết quả đến từ trình xác thực Ultralytics với imgsz=768rect=False, thực hiện thay đổi kích thước hình ảnh thành đầu vào hình vuông, che ground-truth dựa trên max_depth, và tính toán các chỉ số cho mỗi hình ảnh với việc căn chỉnh tỷ lệ trên mỗi hình ảnh trước khi tính trung bình trên tập xác thực. Các bộ đánh giá KITTI tham chiếu sử dụng một giao thức khác, vì vậy các số liệu không thể so sánh trực tiếp.

Những người đóng góp

Bình luận