DUSt3R论文阅读笔记

DUSt3R

Dense and Unconstrained Stereo 3D Reconstruction of arbitrary image collections

用于任意图像集合的稠密无约束立体三维重建,且在没有相机标定和视点姿态的先验信息的情况下操作

一、起源

任务 (Task):

希望构建一个网络来解决通用立体视觉下的 3D 重建任务,并且通过直接回归的方式

先前方法的技术挑战 (Technical challenge for previous methods):

1. 广泛角度的挑战
  1. 先前的方法主要是将之前多个子领域的研究成果融合而成.依赖具体的数学方法,比如说:关键的检测与匹配,鲁棒估计,SfM,BA,MVS
    (其中SfM 与 MVS 流水线本质上是在解决一系列基本问题:匹配点、求解本质矩阵、三角化点、稀疏重建场景、估计相机参数,最后再进行稠密重建。)

  2. 每一个子问题都不可能被完美解决,会将误差传递给下一个步骤,从而增加系统整体的复杂度与工程开发难度。这条流水线中的一些关键步骤非常脆弱,容易在多种情况下失效,比如:视角数量太少、物体表面非朗伯特反射、相机运动不足等。

  3. 子问题的求解之间大多没有交互,例如稠密重建并不能有效利用先前重建出的稀疏场景信息,反之亦然。

2. 从单张图像直接预测三维几何的挑战:
  1. 利用类别级别的物体先验,遇到没见过的类别就不行了

  2. 不限定类别,想从任何图像中还原出场景的深度的挑战——本质上仍受到深度估计质量的制约,尤其是在单目设置中问题更加严重。

解决挑战的关键洞察 (Key insight)

  1. 之前的研究提出了基于多个视角图像的神经网络用于3D重建,它们的思路是“把传统的SfM流程做成可微的形式”,这样就可以使用神经网络整体学习这个流程,而不再需要手工执行每个中间步骤。但是这类方法依然需要输入真实的相机内参,且输出通常为深度图和相对相机位姿。
  2. 让模型要具有通用性,不依赖具体方法流程。使用pointmap —— 即密集的二维三维点场,不显式预测相机位姿,而是通过网络隐式处理,从而使整个回归问题更加可解。一开始无需知道相机内参,采用纯粹的数据驱动方法
  3. 使用能够包含丰富信息(参数)的3D点图。它同时编码了 (a) 场景的三维几何信息,(b) 像素与三维点之间的关系,以及 © 两个视角之间的几何关系。
  4. 处理输入图像的同时,也同时学习并输出点图,从而使网络能将 2D 图像结构和 3D 形状关联起来。网络 F 的结构灵感来源于 CroCo

二、方法

Pipeline
  1. 把两张图像分别“切成拼图块”,提取图像片段特征(ViT 编码器);

  2. 让两张图像“相互对话”,讨论哪块图在哪个空间位置(transformer decoder + cross-attention);

  3. 得出每个拼图块的“实际 3D 位置”和“置信度”(回归头输出点图 + 置信图);

  4. 所有点图都统一到第一张图的空间坐标中

网络结构

网络 F 的结构灵感来源于 CroCo ,因此可以直接充分利用 CroCo 的预训练模型。如图所示,整个网络由两个相同的分支组成(每个分支处理一张图像),每个分支包括一个图像编码器、一个解码器和一个回归头。

在这里插入图片描述

两张输入图像首先通过一个共享权重的 Vision Transformer(ViT)编码器以“孪生方式”(Siamese manner)进行编码,得到两个 token 表示:

F1 = Encoder(I1),F2 = Encoder(I2)。

接下来,网络在解码器中联合地对这两个特征进行推理。类似于 CroCo,解码器是一个带有交叉注意力(cross-attention)的通用 Transformer 网络。每一个解码器模块依次执行以下操作:

  1. 自注意力(self-attention):每个 token 只关注自己图像的其他 token;
  2. 交叉注意力(cross-attention):每个 token 关注另一张图像中的所有 token;
  3. 前馈网络(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在没有相机标定信息的情况下能够实现准确的三维重建。

三、实验

过程:

  1. 训练目标仅依赖于 3D 空间中的回归损失;
  2. 回归损失是网络预测点与真实点的欧氏距离;
  3. 为了解决预测和真实值之间的尺度模糊问题,作者对所有点进行了归一化。
  4. 真实世界中,有些像素的 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)=arg⁡min⁡b∥Xbn−Xam∥NN_{n,m}(a) = \arg\min_b \| X^n_{b} - X^m_{a} \|NNn,m(a)=argminbXbnXam

即:图像 ImI_mIm 中的点 aaa,在图像 InI_nIn 中寻找与其最近的三维点作为匹配点。
在这里插入图片描述

2. 相机内参恢复(Recovering Intrinsics)

