MiDaS 是一个基于单目图像的深度估计(Monocular Depth Estimation, MDE)模型,它利用深度学习从单张RGB图片预测场景的相对深度分布。该模型由 Intel Intelligent Systems Lab 开发,并在多个数据集上训练,以提高泛化能力。
补充:单目图像与双目图像的对比
特性 | 单目图像 | 双目图像 |
---|---|---|
图像来源 | 单个摄像头 | 两个摄像头(左右) |
深度信息 | 无法直接获取,需通过计算或学习推断 | 可直接通过视差计算深度 |
数据量 | 较小(单幅图像) | 较大(两幅图像) |
计算复杂度 | 通常较低(主要处理二维信息) | 较高(需要计算视差和深度) |
应用场景 | 图像识别、目标检测、图像分割等 | 三维重建、自动驾驶、机器人导航等 |
1. MiDaS 的核心思想
1.1 传统深度估计 vs. 深度学习
传统的深度估计方法主要依赖于:
- 双目立体视觉(Stereo Vision):需要两张不同角度的图片。
- 结构光 & ToF(如iPhone LiDAR):依赖额外传感器。
MiDaS 的突破点在于仅使用单张RGB图像,通过深度学习推理出深度信息,适用于普通摄像头(如手机摄像头)。
1.2 关键挑战
单目深度估计的核心难点在于:
- 深度信息的丢失:单张RGB图像本质上不包含深度信息。
- 尺度模糊性:MiDaS 只能预测相对深度,但不能直接得到绝对距离。
- 泛化能力:不同场景、光照、物体形状可能导致预测误差。
MiDaS 通过 大规模多数据集训练 + Transformer 结构 解决了上述问题。
2. MiDaS 的模型架构
MiDaS 主要经历了多个版本的迭代,目前最新版本(MiDaS v3)采用了DPT(Dense Prediction Transformer)架构,主要包含编码器(Encoder)和解码器(Decoder)两个部分。
2.1 编码器(Encoder)
编码器负责从输入图像中提取特征,MiDaS 目前支持多种编码器:
- ResNet(轻量级,适用于移动端)
- EfficientNet(高效,适用于低功耗设备)
- Vision Transformer(ViT)(高精度,但计算量大)
核心原理:
- 利用 CNN(卷积神经网络)或 ViT(Transformer) 提取多尺度特征。
- ViT 通过 自注意力机制(Self-Attention) 捕捉全局信息,提升泛化能力。
2.2 解码器(Decoder)
解码器负责将特征图(Feature Map)转换为深度图(Depth Map)。
- 采用 上采样(Upsampling) 技术恢复分辨率。
- 结合 跳跃连接(Skip Connection) 保留高频细节,提高深度预测精度。
3. MiDaS 的训练与泛化
3.1 训练数据
MiDaS 在多个不同的数据集上进行训练,以确保在不同场景下具有较强泛化能力:
- NYU Depth v2(室内深度数据)
- KITTI(自动驾驶场景)
- ReDWeb(通用深度数据)
- DIODE(高精度激光测距数据)
核心方法:
- 不同数据集的统一归一化(对不同深度数据进行尺度调整)。
- 无监督学习(Self-Supervised Learning):使用图像对比学习获取深度信息。
- 混合损失函数:
- 尺度不变损失(Scale-Invariant Loss):确保深度估计在不同尺度下都有效。
- 梯度损失(Gradient Loss):增强深度图的平滑性,减少噪声。
3.2 预测的深度图
MiDaS 生成的是相对深度图(Relative Depth Map),颜色代表深度:
- 深色(黑/蓝)= 近处
- 浅色(白/黄)= 远处
4. MiDaS 的适用场景
MiDaS 可以用于多个领域:
✅ AR/VR 应用(场景建模、背景虚化)
✅ 机器人导航(低成本深度感知)
✅ 自动驾驶(辅助感知障碍物)
✅ 医学影像分析(3D CT 重建)
✅ 摄影优化(背景模糊,类似 iPhone 的“人像模式”)
5. MiDaS 的局限性
❌ 不能直接测量绝对距离(需借助已知物体进行校准)
❌ 对光照敏感(低光环境可能影响效果)
❌ 对透明和反光物体误判(如玻璃、镜子)
6. 如何在手机上运行 MiDaS
MiDaS 既支持 PyTorch 也支持 ONNX/TFLite(可部署到手机)。
6.1 Python 代码示例
import torch
import cv2
import numpy as np
from torchvision.transforms import Compose, Normalize, ToTensor
from midas.model_loader import load_model
# 1. 加载 MiDaS 模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model, transform = load_model("MiDaS_small", device)
# 2. 读取输入图像
image = cv2.imread("test.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
input_img = transform(image).unsqueeze(0).to(device)
# 3. 预测深度图
with torch.no_grad():
depth_map = model(input_img)
depth_map = depth_map.squeeze().cpu().numpy()
# 4. 归一化 & 可视化
depth_map = (depth_map - depth_map.min()) / (depth_map.max() - depth_map.min())
cv2.imshow("Depth Map", depth_map)
cv2.waitKey(0)
6.2 在安卓/移动端部署
- 转换为 ONNX 模型:
python export_onnx.py --model_type MiDaS_small --output_path midas.onnx
- 使用 TensorFlow Lite 进行移动端推理。
7. MiDaS 的进阶优化
- 多帧融合:结合视频帧,提高测距稳定性。
- IMU 结合:使用手机陀螺仪辅助估计深度。
- 标定深度尺度:使用已知物体(如 A4 纸)进行绝对测距。
8. 结论
MiDaS 是目前最先进的单目深度估计模型之一,适用于手机摄像头,且开源易用。如果你想实现基于手机的测距功能,可以结合 MiDaS + 物体尺度校准来获得较为准确的距离测量。