云计算百科
云计算领域专业知识百科平台

YOLO26 单目深度估计使用指南

本文档基于 Ultralytics YOLO26 官方文档整理,专注于单目深度估计 的完整使用方法,包括推理、可视化、校准和常见问题处理。


目录

  • 概述
  • 环境准备
  • 支持的深度模型
  • 基本推理
  • 深度图输出格式
  • 深度可视化
  • 深度校准
  • 完整代码示例
  • 参数速查表
  • 常见问题排查

概述

YOLO26 深度估计模型使用 log-depth head(无界对数深度头) 架构,从单张 RGB 图像中预测逐像素的稠密深度图。

核心特性

  • 单目深度估计:仅需一张 RGB 图像即可推断场景深度
  • 对数深度输出:网络预测相对对数深度场,输出范围约 0.02 ~ 150 米,无固定上限
  • 米制单位:深度值以米为单位,通过校准或微调获得绝对尺度
  • 多种尺寸:提供 n / s / m / l / x 五种模型,覆盖从实时推理到高精度需求

环境准备

安装 Ultralytics

pip install ultralytics

NumPy 版本兼容性

如果运行代码时遇到以下错误:

RuntimeError: Numpy is not available
_ARRAY_API not found

说明你的 PyTorch 版本与 NumPy 2.x 不兼容,需要降级 NumPy:

pip install "numpy<2"

或者升级 PyTorch 到支持 NumPy 2.x 的版本:

pip install –upgrade torch torchvision torchaudio

验证安装

from ultralytics import YOLO
print("Ultralytics 安装成功")


支持的深度模型

模型参数量速度适用场景
yolo26n-depth.pt 最小 最快 实时推理、边缘设备
yolo26s-depth.pt 较小 较快 平衡精度与速度
yolo26m-depth.pt 中等 中等 通用场景
yolo26l-depth.pt 较大 较慢 高精度需求
yolo26x-depth.pt 最大 最慢 最高精度需求

首次运行时会自动下载对应的权重文件。


基本推理

图像深度估计

from ultralytics import YOLO

# 加载深度估计模型
model = YOLO("yolo26n-depth.pt")

# 对单张图像进行深度估计
results = model("image.jpg")

视频深度估计

results = model("video.mp4")

摄像头实时深度估计

results = model(0) # 0 为摄像头索引

批量推理

results = model(["image1.jpg", "image2.jpg", "image3.jpg"])


深度图输出格式

推理结果中的深度信息存储在 result.depth 属性中:

属性类型形状描述
result.depth DepthMap (H, W) 逐像素稠密深度图
result.depth.data torch.Tensor (H, W) 深度值,单位:米

获取 NumPy 深度数据

depth = result.depth.data.cpu().numpy() # shape (H, W), float32, 单位:米

深度值特性

YOLO26 深度模型使用 log-depth head,具有以下特点:

  • 输出范围约 0.02 ~ 150 米,无固定上限
  • 网络预测的是相对对数深度场,绝对米数通过校准或微调设定
  • 深度值可能跨越多个数量级,直接 min-max 归一化到 0-255 会丢失远距信息

深度可视化

Ultralytics 提供了内置的 colorize_depth 函数,推荐使用该函数进行深度图可视化,而非手动归一化。

导入方式

from ultralytics.utils.plotting import colorize_depth

模式一:自动范围着色(disparity 模式,默认)

使用逆深度归一化,将深度映射到第 2 和第 98 百分位之间:

depth = result.depth.data.cpu().numpy()
colored = colorize_depth(depth, cmap="spectral")
cv2.imwrite("depth_colored.png", colored)

模式二:固定范围着色(metric 模式)

在指定的 vmin / vmax 范围内线性归一化,颜色含义跨帧一致:

colored = colorize_depth(depth, vmin=0.0, vmax=20.0, cmap="inferno", mode="metric")
cv2.imwrite("depth_metric.png", colored)

模式三:与输入图像混合叠加

最简单的方式,一行代码实现深度与 RGB 图像的混合叠加:

result.save("depth_overlay.png")

colorize_depth 参数说明

参数默认值说明
cmap jet 色彩映射:jet / inferno / spectral
mode disparity disparity:逆深度归一化到第 2/98 百分位;metric:在 vmin/vmax 间线性归一化
vmin None 最小深度值(仅 metric 模式)
vmax None 最大深度值(仅 metric 模式)

色彩映射选择建议

色彩映射适用场景视觉效果
jet 通用可视化 蓝→绿→红,对比强烈
inferno 学术论文、演示 紫→橙→黄,色盲友好
spectral 多尺度场景 彩虹色系,区分度高

深度校准

如果你的场景深度绝对值不准确,可以使用 model.calibrate() 进行尺度校准。校准不需要修改网络权重,只需提供带标签的数据集。

校准流程

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26s-depth.pt")

# 使用带深度标签的数据集进行校准
model.calibrate(data="path/to/your_dataset.yaml")

# 保存校准后的模型
model.save("yolo26s-depth-calibrated.pt")

使用校准后的模型

model = YOLO("yolo26s-depth-calibrated.pt")
results = model("image.jpg")


完整代码示例

示例一:基础深度可视化

import cv2
import numpy as np
from ultralytics import YOLO
from ultralytics.utils.plotting import colorize_depth

