DUSt3R
Dense and Unconstrained Stereo 3D Reconstruction of arbitrary image collections
用于任意图像集合的稠密无约束立体三维重建,且在没有相机标定和视点姿态的先验信息的情况下操作
一、起源
任务 (Task):
希望构建一个网络来解决通用立体视觉下的 3D 重建任务,并且通过直接回归的方式
先前方法的技术挑战 (Technical challenge for previous methods):
1. 广泛角度的挑战
-
先前的方法主要是将之前多个子领域的研究成果融合而成.依赖具体的数学方法,比如说:关键的检测与匹配,鲁棒估计,SfM,BA,MVS
(其中SfM 与 MVS 流水线本质上是在解决一系列基本问题:匹配点、求解本质矩阵、三角化点、稀疏重建场景、估计相机参数,最后再进行稠密重建。) -
每一个子问题都不可能被完美解决,会将误差传递给下一个步骤,从而增加系统整体的复杂度与工程开发难度。这条流水线中的一些关键步骤非常脆弱,容易在多种情况下失效,比如:视角数量太少、物体表面非朗伯特反射、相机运动不足等。
-
子问题的求解之间大多没有交互,例如稠密重建并不能有效利用先前重建出的稀疏场景信息,反之亦然。
2. 从单张图像直接预测三维几何的挑战:
-
利用类别级别的物体先验,遇到没见过的类别就不行了
-
不限定类别,想从任何图像中还原出场景的深度的挑战——本质上仍受到深度估计质量的制约,尤其是在单目设置中问题更加严重。
解决挑战的关键洞察 (Key insight)
- 之前的研究提出了基于多个视角图像的神经网络用于3D重建,它们的思路是“把传统的SfM流程做成可微的形式”,这样就可以使用神经网络整体学习这个流程,而不再需要手工执行每个中间步骤。但是这类方法依然需要输入真实的相机内参,且输出通常为深度图和相对相机位姿。
- 让模型要具有通用性,不依赖具体方法流程。使用pointmap —— 即密集的二维三维点场,不显式预测相机位姿,而是通过网络隐式处理,从而使整个回归问题更加可解。一开始无需知道相机内参,采用纯粹的数据驱动方法
- 使用能够包含丰富信息(参数)的3D点图。它同时编码了 (a) 场景的三维几何信息,(b) 像素与三维点之间的关系,以及 © 两个视角之间的几何关系。
- 处理输入图像的同时,也同时学习并输出点图,从而使网络能将 2D 图像结构和 3D 形状关联起来。网络 F 的结构灵感来源于 CroCo
二、方法
Pipeline
-
把两张图像分别“切成拼图块”,提取图像片段特征(ViT 编码器);
-
让两张图像“相互对话”,讨论哪块图在哪个空间位置(transformer decoder + cross-attention);
-
得出每个拼图块的“实际 3D 位置”和“置信度”(回归头输出点图 + 置信图);
-
所有点图都统一到第一张图的空间坐标中
网络结构
网络 F 的结构灵感来源于 CroCo ,因此可以直接充分利用 CroCo 的预训练模型。如图所示,整个网络由两个相同的分支组成(每个分支处理一张图像),每个分支包括一个图像编码器、一个解码器和一个回归头。

两张输入图像首先通过一个共享权重的 Vision Transformer(ViT)编码器以“孪生方式”(Siamese manner)进行编码,得到两个 token 表示:
F1 = Encoder(I1),F2 = Encoder(I2)。
接下来,网络在解码器中联合地对这两个特征进行推理。类似于 CroCo,解码器是一个带有交叉注意力(cross-attention)的通用 Transformer 网络。每一个解码器模块依次执行以下操作:
- 自注意力(self-attention):每个 token 只关注自己图像的其他 token;
- 交叉注意力(cross-attention):每个 token 关注另一张图像中的所有 token;
- 前馈网络(MLP):对 token 进行非线性变换。
值得注意的是,在解码过程中,两个分支之间的信息是持续交互的。这种机制对输出空间对齐的点图(pointmaps) 至关重要。具体而言,每一个解码器模块都会关注来自另一个分支的 token:
G1_i = DecoderBlock1_i(G1_{i-1}, G2_{i-1})
G2_i = DecoderBlock2_i(G2_{i-1}, G1_{i-1})
其中 i = 1,...,B 表示解码器的第 i 个 block,总共 B 层。初始输入为编码器输出的 token,即:
G1_0 := F1,G2_0 := F2。
这里,DecoderBlock^v_i(G1, G2) 表示第 v(v ∈ {1,2})个分支的第 i 层解码器模块,G1 是当前分支的输入 token,G2 是来自另一个分支的 token。
最后,每个分支都有一个独立的回归头,它接收整组 decoder token,输出一个 3D 点图(pointmap)和一个对应的置信图(confidence map):
X1,1, C1,1 = Head1(G1_0, ..., G1_B)
X2,1, C2,1 = Head2(G2_0, ..., G2_B)
技术贡献 (Technical contribution)
-
用来解决什么:
解决传统三维重建方法依赖精确相机标定和视点姿态的问题。 -
具体做法:
提出了点图(pointmap)表示法,该方法通过学习图像中的2D模式与3D形状之间的关系,直接回归出3D场景而不需要事先获取相机参数。该方法不强制使用几何约束,而是通过数据驱动学习几何和形状先验。 -
为什么有效:
点图表示法简化了3D重建过程,使得多个图像的重建可以在一个共同参考框架内进行,而无需额外的相机参数。这使得DUSt3R在没有相机标定信息的情况下能够实现准确的三维重建。
三、实验
过程:
- 训练目标仅依赖于 3D 空间中的回归损失;
- 回归损失是网络预测点与真实点的欧氏距离;
- 为了解决预测和真实值之间的尺度模糊问题,作者对所有点进行了归一化。
- 真实世界中,有些像素的 3D GT 是不可靠的(如天空、透明区域),网络应该学会对不确定区域降低损失影响。为此,作者引入每个像素的置信度分数。
结果 (Result):
DUSt3R在单目和多视角深度估计、相对姿态估计等多个3D视觉任务中设置了新的性能记录,表现出色。
贡献(下游应用):
1. 点匹配(Point Matching)
目标: 在两张图像之间建立像素点的对应关系(correspondence)。
方法:
使用3D 点图空间中的最近邻(Nearest Neighbor, NN)搜索实现。为提高准确率,采用互惠匹配(reciprocal matching),即:
- M1,2={(a,b)∣a=NN1,2(b) 且 b=NN2,1(a)}M_{1,2} = \{(a, b) | a = NN_{1,2}(b) \text{ 且 } b = NN_{2,1}(a)\}M1,2={(a,b)∣a=NN1,2(b) 且 b=NN2,1(a)}
其中:
- NNn,m(a)=argminb∥Xbn−Xam∥NN_{n,m}(a) = \arg\min_b \| X^n_{b} - X^m_{a} \|NNn,m(a)=argminb∥Xbn−Xam∥
即:图像 ImI_mIm 中的点 aaa,在图像 InI_nIn 中寻找与其最近的三维点作为匹配点。

