Depth Estimation
深度估计用于预测每个像素与相机之间的距离,并根据双目相机、主动传感器或单张图像生成深度图。
深度估计是计算机视觉任务,目的是预测图像中每个像素所示表面到相机的距离。输出结果是深度图,即与图像尺寸相同的距离网格,为缺少第三维度的平面照片补上深度信息。借助普通相机,机器人、车辆和增强现实设备可以获取场景的 3D 布局。
获取深度的方法#
- 立体视觉:两台经过标定、间距已知的相机从略有不同的水平位置观察同一个点。这个位置偏移称为视差,可通过焦距 × 基线 ÷ 视差计算深度,因此视差较小的远处物体测量精度较低;白墙等没有纹理的表面也很难在两张图像之间匹配。
- LiDAR和其他主动传感器:LiDAR 通过测量激光脉冲的往返时间,在远距离提供精确但稀疏的点;飞行时间和结构光相机则能在近距离(主要是室内)提供稠密深度。这些传感器也能生成学习模型训练所需的真实标注。
- 单目深度估计:神经网络根据单张图像预测深度,利用透视关系、熟悉物体的已知尺寸、纹理梯度和遮挡等线索。这个问题是病态的,因为近处的玩具车和远处的真车可能生成相同的图像,所以模型只能依赖从典型场景中学到的知识。
- 视觉 SLAM和其他多视图方法:运动恢复结构和视觉 SLAM 通过对从不同位置拍摄的连续帧中的点进行三角测量来恢复深度。
使用深度学习进行单目深度估计#
学习得到的深度模型分为两种。相对深度模型预测表面的前后顺序和形状,但不确定尺度和偏移;这足以实现背景虚化等效果,也足以判断物体之间的远近。MiDaS通过在包括 3D 电影在内的混合数据集上使用尺度和偏移不变损失进行训练,让这种方法能适用于差异很大的场景;Depth Anything V2则使用 2500 万到 13 亿参数的模型,在合成标签和大量伪标签真实图像上训练。度量深度模型预测以米为单位的距离,机器人和测量工具都需要这种结果:Apple 的 Depth Pro能在标准GPU上于 0.3 秒内生成 225 万像素的度量深度图,无需相机内参。
Ultralytics YOLO26深度模型可根据单张图像预测度量深度,其对数深度头的输出范围约为 0.02 到 150 米,因此同一个模型既能处理深度为几米的房间,也能处理最远达 80 米的驾驶场景。只需几行代码即可加载模型、进行预测并保存结果:
from ultralytics import YOLO
# Load a YOLO26 monocular depth model
model = YOLO("yolo26n-depth.pt")
# Predict a depth map for one image
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Per-pixel depth in meters, at the original image's resolution
depth = result.depth.data
print(f"Nearest {depth.min():.1f} m, farthest {depth.max():.1f} m")
# Save a colorized depth map blended over the photo
result.save(filename="depth_result.jpg")打印出的范围显示模型在街景中检测到的最近和最远表面,保存的图像则根据每个像素预测的距离为其着色。
衡量准确率#
深度模型会根据传感器提供的真实标注,按像素进行评分。绝对相对误差(AbsRel)以真实深度为基准计算误差比例的平均值;均方根误差(RMSE)以米为单位报告误差;δ1 表示预测值与真实值相差不超过 1.25 倍的像素占比。标准基准包括使用 Kinect 传感器拍摄室内场景的 NYU Depth V2,以及具有 LiDAR 真实标注的驾驶场景数据集 KITTI,通常评估距离不超过 80 米的区域。相对深度预测在评分前会根据真实标注进行尺度和偏移对齐,因此其指标只衡量形状。对所有像素取平均值也会掩盖深度渗漏现象,即预测深度会越过物体边界扩散;因此 Depth Pro 引入了专门的边界精度指标。
深度估计与相关任务的比较#
- 3D 目标检测:为每个物体预测包含位置、尺寸和朝向的 3D 框,通常会将深度作为输入。
- 语义分割:为每个像素分配类别标签;结合深度图后,机器人就能同时了解每个表面是什么,以及它距离多远。
- 3D 重建:构建场景的完整网格或点云,通常通过融合多个视角的深度信息来实现。










