单目深度估计模型
单目深度估计是从单张 RGB 图像预测场景深度信息的技术,是 3D 感知的核心能力之一。近年来基于 Transformer 和扩散模型的深度估计方法取得了显著进展,从相对深度排序发展到度量深度预测。
问题定义
单目深度估计是一个不适定问题(ill-posed problem):同一张 2D 图像可能对应多个不同的 3D 场景。因此,模型需要利用场景先验知识进行推理。
深度估计主要分为两类:
- 相对深度:预测深度的相对排序关系(远/近),不提供绝对尺度
- 度量深度:预测以米为单位的绝对深度值
MiDaS:相对深度估计
MiDaS(Mixed Data for Depth)是 Intel 推出的相对深度估计模型系列:
- 混合多数据集训练,学习通用的深度先验
- 输出逆深度图(inverse depth),值越小表示越远
- 支持多种骨干网络(ResNet、ViT、DPT)
python
import torch
class MiDaSPipeline:
"""MiDaS 深度估计推理"""
def __init__(self, model_type="DPT_Large"):
self.model = torch.hub.load("intel-isl/MiDaS", model_type)
self.transform = torch.hub.load("intel-isl/MiDaS", "transforms")
def predict(self, image):
input_batch = self.transform(image).unsqueeze(0)
with torch.no_grad():
prediction = self.model(input_batch)
# 插值回原始尺寸
prediction = torch.nn.functional.interpolate(
prediction.unsqueeze(1),
size=image.shape[:2],
mode="bicubic",
align_corners=False,
).squeeze()
return prediction.cpu().numpy()Depth Anything:基础深度模型
Depth Anything 是基于 ViT 的大规模预训练深度估计模型:
- 数据扩展策略:使用自训练(self-training)将标注数据扩展到 6200 万张无标注图像
- ViT-Large 骨干:利用 DINOv2 的视觉特征
- 相对深度输出:适用于通用深度估计场景
Metric3D:度量深度估计
Metric3D 实现了从单目图像直接预测度量深度:
- 引入相机内参作为输入,解决尺度模糊性
- 使用 canonical camera space 统一训练
- 支持零样本迁移到新场景
深度估计与 3D 重建
单目深度估计是 3D 重建的基础组件。结合深度估计和相机位姿估计,可以从视频序列重建 3D 场景,这在自动驾驶、AR/VR 等领域有广泛应用。
Depth Pro:Apple 的快速深度估计
Depth Pro 是 Apple 推出的实时度量深度估计模型:
- 0.3 秒内生成 2K 分辨率的度量深度图
- 不需要相机内参输入
- 基于扩散模型架构,但优化了推理速度
应用场景
| 应用 | 需求 | 推荐模型 |
|---|---|---|
| 图片背景虚化 | 相对深度 | MiDaS / Depth Anything |
| 3D 场景重建 | 度量深度 | Metric3D / Depth Pro |
| 自动驾驶 | 度量深度 | Metric3D |
| AR 特效 | 实时深度 | Depth Pro / FastDepth |