🚀 MoGe-2:把"单张照片"变成"可度量 3D 世界"的基础模型

💡 "一张图,不只是像素,而是空间。"
🧭 三句话读懂 MoGe-2
1️⃣ MoGe-2 是一个单目几何基础模型,能从一张普通 RGB 图预测 metric 尺度点云 + 法向 + 掩码。
2️⃣ 它用 DINOv2 ViT-L 做 backbone,配合 多尺度残差解码头 + metric scale head,在 24 个异构数据集上联合训练。
3️⃣ 在 NYUv2 / KITTI / ETH3D / Spring 等 10 大 benchmark 上实现了 零样本 SOTA,并且已支持 ONNX 导出与工程部署。
🖼️ 一、MoGe-2 到底在解决什么问题?
过去十年,单目深度估计一直在打转:
| 时代 | 代表工作 | 痛点 |
|---|---|---|
| 早期 | Depth CNN | 泛化差、跨域崩 |
| MDE 时代 | MiDaS / AdaBins | 只有相对深度 |
| 基础模型时代 | Depth Anything | 强泛化,但仍缺 metric |
| ✅ MoGe-2 | Metric + Normal + Mask | 一张图 = 可度量 3D |
👉 MoGe-2 的目标很直接:
用一张图,恢复一个物理尺度正确、几何结构完整、可直接用于下游 3D 任务的世界表示。
🏗️ 二、核心技术解析(代码级 🔍)

1️⃣ Backbone:冻结 DINOv2,只调 Adapter
"encoder": {
"backbone": "dinov2_vitl14",
"intermediate_layers": [5, 11, 17, 23],
"dim_out": 1024
}
✅ 设计哲学:
- DINOv2 已在亿级图像上预训练,语义 & 结构先验极强
- 冻结 backbone,只对中间层做轻量适配
- 多尺度特征(1/4 ~ 1/16)喂给 decoder
🧠 一句话总结:
不重新发明轮子,而是把最强视觉表征"借"来做几何。
2️⃣ Neck + Decoder:多尺度残差上采样
"neck": {
"dim_in": [1026, 2, 2, 2, 2],
"dim_res_blocks": [1024, 256, 128, 64, 32],
"resamplers": ["conv_transpose", "conv_transpose", "conv_transpose", "bilinear"]
}
✅ 关键点:
- 每层都带 ResBlock
- 上采样方式混合 转置卷积 + 双线性
- 不依赖 transformer decoder,显存友好、速度快
🎯 优势:
- 高分辨率几何细节保留好
- 边缘、薄结构更稳定
3️⃣ 多任务 Head:Point / Normal / Mask / Scale
"points_head": { "dim_out": [null, null, null, null, 3] },
"normal_head": { "dim_out": [null, null, null, null, 3] },
"mask_head": { "dim_out": [null, null, null, null, 1] },
"scale_head": { "dims": [1024, 1024, 1024, 1] }
✅ 输出含义:
- Points:仿射不变点图(后续 reproject 成 metric)
- Normal:表面法向(由深度推导,非直接 GT)
- Mask:有效区域
- Scale:全局 metric 缩放因子
🧮 Normal 的 loss(顺手加的惊喜):
L_normal = (1/|M|) * Σ angle(ŝ_i, n_i)²
💬 官方原话: "Normal estimation was implemented after the submission… we do not claim any novel technical contribution." 👉 但效果是真的香 😏
4️⃣ Metric Scale:从"形状"到"尺寸"
"remap_output": "exp",
"scale_head": { "dims": [1024, 1024, 1024, 1] }
✅ 核心 trick:
- Point head 输出 仿射不变点图
- Scale head 预测 全局尺度因子
- 两者结合 → metric 点云
📌 这一步,是 MoGe-2 和 Depth Anything / Marigold 的本质区别。
5️⃣ 训练数据:24 个数据集"大乱炖" 🍲

v2.json 里藏着 MoGe-2 泛化能力的秘密:
| 类型 | 代表数据集 | 特点 |
|---|---|---|
| 真实驾驶 | Waymo / Argoverse2 / A2D2 | 大尺度、动态 |
| 室内扫描 | ScanNet++ / Taskonomy | 精细结构 |
| 合成渲染 | BlendedMVS / Objaverse / MatrixCity | 几何干净 |
| SfM 数据 | MegaDepth | 弱监督尺度 |
| 仿真游戏 | GTA-SfM / UrbanSyn | 多样性极强 |
✅ 关键设计:
- 每个数据集都有
label_type: A / B / C
- 不同 label 对应不同 loss 组合
- 通过
weight控制采样概率
🧠 这不是"堆数据",而是"多假设训练"。
6️⃣ Loss 设计:Global + Patch + Normal + Metric
"global": { "function": "affine_invariant_global_loss" },
"patch_4 / 16 / 64": { "function": "affine_invariant_local_loss" },
"normal": { "function": "edge_loss" },
"metric_scale": { "function": "metric_scale_loss" }
✅ 设计逻辑:
- Global loss:保证整体形状
- Patch loss:保局部结构(墙角、栏杆、细杆)
- Normal loss:增强表面连续性
- Metric loss:在有 GT 的数据上学绝对尺度
🎯 结果:
在没有统一尺度监督的情况下,依然学到"正确的几何"。
7️⃣ Token 数量动态控制(显存 & 精度平衡)
"num_tokens_range": [1200, 3600]
✅ 训练时随机采样 token 数
✅ 推理时可通过 resolution_level / num_tokens 控制
📌 工程意义:
- 高分辨率 ≠ 高精度
- 可按需 trade-off
🧪 三、评测体系:10 大 Benchmark 全覆盖

