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

19fda6412fd2d.png

💡 "一张图,不只是像素,而是空间。"


🧭 三句话读懂 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 任务的世界表示。


🏗️ 二、核心技术解析(代码级 🔍)

19fda65be204b.png

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 个数据集"大乱炖" 🍲

19fda69208524.png

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 全覆盖

19fda6f7dd37d.png

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 空间计算 / 环境建模 全景推理支持
📷 摄影 景深重打 / 背景替换 高质量深度 + 边缘

🔮 未来演进方向(个人暴论)

  1. Video MoGe:视频时序一致性,消灭帧间抖动
  1. 稀疏控制点 + Dense 补全:人机协作标注新范式
  1. 端侧 NPU 极致优化:手机实时 3D 感知
  1. 与 Gaussian Splatting 打通:2D 图片 → 3D 场景一键生成
19fda73842419.png

🎬 六、总结一句话

MoGe-2 不是"又一个深度估计算法",而是把单目几何推向"基础模型时代"的关键一步。


📚 参考资料

  • 配置文件:v2.json / all_benchmarks.json
  • 文档:eval.md / train.md / onnx.md / normal.md

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注