#DUSt3R:把复杂几何视觉变成 pointmap 回归

论文:DUSt3R: Geometric 3D Vision Made Easy

作者:Shuzhe Wang, Vincent Leroy, Yohann Cabon, Boris Chidlovskii, Jerome Revaud

arXiv:<https://arxiv.org/abs/2312.14132>

#0. 一句话总结

DUSt3R 的核心想法是:不要先估计相机内参、外参、匹配关系,再做三角化和 MVS;而是让一个 Transformer 直接从两张图预测 dense 3D pointmap,并且把两张图的 pointmap 放到同一个坐标系里。

一旦有了这个 pointmap,传统 3D 视觉里的很多任务——深度估计、像素匹配、相机内参、相对位姿、多视图重建——都可以从这个表示里读出来。

这篇论文真正重要的地方,不只是某个 benchmark 数字,而是它把 3D vision 从“显式几何流水线”推进到“可学习的通用 3D 表示”。

Figure 1:DUSt3R 的整体目标:从无约束图像集合直接输出 pointmaps,并由此恢复相机、深度、匹配和 3D 重建。
Figure 1:DUSt3R overview

#1. 它想解决什么问题?

传统 3D 重建,尤其是 SfM / MVS,通常是一条很长的流水线:

多张图片
  ↓
特征点检测与匹配
  ↓
估计基础矩阵 / 本质矩阵
  ↓
恢复相机内参和外参
  ↓
三角化 sparse 3D points
  ↓
Bundle Adjustment
  ↓
Dense MVS
  ↓
稠密 3D 重建

这个流程很经典,也很强。但它有一个问题:每一步都依赖前一步,每一步都可能失败。

比如:

  • 图片来自不同设备,焦距和内参未知;
  • 视角差异太大,特征匹配失败;
  • 场景低纹理、重复纹理、反光或透明;
  • 只有很少几张图,SfM 初始化不稳定;
  • sparse matching 的噪声传给 camera pose,pose 的误差再传给 MVS。

所以传统 pipeline 的核心矛盾是:

MVS 想要好的相机参数;但在真实场景里,好的相机参数本身就很难估。

DUSt3R 的立场很激进:

不要把相机参数当作必须先求出来的前提。

先让模型直接预测 3D 结构。

然后再从这个 3D 表示里恢复相机、匹配、深度和重建。

这就是标题里 Geometric 3D Vision Made Easy 的含义。


#2. 核心表示:pointmap 是什么?

DUSt3R 的关键词是 pointmap

普通 RGB 图像里,每个像素是颜色:

pixel → (R, G, B)

深度图里,每个像素是深度:

pixel → z

pointmap 里,每个像素直接对应一个 3D 点:

pixel → (x, y, z)

形式上,pointmap 是:

也就是说,对于图像里的每个像素 ,模型预测一个三维坐标:

#2.1 为什么不是只预测 depth map?

传统单目深度预测输出的是:

但要把 depth map 转成 3D 点,还需要相机内参

所以 depth map 本身并不是完整 3D 表示,它仍然依赖相机模型。

DUSt3R 直接预测 ,因此它绕开了“必须先知道相机内参”的限制。

#2.2 更关键:两张图的 pointmap 在同一个坐标系里

给定两张图片:

DUSt3R 输出:

这里下标的含义是:

  • :图像 1 每个像素对应的 3D 点,表达在图像 1 的相机坐标系里;
  • :图像 2 每个像素对应的 3D 点,也表达在图像 1 的相机坐标系里。

重点是:

两张图的点云被预测到同一个坐标系中。

这件事非常重要。因为如果两张图的像素级 3D 点已经在同一个坐标系里,那么很多传统几何任务都会变简单:

  • 像素匹配:在 3D 空间里找最近邻;
  • 相对位姿:对齐两个 pointmap;
  • 深度估计:取 pointmap 的 z 坐标;
  • 相机内参:从 3D 点和像素坐标反推;
  • 多视图重建:把所有 pairwise pointmap 拼到全局空间。

所以 DUSt3R 的本质是:

让神经网络直接预测一个“像素对齐、跨视角对齐”的 3D 表示。


#3. 网络结构:双分支 Transformer + cross-attention

DUSt3R 的网络基于 CroCo / ViT 风格。输入两张图,输出两张图对应的 pointmap 和 confidence map。

Figure 2:DUSt3R 网络结构。两张图先经过共享 ViT encoder,然后在 Transformer decoder 中通过 cross-attention 交换信息,最后输出同一坐标系下的 pointmaps 和 confidence maps。
Figure 2:DUSt3R architecture

整体流程是:

I1 → shared ViT encoder ┐
                        ├→ cross-attention decoders → Head1 → X1,1 + C1,1
