单目深度估计技术与应用 - 从单张图像推断深度
什么是单目深度估计 - 从 2D 图像恢复 3D
单目深度估计是从单张 2D 图像推断场景中每个像素深度(距离)的技术。人类可以通过透视、遮挡、纹理梯度等视觉线索从单眼图像感知深度,深度学习模型学习了类似的能力。
与传统方法的对比:
- 双目立体视觉:需要两个相机,通过视差计算深度。精度高但需要校准和匹配
- 结构光:投射已知图案并分析变形。精度极高但受环境光影响,适用距离有限
- LiDAR:激光测距,精度最高但成本高、分辨率低、设备体积大
- 单目深度估计:仅需普通相机一张照片。成本最低、适用性最广,但精度相对较低
应用领域:AR/VR 中的遮挡处理、自动驾驶的障碍物检测、机器人导航、3D 照片效果(如 Facebook 3D Photo)、景深模拟(人像模式)。
监督学习深度估计模型
监督学习方法使用带有真实深度标注的图像对训练模型。深度标注通常来自 LiDAR、结构光传感器或双目立体匹配。
代表性数据集:
- NYU Depth V2:室内场景,Kinect 传感器采集深度。464 个场景,约 120K 对 RGB-深度图像
- KITTI:户外驾驶场景,LiDAR 采集稀疏深度。自动驾驶深度估计的标准基准
- ScanNet:室内 3D 重建数据集,提供稠密深度图
网络架构演进:
- 编码器-解码器:编码器提取多尺度特征,解码器逐步上采样恢复深度图。跳跃连接保留细节
- 多尺度预测:在多个分辨率上预测深度并融合,处理不同尺度的结构
- Transformer 架构:DPT(Dense Prediction Transformer)使用 ViT 编码器,全局注意力机制捕获长距离依赖,显著提升精度
损失函数:L1/L2 像素损失、尺度不变损失(Scale-Invariant Loss)、梯度损失(保持边缘锐利)、多尺度损失的组合。
自监督深度估计 - 从立体和视频中学习
自监督方法无需昂贵的深度标注,利用立体图像对或连续视频帧中的几何约束作为监督信号。
基于立体对的方法:
- 训练时使用左右相机图像对
- 网络预测左图的深度,利用深度将左图变换到右图视角
- 变换后的图像与实际右图的差异作为损失函数
- 推理时仅需单张图像即可预测深度
基于单目视频的方法(Monodepth2):
- 同时训练深度网络和位姿网络
- 深度网络预测当前帧深度,位姿网络预测相邻帧间的相机运动
- 利用深度和位姿将当前帧变换到相邻帧视角,重建误差作为损失
- 自动遮挡处理:检测被遮挡区域并在损失计算中排除
优势与局限:无需深度传感器,可利用海量无标注视频训练。但在纹理缺失区域、动态物体、遮挡边界处精度下降。尺度模糊性是固有问题(单目无法确定绝对尺度)。
MiDaS 和 DPT - 通用深度模型的演进
MiDaS(Mixing Datasets for Monocular Depth)和 DPT(Dense Prediction Transformer)是目前最广泛使用的通用深度估计模型,在各种场景中表现出色。
MiDaS 的核心创新:
- 混合数据集训练:同时使用多个不同来源的深度数据集训练。不同数据集的深度尺度和范围不同,通过尺度不变损失统一
- 零样本泛化:在训练中未见过的场景类型上也能产生合理的深度预测
- 多种模型大小:从轻量级(MiDaS Small)到高精度(MiDaS Large),适配不同计算预算
DPT 的改进:
- 将编码器从 CNN 替换为 Vision Transformer(ViT)
- 全局自注意力机制使模型能理解图像中远距离元素的空间关系
- 在所有基准测试中显著超越 CNN 基础的 MiDaS
Depth Anything:
- 最新的通用深度模型,使用大规模无标注数据进行自监督预训练
- 在 62M 张无标注图像上预训练,再在标注数据上微调
- 精度超越 MiDaS/DPT,同时保持良好的泛化能力
应用 - AR、自动驾驶与 3D 重建
单目深度估计在多个领域有重要应用,从消费级 AR 到工业级自动驾驶。
AR/VR 应用:
- 遮挡处理:虚拟物体被真实物体遮挡时需要正确渲染。深度图判断虚拟物体是否应被遮挡
- 物体放置:在 AR 中将虚拟物体放置在真实平面上,需要估计平面的深度和法线
- 景深效果:智能手机的人像模式利用深度图模拟大光圈散景效果
自动驾驶:
- 障碍物距离估计:判断前方车辆、行人、障碍物的距离
- 可行驶区域检测:结合深度和语义分割确定安全行驶区域
- 与 LiDAR 融合:用单目深度填补 LiDAR 稀疏区域,提供稠密深度
3D 重建:
- 单图 3D 重建:从单张照片生成 3D 网格模型。结合深度图和法线估计
- 新视角合成:利用深度图将 2D 图像变换到新视角,实现 3D 照片效果
- 点云生成:深度图反投影为 3D 点云,用于场景理解和测量
实现与评估 - Python 深度估计流水线
使用 Python 构建完整的深度估计流水线,从模型加载到深度图可视化。
使用 MiDaS/DPT 的基本流程:
- 安装:
pip install torch torchvision timm - 加载预训练模型:
model = torch.hub.load('intel-isl/MiDaS', 'DPT_Large') - 图像预处理:缩放到模型输入尺寸,标准化
- 推理:
prediction = model(input_tensor) - 后处理:将输出缩放回原始图像尺寸,归一化到 0-1 范围
深度图可视化:
- 灰度图:近处亮、远处暗(或反转)
- 伪彩色:使用 matplotlib 的 colormap(如 plasma、inferno)增强可读性
- 3D 点云:利用相机内参将深度图反投影为 3D 点,用 Open3D 可视化
评估指标:
- AbsRel(绝对相对误差):预测深度与真实深度的相对误差均值
- RMSE(均方根误差):像素级深度误差
- δ < 1.25:预测深度与真实深度比值在 1.25 倍以内的像素比例
性能优化:ONNX Runtime 加速推理、TensorRT 部署到 GPU、模型量化(INT8)减少内存和计算量。移动端可使用 MiDaS Small 或 Core ML 转换后的模型。