#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 表示”。

#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。

整体流程是:
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 大致包括:
- self-attention:看自己这张图内部;
- cross-attention:看另一张图;
- 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。

#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:
- 先用 pointmap 得到 2D-2D 匹配,再用经典 epipolar geometry;
- 直接对齐两组 3D 点,用 Procrustes alignment;
- 用 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. 实验结果说明什么?
论文评估了多个任务:
- visual localization;
- multi-view pose estimation;
- monocular depth;
- multi-view depth;
- 3D reconstruction;
- 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 / MVS | DUSt3R |
|---|---|---|
| 输入 | 多张图,通常需要已知或可估相机参数 | 任意图像集合,无需已知内外参 |
| 核心中间量 | 特征匹配、相机 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 表示”。