I2 → shared ViT encoder ┘                         → Head2 → X2,1 + C2,1

#3.1 Siamese ViT encoder

两张图先经过共享权重的 ViT encoder:

共享权重的好处是,两张图会被编码到同一个特征空间中。

#3.2 Decoder 通过 cross-attention 建立跨视角关系

之后进入两个 decoder 分支。每个 decoder block 大致包括:

  1. self-attention:看自己这张图内部;
  2. cross-attention:看另一张图;
  3. MLP。

cross-attention 是关键。因为模型需要知道:

  • 两张图里哪些区域对应;
  • 视角变化是什么;
  • 哪些区域被遮挡;
  • 远近关系如何变化;
  • 两个视角下的 3D 结构如何对齐。

如果没有跨视角信息交换,模型就只能做单目猜测;有了 cross-attention,它才能学习真正的 stereo / multi-view 几何。

#3.3 输出 pointmap 和 confidence map

最后每个分支输出:

其中:

  • :pointmap;
  • :confidence map。

置信度很重要,因为真实图像里有很多区域本来就难:天空、透明物体、反光表面、遮挡区域、低纹理墙面、只在一张图中出现的区域等。

DUSt3R 不需要显式的 confidence 标注,而是在训练目标中自己学出哪些点可靠。


#4. 训练目标:直接在 3D 空间回归

DUSt3R 的训练目标非常直接:预测 pointmap,然后和 ground-truth pointmap 做 3D 距离损失。

不过这里有一个问题:尺度不确定性。

很多 3D 重建任务本来只能恢复到一个未知尺度。比如同样的图像观测,可能对应一个小模型,也可能对应一个大建筑;如果没有真实标尺,绝对尺度不一定能确定。

因此 DUSt3R 对预测和真值都做尺度归一化。每个像素的 regression loss 大致是:

其中 是所有有效点到原点的平均距离。

这意味着模型主要学习:

  • 形状;
  • 相对深度;
  • 相对结构;
  • 跨视角几何关系;

而不是强行学习绝对尺度。

#4.1 Confidence-aware loss

DUSt3R 同时预测 confidence。训练目标是:

这个形式可以这样理解:

  • 如果某个点误差大,模型可以降低它的 confidence;
  • 项会惩罚过低的 confidence,防止模型把所有点都说成“不确定”。

所以 confidence 学到的是一种没有显式标注的 uncertainty。

Figure 3:DUSt3R 在未见过场景上的重建示例,展示 RGB、深度、置信度和重建结果。
Figure 3:reconstruction examples

#5. 从 pointmap 到各种传统 3D 任务

DUSt3R 最有意思的地方是:一旦有了 pointmap,很多传统任务都变成了简单后处理。

#5.1 像素匹配:在 3D 空间里找最近邻

传统图像匹配通常是:

SIFT / SuperPoint / DINO feature
  ↓
descriptor matching
  ↓
RANSAC

DUSt3R 的做法是:因为 已经在同一个坐标系里,所以如果两个像素看到同一个 3D 点,它们的 3D 坐标应该接近。

于是可以直接做 nearest neighbor:

再保留 mutual nearest neighbor,就得到像素对应关系。

人话讲就是:

传统匹配是在 2D 特征空间里找对应;DUSt3R 是在预测出来的 3D 空间里找对应。

#5.2 单目深度:输入同一张图两次

如果只有一张图 ,可以输入:

然后取 pointmap 的 坐标作为深度。

这说明 DUSt3R 统一了:

  • 单目深度;
  • 双目重建;
  • 多视图重建。

单目只是一个特殊情况:两张输入图相同。

#5.3 相机内参恢复:从 pointmap 反推焦距

如果 pointmap 表达在相机 1 坐标系里,那么 3D 点投影到 2D 像素时应该满足 pinhole camera model。

论文简化假设:

  • 主点在图像中心;
  • 像素是正方形;
  • 只估计焦距

于是可以找一个 ,让 pointmap 投影回图像平面后尽可能对齐原始像素位置。

直观讲:

pointmap 给了每个像素背后的 3D 点;图像本身给了像素位置。找一个相机焦距,让这些 3D 点投影回来时刚好落回对应像素。

#5.4 相对位姿恢复

有了 pointmap,可以用多种方式恢复相对 pose:

  1. 先用 pointmap 得到 2D-2D 匹配,再用经典 epipolar geometry;
  2. 直接对齐两组 3D 点,用 Procrustes alignment;
  3. 用 2D-3D 对应跑 PnP-RANSAC。

这说明 DUSt3R 不是完全抛弃传统几何,而是把传统几何变成了 pointmap 之后的读出工具。