# 加载模型
model = YOLO("yolo26n-depth.pt")

# 推理
results = model("https://ultralytics.com/images/bus.jpg")

for result in results:
# 获取深度图 (H, W), float32, 单位:米
depth = result.depth.data.cpu().numpy()

# 1. 保存原始深度图(uint16 PNG,毫米精度)
depth_uint16 = (depth * 1000).astype(np.uint16)
cv2.imwrite("depth_map_raw.png", depth_uint16)

# 2. 彩色深度图(disparity 模式,自动范围)
cv2.imwrite("depth_colored.png", colorize_depth(depth, cmap="spectral"))

# 3. 固定范围彩色图(0~20 米,颜色跨帧一致)
cv2.imwrite("depth_metric.png", colorize_depth(depth, vmin=0.0, vmax=20.0, cmap="inferno", mode="metric"))

# 4. 与输入图像混合叠加
result.save("depth_overlay.png")

print(f"深度图尺寸: {depth.shape}")
print(f"深度范围: {depth.min():.2f}m ~ {depth.max():.2f}m")

原图在这里插入图片描述 深度图 在这里插入图片描述 彩色深度图 在这里插入图片描述 固定范围彩色图 在这里插入图片描述 输入图像混合叠加图· 在这里插入图片描述

示例二:视频深度估计

import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import colorize_depth

model = YOLO("yolo26n-depth.pt")
cap = cv2.VideoCapture("video.mp4")

# 获取视频属性
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

out = cv2.VideoWriter("depth_video.mp4", cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height))

while cap.isOpened():
ret, frame = cap.read()
if not ret:
break

results = model(frame, verbose=False)
for result in results:
depth = result.depth.data.cpu().numpy()
colored = colorize_depth(depth, cmap="inferno")
out.write(colored)

if cv2.waitKey(1) & 0xFF == ord("q"):
break

cap.release()
out.release()
cv2.destroyAllWindows()

示例三:深度统计分析

from ultralytics import YOLO

model = YOLO("yolo26n-depth.pt")
results = model("image.jpg")

for result in results:
depth = result.depth.data.cpu().numpy()

print("=== 深度统计 ===")
print(f"图像尺寸: {depth.shape}")
print(f"最小深度: {depth.min():.2f} m")
print(f"最大深度: {depth.max():.2f} m")
print(f"平均深度: {depth.mean():.2f} m")
print(f"中位深度: {float(__import__('numpy').median(depth)):.2f} m")
print(f"标准差: {depth.std():.2f} m")

# 深度区间统计
import numpy as np
bins = [0, 1, 5, 10, 20, 50, 100, float("inf")]
hist, _ = np.histogram(depth, bins=bins)
total = depth.size
print("\\n深度区间分布:")
for i in range(len(hist)):
label = f"{bins[i]}{bins[i+1]}" if bins[i+1] != float("inf") else f"{bins[i]}+"
pct = hist[i] / total * 100
print(f" {label:>10} m: {pct:5.1f}%")


参数速查表

推理参数

参数类型默认值说明
source str/int 输入源:图像路径、视频路径、URL、摄像头索引
conf float 0.25 置信度阈值
imgsz int 640 输入图像尺寸
device str None 推理设备:cpu、0(GPU 0)、cuda:0
half bool False 是否使用 FP16 半精度推理
save bool False 是否保存结果
show bool False 是否实时显示

模型选择建议

需求推荐模型
实时推理 / 边缘设备 yolo26n-depth.pt
通用场景(平衡精度与速度) yolo26s-depth.pt
高精度需求 yolo26l-depth.pt 或 yolo26x-depth.pt

常见问题排查

1. 深度图全黑

原因:直接将 float32 深度数据传给 cv2.imwrite,PNG 只支持 uint8/uint16。

解决方案:

# 方式一:使用官方 colorize_depth 函数(推荐)
from ultralytics.utils.plotting import colorize_depth
cv2.imwrite("depth.png", colorize_depth(depth))

# 方式二:转为 uint16(毫米精度)
depth_uint16 = (depth * 1000).astype(np.uint16)
cv2.imwrite("depth.png", depth_uint16)

2. 深度值异常(过大或过小)

原因:log-depth head 输出的是相对深度,未经校准时绝对值可能不准确。

解决方案:

  • 使用 model.calibrate() 进行尺度校准
  • 使用 mode="disparity" 模式进行可视化(自动处理范围)

3. NumPy 不兼容

RuntimeError: Numpy is not available

解决方案:

pip install "numpy<2"

4. CUDA 内存不足(OOM)

CUDA out of memory

解决方案:

  • 减小输入图像尺寸:model("image.jpg", imgsz=320)
  • 使用更小的模型:yolo26n-depth.pt
  • 使用 CPU 推理:model("image.jpg", device="cpu")

5. 模型文件不存在

FileNotFoundError: yolo26n-depth.pt

解决方案:确保模型文件路径正确,或让 Ultralytics 自动下载:

model = YOLO("yolo26n-depth.pt") # 首次运行会自动下载


本文档基于 Ultralytics YOLO26 官方文档整理,更多信息请参考 Ultralytics 官方文档。

赞(0)
未经允许不得转载:网硕互联帮助中心 » YOLO26 单目深度估计使用指南
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!