2. 相机内参恢复(Recovering Intrinsics)
目标: 恢复摄像机的焦距(focal length)。
思路: 因为点图是表达在图像自身坐标系下的,可以通过如下优化问题估算焦距 f1∗f^*_1f1∗:
f1∗=argminf1∑i=0W∑j=0HC1i,j1∥(i′,j′)−f1⋅(X1i,j,01,X1i,j,11)X1i,j,21∥ f_1^* = \arg\min_{f_1} \sum_{i=0}^W \sum_{j=0}^H C^1_{1_{i,j}} \left\| (i', j') - f_1 \cdot \frac{(X^1_{1_{i,j,0}}, X^1_{1_{i,j,1}})}{X^1_{1_{i,j,2}}} \right\| f1∗=argf1mini=0∑Wj=0∑HC1i,j1(i′,j′)−f1⋅X1i,j,21(X1i,j,01,X1i,j,11)
其中:
- (i′,j′)=(i−W2,j−H2)(i', j') = (i - \frac{W}{2}, j - \frac{H}{2})(i′,j′)=(i−2W,j−2H):以图像中心为原点的像素坐标;
- X1i,j1X^1_{1_{i,j}}X1i,j1:对应点的3D坐标;
- C1i,j1C^1_{1_{i,j}}C1i,j1:对应像素的置信度。
该优化可通过 Weiszfeld 算法等快速求解。
第二张图像的焦距 f2∗f_2^*f2∗ 可通过交换图像顺序再次推理。
3. 相对姿态估计(Relative Pose Estimation)
方法一:
- 做 2D 匹配;
- 恢复内参;
- 求解本质矩阵(Epipolar Matrix);
- 进一步恢复相对姿态。
方法二(更直接):
- 对点图 X1,1↔X1,2X_{1,1} \leftrightarrow X_{1,2}X1,1↔X1,2 做 Procrustes 对齐,求解缩放、旋转和平移:
P∗=argminσ,R,t∑iC1i1C2i1∥σ(RX1i1+t)−X2i1∥2 P^* = \arg\min_{\sigma, R, t} \sum_i C^1_{1_i} C^1_{2_i} \| \sigma (R X^1_{1_i} + t) - X^1_{2_i} \|^2 P∗=argσ,R,tmini∑C1i1C2i1∥σ(RX1i1+t)−X2i1∥2
这种方法可以闭式求解(closed-form),但对噪声和离群点敏感。
更鲁棒的方式: 使用 PnP + RANSAC。
4. 绝对姿态估计(Absolute Pose Estimation)
又称视觉定位(Visual Localization)。
步骤:
- 给定查询图像 IQI_QIQ,先估算其内参;
- 若存在参考图像 IBI_BIB,并可从中得到 2D-3D 对应关系,则使用 PnP + RANSAC 求得 IQI_QIQ 的相机位姿;
- 或者:先估计 IQI_QIQ 相对于 IBI_BIB 的相对位姿;
- 最后,通过已知 XBBX^B_BXBB 与其 Ground Truth 的缩放比例,将相对姿态转换为世界坐标下的绝对姿态。
question
1. dense的体现?
one-to-one mapping between image pixels and
3D scene points
2. 怎么从二维图像 I 变成一个三维点图(pointmap)X?
-
方法一:显式几何重建(使用深度图 + 相机内参),用投影公式转换:每个图像像素 (i, j) 可以看作是一个相机射线(通过相机光心穿过该像素)。
只要知道这个射线打到了哪里(即该像素的深度 D[i, j]),就可以算出 3D 坐标。

-
方法二:DUSt3R 的方式:直接学习一个从图像到点图的回归函数,不需要相机参数,直接输出每个像素对应的 3D 点:虽然网络不知道相机内参和位姿,但通过跨图像交互、注意力机制和训练数据,它学会了如何构建一致的点图

3. 为什么通过网络F两张图片可以直接输出同一坐标系下的点图?
统一规定了以第一张输入图片的坐标系作为参考坐标系。能够直接输出同一坐标系下的点图主要是因为交叉注意力机制。每一个解码器模块都会关注来自另一个分支的 token。
846

被折叠的 条评论
为什么被折叠?