#6. 多视图重建:Global Alignment

基础 DUSt3R 处理的是 image pair。那如果有很多张图怎么办?

论文构建一个图:

每张图片是一个节点
两张图片有重叠区域,则连一条边

对于每条边 ,DUSt3R 预测 pairwise pointmaps:

每个 pair 都有自己的局部坐标系。现在要做的是把所有局部坐标系拼到一个全局坐标系里。

DUSt3R 提出 global alignment 优化:为每张图恢复全局 pointmap ,同时为每条边恢复刚体变换 和尺度 ,使得所有 pairwise pointmap 都能对齐到同一个世界里。

目标函数大致是:

人话讲:

每对图片 DUSt3R 都能重建一个局部小世界。global alignment 要做的事,就是把这些局部小世界拼成一个统一的大世界。

这和传统 Bundle Adjustment 有点像,但关键区别是:

  • 传统 BA 最小化 2D reprojection error;
  • DUSt3R 的 global alignment 最小化 3D pointmap alignment error。

所以它不是在 2D 投影空间里对齐,而是在 3D 空间里直接对齐。

论文认为这更简单、更快,通常几百步梯度下降即可收敛,在 GPU 上几秒完成。


#7. 训练数据与模型设置

DUSt3R 使用了多种数据源,包括:

  • Habitat;
  • MegaDepth;
  • ARKitScenes;
  • Static Scenes 3D;
  • BlendedMVS;
  • ScanNet++;
  • CO3D-v2;
  • Waymo。

总共提取约 8.5M image pairs

模型设置大致是:

  • Encoder:ViT-Large;
  • Decoder:ViT-Base;
  • Head:DPT head;
  • 初始化:CroCo pretrained model;
  • 输入分辨率:先 224,再到 512;
  • 测试时最长边 resize 到 512。

论文反复强调一点:

同一个 DUSt3R 模型被用于多个下游任务,没有为每个任务单独 finetune。

这正是它的统一性来源。


#8. 实验结果说明什么?

论文评估了多个任务:

  1. visual localization;
  2. multi-view pose estimation;
  3. monocular depth;
  4. multi-view depth;
  5. 3D reconstruction;
  6. ablation。

#8.1 Visual Localization

在 7Scenes 和 Cambridge Landmarks 上,DUSt3R 可以作为 pixel matcher 来做 absolute pose estimation。

它没有专门为 visual localization 训练,但可以接近甚至在部分场景超过 HLoc 等强 baseline。

这说明 DUSt3R 学到的 pointmap 表示有可迁移的几何信息。

#8.2 Multi-view Pose Estimation

在 CO3Dv2 和 RealEstate10K 上,DUSt3R 512 表现很强。

论文中 DUSt3R 512 使用 PnP 时:

  • CO3Dv2 RRA@15:94.3;
  • CO3Dv2 RTA@15:88.4;
  • CO3Dv2 mAA@30:77.2;
  • RealEstate10K mAA@30:61.2。

使用 global alignment 时:

  • CO3Dv2 RRA@15:96.2;
  • CO3Dv2 RTA@15:86.8;
  • CO3Dv2 mAA@30:76.7;
  • RealEstate10K mAA@30:67.7。

相比 PoseDiffusion 等方法有明显优势。

#8.3 Monocular Depth

单目深度任务里,DUSt3R 输入 ,取 pointmap 的 z 坐标作为深度。

在 DDAD、KITTI、BONN、NYUv2、TUM 等数据集上,DUSt3R 作为 zero-shot transfer 方法,表现接近甚至超过不少监督或自监督方法。

这说明它不只是学会了双目匹配,也学到了强单目 3D 先验。

#8.4 Multi-view Depth

DUSt3R 的特点是:

不用 GT pose,不用 depth range,不用 intrinsics,也能做 multi-view depth。

在论文的 multi-view depth 表格中,DUSt3R 512 在无 pose、无 depth range、无 intrinsics 的设置下,平均表现很强:

  • average rel:4.73;
  • average inlier ratio:64.52;
  • time:0.13s。

当然,定量评估时仍然需要通过 median scale alignment 处理尺度不确定性。

#8.5 3D Reconstruction

在 DTU 上,DUSt3R 的极限精度不如专门的 MVS 方法。

比如 Table 4 中:

  • GeoMVSNet overall:0.295 mm;
  • DUSt3R 512 overall:1.741 mm。

但条件完全不同:

  • 传统强 MVS 通常使用 GT camera;
  • 许多方法还针对 DTU 训练;
  • DUSt3R 不用相机参数,不在 DTU 上 finetune,直接 zero-shot。

所以这里不能只看谁的数字小。DUSt3R 的卖点不是“摄影测量级最高精度”,而是:

用极少先验,实现 plug-and-play 的 unconstrained 3D reconstruction。


#9. 和传统 SfM / MVS 的本质区别

维度传统 SfM / MVSDUSt3R
输入多张图,通常需要已知或可估相机参数任意图像集合,无需已知内外参
核心中间量特征匹配、相机 pose、稀疏点云、深度图pointmap
几何约束强依赖 projective geometry网络隐式学习几何
pipeline多阶段复杂流水线pairwise network + global alignment
优点几何精确,可解释,极限精度高通用、简单、robust、无需 calibration
缺点容易因某一步失败而崩可能不满足严格几何,精细精度不如专门 MVS
适用场景高质量摄影测量、已知/可估相机in-the-wild、多设备、少先验、快速重建

#10. 局限:它不是万能 3D 重建器

#10.1 Regression 的极限精度不如三角化

传统 MVS 如果有准确相机参数,可以做亚像素级匹配和三角化。DUSt3R 是神经网络直接回归 3D 坐标,天然会有 regression smoothing 问题。

所以在高精度 benchmark 上,它不一定能超过专门 MVS 方法。

#10.2 几何一致性不是硬约束

论文自己也指出,DUSt3R 的 pointmap 不一定严格对应某个物理可行的 camera model。

这意味着:

  • 局部可能看起来合理;
  • 但全局可能有不一致;
  • 相机恢复是后处理,不是网络硬性保证的结果。

#10.3 尺度仍然不确定

DUSt3R 通常恢复的是 up-to-scale 的几何。

这对相对 pose、可视化、场景理解等任务足够,但如果需要真实物理尺度,比如机器人操作、测量和工程建模,就需要额外尺度信息。

#10.4 多视图一致性依赖后处理

基础网络只处理 pair。多图时仍然需要构图和 global alignment。

这比传统 BA 简洁,但不是完全一次性端到端输出。

#10.5 数据驱动方法会有 domain gap

遇到训练数据覆盖不足的场景,例如医学图像、水下、红外、极端工业环境、透明/反光材料、动态物体等,性能可能下降。


#11. 为什么 DUSt3R 重要?

DUSt3R 的贡献不只是“又一个 3D 重建模型”,而是提出了一种新的 3D vision 范式。

传统几何视觉是:

先估计相机和对应关系
再恢复 3D

DUSt3R 是:

先直接预测一个强 3D 表示
再从表示中读出相机、匹配、深度、pose、重建

这和 foundation model 的思想很像:

不再为每个任务设计一个 pipeline,而是学习一个中间表示,让多个任务从这个表示中派生出来。

在 NLP 里,我们从手工特征走向 language representation;在 2D vision 里,我们从任务专用网络走向 visual foundation model;而 DUSt3R 在 3D 几何视觉里尝试学习一个 dense pixel-aligned 3D representation

这也是它后来能影响 MASt3R 等工作的原因。


#12. 对 LLM Agent / 世界模型方向的启发

从 wenjun 关心的 LLM Agent 和 model-based RL 角度看,DUSt3R 有一个很值得借鉴的范式:

不要先手工拆出所有中间变量;先学习一个足够强的 latent / structured representation,再让任务从表示中读出。

DUSt3R 没有显式先求 camera pose,而是学习 pointmap;pose、matching、depth、3D reconstruction 都从 pointmap 中派生。

类比到 Agent:

  • 传统 Agent pipeline 可能会手工拆成 state tracking、tool selection、planning、reflection、memory update 等模块;
  • 但更基础的问题可能是:能不能学习一个足够好的 latent state / world representation,让这些能力从表示中自然读出?

DUSt3R 对 3D vision 的启发是:

一个好的中间表示,可以把很多原本复杂的显式推理问题变成简单读出问题。

这对 model-based RL、latent-space reasoning、agent world model 都有类似启发。


#13. 最后总结

DUSt3R 可以用一句话概括:

传统 3D 重建像是在做一道复杂几何题:先算相机、再找匹配、再三角化、再优化。DUSt3R 则训练一个模型,让它看到两张图后直接预测每个像素对应的 3D 点,而且两张图的 3D 点已经在同一个坐标系里。一旦有了这个 pointmap,深度、匹配、相机位姿和 3D 重建都可以从里面读出来。

它牺牲了一些传统 MVS 在受控场景下的极限精度,但换来了:

  • 无需相机标定;
  • 无需已知 pose;
  • 支持任意图像集合;
  • 同一个模型统一多个 3D 任务;
  • 更接近 3D foundation representation 的路线。

所以这篇论文的范式意义大于单项指标:它把几何视觉从“显式求解 pipeline”推进到“可学习的通用 3D 表示”。