Ultralytics YOLO26 中的 NYU Depth V2 数据集:单目深度估计标准评测基准完全解析
本文围绕 Ultralytics 仓库中的 NYU Depth V2 数据集文档 展开,系统讲解这一单目深度估计(monocular depth estimation)室内标准基准的构成、在 YOLO26-Depth 系列中的角色、配套数据集 YAML 的完整字段含义,以及如何用官方 API 在其 Eigen 测试集上完成验证。结合 验证器实现、深度指标实现 与 数据加载工具 的源码,你将理解 delta1 等指标的确切计算方式、规模对齐(scale alignment)策略,以及仓库对 uint16 毫米深度 PNG 的解析约定,从而能够独立复现并深入理解 YOLO26-Depth 的官方评测结果。
数据集概述:NYU Depth V2 是什么
NYU Depth V2 是单目深度估计领域最经典的室内基准之一。它由微软 Kinect v1 RGB-D 传感器录制,覆盖家庭、办公室、教室等多种真实室内场景的 RGB-D 视频序列。根据 官方文档 的归纳,其关键特征如下:
- 使用 Microsoft Kinect v1 RGB-D 传感器采集;
- 覆盖大量真实室内场景(住宅、办公室、教室等);
- 深度范围约 10 m 以内,符合消费级室内 RGB-D 采集的典型上限;
- 评测采用标准的 Eigen 测试划分(654 张图像);
- 是报告单目深度估计精度的主要基准。
从配套的 数据集配置文件 头部注释可以进一步确认其规模与格式:训练集 795 张、验证集 654 张(Eigen test split),图像分辨率 480×640,深度单位为米,打包下载后约 1.5 GB。
在 YOLO26-Depth 中的角色:零样本评测基准
NYU Depth V2 是 YOLO26-Depth 系列的主要零样本(zero-shot)评测基准,深度任务页面 上报告的核心指标即出自该数据集。有几点关键事实需要明确:
- 模型未在该数据集上训练。尽管 NYU 包含 train 划分,仓库将其保留未用,只报告 held-out 测试结果——这保证了 delta1 等数字反映的是模型的零样本泛化能力,而非拟合结果;
- 官方数字使用测试时增强(TTA)。评测时采用多尺度推理加水平翻转 TTA,并在计算指标前对预测深度图与真实深度图做对数最小二乘(log-least-squares)尺度对齐;
- 若用仓库内置的验证流程复现(
yolo depth val),由于采用的是中位数尺度对齐且不带 TTA,delta1 会略低。深度任务文档 给出了可直接复现的单尺度数字:delta1 分别为 0.783(n)、0.793(s)、0.840(m)、0.853(l)、0.860(x),命令为yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0(imgsz=768是发布权重的训练分辨率)。
NYU Depth V2 Eigen 测试集上的官方结果
下表报告各模型规模在 NYU Depth V2 Eigen test split 上的 delta1 精度(预测深度落在 1.25× 阈值内的像素占比,越高越好):
| 模型 | delta1 |
|---|---|
| YOLO26n-depth | 0.882 |
| YOLO26s-depth | 0.855 |
| YOLO26m-depth | 0.919 |
| YOLO26l-depth | 0.927 |
| YOLO26x-depth | 0.923 |
可以注意到 m/l/x 三个规格已进入非常接近的区间,其中 l 规格在带 TTA 的官方协议下 delta1 最高(0.927);而 n 规格(0.882)虽体量最小,仍接近 m 规格,体现了该系列在精度-资源权衡上的梯度设计。
数据集 YAML 配置深度解析
Ultralytics 使用 YAML 文件定义数据集配置。nyu-depth.yaml 的完整内容如下:
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# NYU Depth V2 dataset for monocular depth estimation
# Documentation: https://cs.nyu.edu/~fergus/datasets/nyu_depth_v2.html
# 795 train + 654 val (Eigen test split) images, 480x640, indoor scenes, depth in meters
# Example usage: yolo depth train data=nyu-depth.yaml model=yolo26n-depth.pt
# parent
# ├── ultralytics
# └── datasets
# └── nyu-depth-png ← downloads here (≈1.5 GB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: nyu-depth-png # dataset root dir (relative to Ultralytics settings 'datasets_dir')
train: images/train # train images (relative to 'path') 795 images
val: images/val # val images (relative to 'path') 654 images
# Depth maps are paired uint16 millimeter PNGs under depth/<split>/, resolved by
# swapping '/images/' -> '/depth/' on each image path.
# Classes
nc: 1
names:
0: depth
channels: 3
depth_scale: 1000
# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/nyu-depth-png.zip
结合仓库源码,各字段的实际作用如下:
path: nyu-depth-png:数据集根目录名,相对于 Ultralytics 设置中的datasets_dir。首次使用时会按download字段自动下载并解压到该目录;train/val:图像目录相对于path的路径,分别对应 795 张训练图与 654 张验证图(Eigen test split);- 深度图路径约定:YAML 注释明确"深度图是与图像配对的 uint16 毫米 PNG,位于
depth/<split>/下,通过将每个图像路径中的/images/替换为/depth/解析得到"。从源码结构看,BaseDataset 会为每张图像构建depth_files_by_image映射(见 dataset.py#L467-L512),实现与上述路径替换一致; nc: 1与names: {0: depth}:深度任务把"深度"视为单一语义通道,沿用检测/语义分割任务同一套类注册结构;channels: 3:输入为 RGB 三通道图像;depth_scale: 1000:深度 PNG 的量化比例。源码中默认常量DEPTH_PNG_SCALE = 1000(见 utils.py#L63),即 uint16 像素值存储的是毫米,读取时除以 1000 得到米制深度,像素值 0 表示无效深度。load_depth函数(utils.py#L84)负责该换算,训练与验证的 DataLoader 均通过depth_scale参数驱动这一过程;download:可选的自动下载源,指向 Ultralytics assets 仓库打包好的nyu-depth-png.zip(约 1.5 GB)。
验证与评测:从 API 到指标计算
官方验证命令
在 NYU Depth V2 基准上评估 YOLO26-Depth 模型,官方文档给出两种等价方式:
# Python
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26x-depth.pt") # load a pretrained depth model
# Evaluate on the NYU Depth V2 benchmark
results = model.val(data="nyu-depth.yaml")
# CLI
# Evaluate a pretrained *.pt model
yolo depth val data=nyu-depth.yaml model=yolo26x-depth.pt
完整的验证参数列表可参考 Validation 文档。
DepthValidator:深度任务的验证器
DepthValidator 继承自 DetectionValidator,但针对稠密预测任务做了三处关键定制:
- 无 NMS:
postprocess直接返回预测结果(深度图无需非极大值抑制); - 分辨率对齐:
update_metrics中若预测图与真值尺寸不一致,会双线性插值到真值分辨率再计算指标(val.py#L51-L60); - 指标初始化:
init_metrics用数据集 YAML 的max_depth(缺省 100.0 m)构造DepthMetrics(val.py#L36-L39)。
DDP 场景下,gather_stats 会用 all_reduce 把各 rank 的分片累加器汇总到 rank 0,保证多卡验证时指标覆盖完整验证集而非单个分片;print_results 则以检测风格的对齐表格输出 delta1, abs_rel, rmse, silog 四列指标(行标签为 depth_val)。验证过程中的预测结果会以深度热力图叠加形式保存为 val_batch{ni}_pred.jpg。
DepthMetrics:Eigen 协议下的六项指标
核心指标实现位于 DepthMetrics。其 update_stats 的逐图流程与文档描述的评测协议严格对应:
- 有效像素掩码(Eigen 协议):只统计真值深度落在
(min_depth, max_depth)开区间内的像素,默认min_depth=0.001m、max_depth=100.0m(可在 YAML 中以max_depth覆盖); - 有效像素下限:有效真值像素少于 10 个的图像整张跳过(沿用 Depth Anything V2 的同类下限),避免用极少像素做尺度对齐产生无意义结果;
- 尺度对齐:
align="median"时用median(gt)/median(pred)对每张图做尺度缩放(中位数即"仅尺度"对齐);文档中提到的 log-least-squares 对齐则属于发布指标所用的 TTA 评测协议; - 非有限值处理:NaN/Inf 预测按深度上下界填充并钳制到
[min_depth, max_depth],而不是把整张图从平均中隐藏; - 逐图定稿、按图平均:每张图先算出六项指标,再以 float64 累加、最后除以图像数,使每张图权重相同,与 Depth Anything V2、Monodepth2 的按样本平均口径一致。
六项指标及含义(源码 keys 属性):
| 指标 | 定义 |
|---|---|
delta1 |
满足 max(p/g, g/p) < 1.25 的像素占比(论文主报指标,也是 fitness) |
delta2 |
满足 max(p/g, g/p) < 1.25² 的像素占比 |
delta3 |
满足 max(p/g, g/p) < 1.25³ 的像素占比 |
abs_rel |
平均绝对相对误差 `mean( |
rmse |
根均方误差(米) |
silog |
尺度不变对数误差(λ=1 方差形式,ZoeDepth/KITTI 口径,×100) |
终端输出即为 DepthValidator 的 print_results 表格:Class | Images | delta1 | abs_rel | rmse | silog。
预训练模型与训练用法
YOLO26 深度家族(yolo26n/s/m/l/x-depth)在 NYU Depth V2 上按零样本方式评测,模型权重从最新的 Ultralytics release 自动下载(例如 YOLO26x-depth 自 v8.4.0 起可用),覆盖从小到大的多种规格以适应不同精度与资源需求。
nyu-depth.yaml 头部注释同时给出了训练示例:yolo depth train data=nyu-depth.yaml model=yolo26n-depth.pt。从源码看,DepthTrainer 在训练结束后会执行一步尺度校准:在验证集上拟合 log-affine 的 scale-only 参数(cal_a/cal_b)并写回 best.pt/last.pt,使模型开箱即输出米制缩放的深度,可选地生成 val_batch{ni}_calibrated.jpg 四联对比图(RGB | GT | raw | calibrated)。此外训练阶段还会绘制训练集真值深度分布直方图 labels.jpg(均值/中位数/标准差标注),用于快速检查深度数据的有效范围。
引用与致谢
若在研究或开发工作中使用了 NYU Depth V2 数据集,请引用以下论文:
@inproceedings{silberman2012indoor,
title={Indoor Segmentation and Support Inference from RGBD Images},
author={Silberman, Nathan and Hoiem, Derek and Kohli, Pushmeet and Fergus, Rob},
booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
year={2012}
}
小结
- NYU Depth V2 是 YOLO26-Depth 的主要零样本评测基准:官方模型不在其 train 划分上训练,654 张 Eigen 测试图全程 held-out;
- 仓库通过 nyu-depth.yaml 将 795 训练 + 654 验证图封装为开箱即用的配置,uint16 毫米 PNG 深度经
depth_scale: 1000换算为米; - 验证链路由 DepthValidator 与 DepthMetrics 构成,完整实现 Eigen 协议(有效深度区间掩码、逐图中位数对齐、按图平均),输出 delta1/abs_rel/rmse/silog 等标准指标;
- 复现提示:带 TTA + log-least-squares 对齐的官方 delta1(最高 0.927)与仓库内置验证命令的单尺度数字(最高 0.860)口径不同,对比结果时应先确认所用评测协议。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00