all_benchmarks.json 展示了 MoGe-2 的"硬实力":
| Benchmark | 分辨率 | 场景 | 特点 |
|---|---|---|---|
| NYUv2 | 640×480 | 室内 | 标准 metric |
| KITTI | 750×375 | 室外驾驶 | 稀疏 LiDAR |
| ETH3D | 2048×1365 | 高精度扫描 | 工程级 |
| iBims-1 | 640×480 | 边界敏感 | 边缘指标 |
| Spring | 1920×1080 | 光流/深度 | 高难度 |
| HAMMER | 1664×832 | 自动驾驶 | 高分辨率 |
| GSO | 512×512 | 物体扫描 | 多物体 |
| Sintel | 872×436 | 电影渲染 | 复杂运动 |
| DDAD | 1400×700 | 驾驶 | 多相机 |
| DIODE | 1024×768 | 室内外 | 高精度 |
✅ 统一评测脚本
python moge/scripts/eval_baseline.py
--baseline baselines/moge.py
--config configs/eval/all_benchmarks.json
--pretrained Ruicheng/moge-vitl
--resolution_level 9
📌 这是目前最规范的单目几何评测体系之一。
🚀 四、部署与工程实践建议
✅ ONNX 导出(已就绪)
import os
os.environ['XFORMERS_DISABLED'] = '1'
import torch
from moge.model.v2 import MoGeModel
model = MoGeModel.from_pretrained('Ruicheng/moge-2-vits-normal.pt')
model.onnx_compatible_mode = True
torch.onnx.export(
model,
(torch.rand(1, 3, 518, 518), torch.tensor(1800)),
'moge-2.onnx',
input_names=['image', 'num_tokens'],
output_names=['points', 'normal', 'mask', 'metric_scale'],
dynamic_axes={
'image': {0: 'batch_size', 2: 'height', 3: 'width'},
},
opset_version=14
)
⚠️ 注意:
- ONNX 不包含 post-process
- reproject / scale recovery 需自行实现
✅ 推荐部署组合:
- GPU:ONNX Runtime / TensorRT
- 边缘:FP16 + static shape
- 实时:降低
num_tokens
✅ 推理参数选型建议
| 场景 | resolution_level | num_tokens | 备注 |
|---|---|---|---|
| 实时 | 6 | 1200 | 机器人 |
| 高质量 | 9 | 3600 | 离线重建 |
| 边缘 | 5 | 800 | Jetson |
✅ 训练 / 微调建议
# 微调预训练模型(注意学习率要小!)
accelerate launch
--num_processes 8
moge/scripts/train.py
--config configs/train/v2.json
--checkpoint pretrained/moge-vitl.pt
--enable_gradient_checkpointing True
📌 官方建议:
- 微调学习率 ≤ 1e-5(head)/ 1e-6(backbone)
- Batch size 至少 32
- 默认配置并非最优,需针对具体数据集调参
🌍 五、应用领域 & 前景展望
🎯 当前可直接落地的场景
| 领域 | 应用 | MoGe-2 的优势 |
|---|---|---|
| 🤖 机器人 | 导航 / 抓取 / SLAM | 零样本泛化、metric 尺度 |
| 🚗 自动驾驶 | 感知 / 场景理解 | 大分辨率、多 benchmark 验证 |
| 🎮 AIGC | 3D 内容生成 / 场景重建 | 法向 + 点云一步到位 |
| 🏗️ 工业 | 测量 / AR 标注 | 公制尺度准确 |
| 🕶️ VR/MR | 空间计算 / 环境建模 | 全景推理支持 |
| 📷 摄影 | 景深重打 / 背景替换 | 高质量深度 + 边缘 |
🔮 未来演进方向(个人暴论)
- Video MoGe:视频时序一致性,消灭帧间抖动
- 稀疏控制点 + Dense 补全:人机协作标注新范式
- 端侧 NPU 极致优化:手机实时 3D 感知
- 与 Gaussian Splatting 打通:2D 图片 → 3D 场景一键生成

🎬 六、总结一句话
MoGe-2 不是"又一个深度估计算法",而是把单目几何推向"基础模型时代"的关键一步。
📚 参考资料
- 配置文件:
v2.json/all_benchmarks.json
- 文档:
eval.md/train.md/onnx.md/normal.md