目标: 恢复摄像机的焦距(focal length)。

思路: 因为点图是表达在图像自身坐标系下的,可以通过如下优化问题估算焦距 f1∗f^*_1f1

f1∗=arg⁡min⁡f1∑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=0Wj=0HC1i,j1(i,j)f1X1i,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)=(i2W,j2H):以图像中心为原点的像素坐标;
  • 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,1X1,2Procrustes 对齐,求解缩放、旋转和平移:

P∗=arg⁡min⁡σ,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,tminiC1i1C2i1σ(RX1i1+t)X2i12

这种方法可以闭式求解(closed-form),但对噪声和离群点敏感。
更鲁棒的方式: 使用 PnP + RANSAC

4. 绝对姿态估计(Absolute Pose Estimation)

又称视觉定位(Visual Localization)

步骤:

  1. 给定查询图像 IQI_QIQ,先估算其内参;
  2. 若存在参考图像 IBI_BIB,并可从中得到 2D-3D 对应关系,则使用 PnP + RANSAC 求得 IQI_QIQ 的相机位姿;
  3. 或者:先估计 IQI_QIQ 相对于 IBI_BIB相对位姿
  4. 最后,通过已知 XBBX^B_BXBB 与其 Ground Truth 的缩放比例,将相对姿态转换为世界坐标下的绝对姿态

question

1. dense的体现?

one-to-one mapping between image pixels and
3D scene points

2. 怎么从二维图像 I 变成一个三维点图(pointmap)X?

  1. 方法一:显式几何重建(使用深度图 + 相机内参),用投影公式转换:每个图像像素 (i, j) 可以看作是一个相机射线(通过相机光心穿过该像素)。
    只要知道这个射线打到了哪里(即该像素的深度 D[i, j]),就可以算出 3D 坐标。
    在这里插入图片描述

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

3. 为什么通过网络F两张图片可以直接输出同一坐标系下的点图?

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

06-07
### dust3r IT工具及相关技术 #### 简介 dust3r 是一种与 3D 重建相关的技术,其主要功能是在零样本(zero-shot setting)环境下完成高质量的 3D 模型重建。它依赖于深度学习模型和强大的计算框架,例如 PyTorch 和 CUDA 工具包。部署 dust3r 时需要确保环境配置正确,包括 Python、CMake、PyTorch 和 CUDA 的兼容性[^1]。 #### 环境配置 在部署 dust3r 时,推荐使用 Conda 创建独立的虚拟环境以避免依赖冲突。以下是一个典型的 Conda 环境配置示例: ```bash conda create -n dust3r python=3.11 cmake=3.14.0 conda activate dust3r ``` 此外,需要安装特定版本的 PyTorch,这可以通过 PyTorch 官方文档提供的命令完成。如果遇到 CUDA 工具包不完整的问题,可能需要手动安装完整的 NVIDIA CUDA Toolkit,并确保其与 PyTorch 版本兼容[^3]。 #### 技术特点 dust3r 的核心技术在于其能够在没有先验信息的情况下完成 3D 重建。这种能力被称为“零样本设置”(zero-shot setting),即模型无需关于场景或相机参数的任何先验知识即可生成高质量的 3D 模型[^2]。这种技术的应用场景包括但不限于: - 增强现实(AR) - 虚拟现实(VR) - 自动驾驶中的环境感知 - 医疗成像中的三维重建 #### 代码示例 以下是一个简单的 PyTorch 环境检查脚本,用于验证 dust3r 所需的依赖是否正确安装: ```python import torch print("CUDA Available:", torch.cuda.is_available()) print("CUDA Version:", torch.version.cuda) print("PyTorch Version:", torch.__version__) ``` #### 相关工具 除了 dust3r 本身,还有一些与其功能类似或互补的工具和技术: 1. **COLMAP**:一种开源的结构化光束调整(SfM)和多视图立体视觉(MVS)软件,常用于 3D 重建。 2. **NeRF (Neural Radiance Fields)**:一种基于神经网络的 3D 场景表示方法,能够生成高分辨率的 3D 图像。 3. **Open3D**:一个用于 3D 数据处理的开源库,支持点云操作、网格处理和可视化。 4. **Blender**:一款功能强大的 3D 建模软件,可以与 dust3r 配合使用进行后处理。 #### 常见问题及解决方案 在部署 dust3r 时,用户可能会遇到以下常见问题: 1. **CUDA 工具包不完整**:如引用中提到,Anaconda 安装的 cudatoolkit 可能不完整,建议从 NVIDIA 官方网站下载完整的 CUDA Toolkit 并手动配置路径[^3]。 2. **PyTorch 版本不匹配**:确保 PyTorch 的版本与 CUDA 版本兼容,可通过官方文档选择正确的安装命令[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值