Link to this section单目深度估计#
单目深度估计从单张 RGB 图像预测逐像素深度图。每个输出像素包含一个以米为单位的深度值,表示从相机到该表面点的估计距离。
深度模型的输出是一个与输入图像对齐的形状为 (H, W) 的稠密浮点图。这种逐像素表示使得单目深度估计非常适合用于 3D 场景重建、机器人导航、AR/VR 内容创作以及任何需要从单相机获取空间布局的应用。
使用 task=depth 或 yolo depth CLI 任务进行单目深度估计。YOLO26 深度模型文件使用 -depth 后缀,例如 yolo26n-depth.pt。
Link to this section模型#
下表显示了在广泛的多数据集混合(室内 + 室外,约 219 万张图像)上预训练的 YOLO26 深度模型。指标列是在 NYU Depth V2 Eigen 测试集上报告的。
模型在首次使用时会自动从最新的 Ultralytics 发布版本下载。
| 模型 | 尺寸 (像素) | delta1NYU | abs_relNYU | rmseNYU | 参数量 (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| YOLO26n-depth | 768 | 0.882 | 0.109 | 0.414 | 6.4 | 46.9 |
| YOLO26s-depth | 768 | 0.896 | 0.104 | 0.399 | 13.2 | 67.9 |
| YOLO26m-depth | 768 | 0.921 | 0.089 | 0.364 | 23.3 | 130.7 |
| YOLO26l-depth | 768 | 0.930 | 0.083 | 0.351 | 27.7 | 157.2 |
| YOLO26x-depth | 768 | 0.933 | 0.080 | 0.344 | 57.0 | 302.0 |
- delta1NYU 是在 NYU Depth V2 Eigen 测试集(654 张图像)上,使用多尺度 + 水平翻转 TTA 和对数最小二乘对齐后,预测深度与真实值误差在 1.25 倍以内的像素百分比。
- 不使用 TTA 的单尺度精度可通过
yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0(针对每种尺寸替换model=)进行重现,该方法使用中位数(仅缩放)对齐,得分较低:delta1 0.785 (n), 0.786 (s), 0.827 (m), 0.839 (l), 0.843 (x)。 - abs_rel 是预测深度值与真实深度值之间的平均绝对相对误差。
- rmse 是以米为单位的均方根误差。
- params 和 FLOPs 是在 768×768 分辨率(发布权重时的训练分辨率)下测量的。
Link to this section深度范围和对数深度头 (log-depth head)#
深度头预测 exp(logit) —— 无界 (约 0.02–150 米) —— 并将场景形状与绝对尺度解耦:网络预测相对对数深度场,绝对米数由评估时恢复、轻量级校准或微调时的独立双参数变换 (exp(a·log d + b)) 设置。常见的替代方案,即有界的 sigmoid × max_depth 头,会在架构中强制设置固定上限,因此任何超过 max_depth 的深度都会被截断,这阻碍了对长距离场景的训练和预测。
Link to this section为什么深度头需要无界:跨深度范围的证据#
受控 A/B 测试 — 相同数据、相同计划,仅深度头不同。 在完全相同的室内 (≤10 米) 和室外 (≤80 米) 数据混合上从头开始训练两个深度头:
| 检测头 | 输出范围 | 混合范围验证 δ1 | 训练表现 |
|---|---|---|---|
sigmoid × max_depth (10 米) | 有界 0–10 米 | 0.221 | 在第 1 个 epoch 时达到平稳 |
log (无界) | 0–约 150 米 | 0.367 (+66%) | 持续改善 |
有界头无法表示超过 10 米的大部分室外像素,因此几乎立即停止改进;而 log 头能从全范围中学习。
它修复的故障模式 — 单数据集微调,按范围分层。 在单个数据集上微调有界 (10 米) 头时,当数据符合上限时有效,超出上限时则会崩溃:
| 数据集 | 深度范围 | 有界头 δ1 |
|---|---|---|
| SUN RGB-D | ≤10 米 | 0.78 ✅ |
| Hypersim | 大部分 ≤10 米 | 0.74 ✅ |
| KITTI | 约 80 米 | 0.08 ❌ (abs_rel ≈ 7.0 — 80/10 尺度不匹配) |
| vKITTI2 | 80 米 | 0.04 ❌ |
崩溃准确发生在上限边界处。log 头没有这种边界。
已发布模型 — 跨范围性能。 发布的 log-head 系列模型,在跨越 10 米 (NYU, iBims-1) 到 80 米 (KITTI) 的基准测试上进行了评估,使用尺度对齐的 δ1 指标:
| 基准测试 | 范围 | YOLO26x-depth (log) | 之前的有界版本 |
|---|---|---|---|
| NYU Eigen | 10 米 | 0.933 | 0.934 |
| iBims-1 | 10 米 | 0.961 | 0.945 |
| ETH3D | 约 60 米 | 0.959 | 0.931 |
| Make3D | 约 70 米 | 0.302 | 0.296 |
| KITTI Eigen | 80 米 | 0.942 | 0.891 |
| 平均值 | — | 0.819 | 0.799 |
最大的收益体现在更长范围的室外基准测试(KITTI, ETH3D)中——这正是 10 米固定上限影响最大的地方——同时保持了室内性能。
Link to this section训练#
在 Depth8 数据集上以 640 图像尺寸训练 YOLO26n-depth 模型 100 个 epoch。有关可用参数的完整列表,请参阅 Configuration 页面。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.yaml") # build a new model from YAML
model = YOLO("yolo26n-depth.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-depth.yaml").load("yolo26n-depth.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="depth8.yaml", epochs=100, imgsz=640)查看关于 train 模式的完整详细信息,请访问 Train 页面。
Link to this section在你的自定义数据上进行微调#
将预训练深度模型适配到自定义数据集时,请降低学习率并使用 AdamW 优化器。默认优化器设置是针对从头开始训练(使用 lr0=0.01 的 SGD)调整的;应用于已收敛的深度模型时,它们可能会覆盖预训练知识并导致结果下降——特别是在单个领域上微调时。
from ultralytics import YOLO
model = YOLO("yolo26s-depth.pt") # start from pretrained weights
model.train(
data="path/to/your_dataset.yaml",
epochs=20,
imgsz=640,
optimizer="AdamW",
lr0=1e-4, # ~100x below the from-scratch default
warmup_bias_lr=1e-4, # keep warmup gentle too
)额外建议:
- 数据增强由标准参数控制 (
degrees,translate,scale,shear,perspective,flipud,fliplr,hsv_h,hsv_s,hsv_v);几何变换和翻转同样应用于配对的深度图。要查看发布 YOLO26-Depth 权重所使用的确切方案,请检查存储在检查点中的train_args——参阅 Inspecting YOLO26 Checkpoint Training Args。 mosaic,mixup,cutmix和copy_paste未针对深度估计实现。 深度数据集加载器会自动将这些概率设置为 0,因此传递它们不会产生任何影响。不支持这些增强方式是因为它们结合了多个图像,这会产生无效的配对深度图。- 任何深度范围都可以直接使用。
log-head 模型预测无界深度,因此无需更改即可适应短距离(微距)或长距离(室外/驾驶)数据。在数据集 YAML 中设置max_depth:(以米为单位)可限制哪些 GT 像素计入验证指标。 - 保持通用性能。 如果你需要模型在训练集之外的场景中保持准确,请在训练数据中混入一小部分(约 5–10%)多样化的通用图像;这能显著减少微调过程中的遗忘。
- 仅当你的领域非常不同且拥有大数据集时,才从头开始训练 (
model=yolo26s-depth.yaml) —— 此时默认的 SGDlr0=0.01是合适的,因为没有预训练权重需要保留。
Link to this section校准深度尺度#
深度头将形状(相对场景结构)与尺度(绝对米数)分离开来。如果模型在你的场景中已经产生了良好的相对深度,但绝对值对于你的相机不准确,你可以通过 model.calibrate() 在几秒钟内校准尺度——这是针对一小部分标注集进行的双参数对数仿射拟合,无需梯度训练,也无需更改网络权重,因此不会破坏相对结构。
from ultralytics import YOLO
model = YOLO("yolo26s-depth.pt")
# Fit scale on a labeled split (~100+ images is enough), then persist it
model.calibrate(data="path/to/your_dataset.yaml")
model.save("yolo26s-depth-calibrated.pt")校准需要真实深度来进行拟合,因此它是在标注集上运行的——这不能在盲推理中完成。当相对深度已经很好,仅尺度/范围错误时使用它;如果你的领域需要更改相对结构本身,请改用 微调。
训练会自动为你完成此操作:在 model.train(...) 完成后,最佳和最后检查点会在验证集上进行校准,以便它们开箱即用输出具有度量标尺的深度。
已发布的 yolo26*-depth.pt 检查点已经内置了此校准,是基于预训练验证混合集拟合的。这是一个跨所有领域的单一全局尺度,因此为了在特定相机或场景类型上获得最准确的绝对深度,请在你自己的小规模标注集上运行 model.calibrate()——它会替换内置的拟合参数。
Link to this section数据集格式#
深度估计数据集将每个 RGB 图像与相应的深度文件配对。深度目标存储为包含以米为单位的 float32 值的 .npy 数组。数据集 YAML 指向一个 images/ 目录;加载器通过将 images 部分替换为 depth 并将图像扩展名替换为 .npy 来派生深度文件路径。
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/例如,位于 images/train/scene_001.jpg 的图像与位于 depth/train/scene_001.npy 的深度图配对。请参阅 Depth Estimation Dataset Guide 获取完整格式规范。
Link to this section验证#
在深度估计数据集上验证已训练 YOLO26n-depth 模型的 accuracy。请显式传递 data,以便验证使用预期的数据集 YAML。发布的权重是在 imgsz=768 下训练的,因此请在该尺寸下进行验证和预测以获得最佳精度。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="nyu-depth.yaml")
metrics.delta1 # percentage of pixels within threshold δ=1.25
metrics.abs_rel # mean absolute relative error
metrics.rmse # root mean squared error (meters)
metrics.silog # scale-invariant logarithmic errorLink to this section预测#
使用已训练的 YOLO26n-depth 模型对图像进行预测。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# Access the results
for result in results:
depth_map = result.depth.data.cpu().numpy() # torch.Tensor -> NumPy float32, shape (H, W), metersSee full predict mode details in the Predict page.
Link to this section结果输出#
YOLO 深度估计为每张图像返回一个 Results 对象。每个结果存储一张完整的稠密浮点深度图。
| 属性 | 类型 | 形状 | 描述 |
|---|---|---|---|
result.depth | DepthMap | (H,W) | 逐像素的稠密深度图。 |
result.depth.data | torch.Tensor | (H,W) | 以米为单位的深度值;调用 .cpu().numpy() 获取 NumPy 数组。 |
result.boxes | - | - | 无实例框。 |
result.masks | - | - | 无实例掩膜。 |
关于各项任务中特定于任务的 Results 字段,请参阅按任务划分的预测结果 (Predict Results by Task) 部分。
Link to this section导出#
将 YOLO26n-depth 模型导出为 ONNX、CoreML 等其他格式。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Export the model
model.export(format="onnx")下表列出了可用的 YOLO26 深度估计导出格式。你可以使用 format 参数导出为任何格式,例如 format='onnx' 或 format='engine'。你可以直接在导出的模型上进行预测或验证,例如 yolo predict model=yolo26n-depth.onnx。导出完成后,将显示模型的使用示例。
| 格式 | format 参数 | 模型 | 元数据 | 参数 |
|---|---|---|---|---|
| PyTorch | - | yolo26n-depth.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-depth.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-depth.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-depth_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-depth.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-depth.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n-depth_saved_model/ | ✅ | imgsz, keras, quantize, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-depth.pb | ❌ | imgsz, batch, device |
| TF Edge TPU | edgetpu | yolo26n-depth_edgetpu.tflite | ✅ | imgsz, quantize, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-depth_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-depth.mnn | ✅ | imgsz, batch, dynamic, quantize, nms, device |
| NCNN | ncnn | yolo26n-depth_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-depth_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-depth_rknn_model/ | ✅ | imgsz, batch, name, quantize, data, fraction, device |
| ExecuTorch | executorch | yolo26n-depth_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-depth_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-depth_deepx_model/ | ✅ | imgsz, quantize, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-depth_qnn.onnx | ✅ | imgsz, batch, name, quantize, data, fraction, device |
| LiteRT | litert | yolo26n-depth.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n-depth_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
查看关于 export 的完整详细信息,请访问 Export 页面。
Link to this section常见问题解答#
Link to this section如何训练一个用于自定义数据集的 YOLO26 深度估计模型?#
准备配对的 RGB 图像和 .npy 深度文件,然后创建一个指向你 images/ 目录的数据集 YAML 文件。加载器会自动将路径中的 images 替换为 depth 并将图像扩展名替换为 .npy 来查找深度文件。
从预训练权重开始,并结合 AdamW 使用较小的学习率,以便微调过程能够保留模型已有的知识(查看 在自定义数据上进行微调 了解原因):
from ultralytics import YOLO
# Load a pretrained YOLO26 depth model
model = YOLO("yolo26s-depth.pt")
# Fine-tune on a custom depth dataset
results = model.train(
data="path/to/your_dataset.yaml",
epochs=20,
imgsz=640,
optimizer="AdamW",
lr0=1e-4,
warmup_bias_lr=1e-4,
)查看配置页面以了解更多可用参数。
Link to this sectionYOLO26 深度估计会报告哪些指标?#
深度估计验证会报告 Depth Anything 及相关单目深度任务所使用的指标集:
- delta1 / delta2 / delta3 — 预测深度与真实深度(或其倒数)的比值小于 1.25、1.25² 和 1.25³ 的像素百分比。数值越高越好。
- abs_rel — 平均绝对相对误差。数值越低越好。
- rmse — 以米为单位的均方根误差。数值越低越好。
- silog — 尺度不变对数误差。数值越低越好。
每个预测结果在每张图像中都会与其实际真值进行中值对齐,然后统计数据会汇集到验证集中的每一个有效像素点(拥有更多有效深度像素的图像权重占比更高)。如果某些论文选择对每张图像的指标求平均值,那么在相同预测结果下可能会报告略有不同的数值。
Link to this section深度图的输出格式是什么?#
深度图以 torch.Tensor 形式存储,形状为 (H, W),其中每个值代表以米为单位的预测深度(请使用 result.depth.data.cpu().numpy() 获取 NumPy float32 数组)。在运行预测后,可以通过 result.depth.data 访问它。深度图与输入图像的分辨率对齐。
Link to this section深度估计支持哪些数据集?#
Ultralytics YOLO26 为多种深度估计数据集提供了内置的 YAML 配置,包括 NYU Depth V2、KITTI、Hypersim、SUN RGB-D 和 ARKitScenes。有关完整列表和格式详细信息,请参阅 深度估计数据集指南。
Link to this section如何验证预训练的 YOLO26 深度估计模型?#
通过提供用于评估的数据集 YAML 文件来验证预训练的 YOLO26 深度模型:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Validate the model
metrics = model.val(data="nyu-depth.yaml")
print("delta1:", metrics.delta1)
print("abs_rel:", metrics.abs_rel)
print("rmse:", metrics.rmse)Link to this section如何将 YOLO26 深度估计模型导出为 ONNX 格式?#
使用 Python 或 CLI 将 YOLO26 深度模型导出为 ONNX:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Export the model to ONNX format
model.export(format="onnx")有关导出为各种格式的更多详细信息,请参阅导出页面。