论文阅读-MapAnything: Universal Feed-Forward Metric 3D Reconstruction

2025-10-08发布于论文随笔 | 最后更新于2025-10-09 10:10:00

meta 3D reconstruction

Meta AI团队的又一力作,arXiv原文链接MapAnything: Universal Feed-Forward Metric 3D Reconstruction

基本介绍

之前的方法,大多无法灵活可选地输入各种几何条件(例如相机参数、深度图等)。前作[[VGGT]]也需要在模型内部估计相机参数。主要贡献点如下:

  1. 大一统模型:支持超过12种任务配置,并且能可选地输入各种各样的已知几何条件
  2. 分解式场景表示:模型输出多种形式的数据,而不是只有一个重建后的3D场景,同时也没有耗时的后处理,直接给出结果。

具体方法

输入N个视角的图片 \(\hat{\mathcal{I}} = ( \hat{I}_i)_{i=1}^{N}\) ,全部或部分输入视角的几何信息(ray direction \(\hat{\mathcal{R}}\) 、第一个视角的位姿四元数 \(\hat{\mathcal{Q}}\) 和平移 \(\hat{\mathcal{T}}\) 、ray depth \(\hat{\mathcal{D}}\));

最后会输出所有视角的信息,包括全局放缩因子 \(m\in\mathbb{R}\) 、每个视角的Ray Direction \(R_i\in\mathbb{R}^{3\times H\times W}\) 、Ray Depth \(\hat{D_i}\in\mathbb{R}^{1\times H\times W}\) 、相对于第一个视角的位姿 \(\hat{P_i}\in\mathbb{R}^{4\times 4}\)(其中包含四元数 \(Q_i\) 和平移向量 \(\tilde{T_i}\in\mathbb{R}^3\)

$$ f_{\mathrm{MapAnything}}\left(\hat{\mathcal{I}}, \left[\hat{\mathcal{R}}, \hat{\mathcal{Q}}, \hat{\mathcal{T}}, \hat{\mathcal{D}}\right]\right) = \left\{ m, \left(R_i, \tilde{D}_i, \tilde{P}_i\right)_{i=1}^{N} \right\} $$

有了这些输出,就可以简单地得到每个像素的3D点(相对于各视角自己的相机坐标系) \(\tilde{L}_i = R_i \cdot \tilde{D}_i \in \mathbb{R}^{3 \times H \times W}\) ;以及世界坐标系下的3D点 \(\tilde{X}_i = O_i \cdot \tilde{L}_i + \tilde{T}_i\) ,其中的 \(O_i\) 可从 \(Q_i\) 推出;最终乘上缩放因子就可以得到真实世界下的点云 \(X_i^{\text{metric}}=m\cdot \tilde{X}_i\)

框架图如下:

MapAnything框架图

图片与几何信息的编码

各个视角的RGB图片使用ViT-L版本的DINOv2编码为特征 \(F_I\in\mathbb{R}^{1024\times H/14\times W/14}\)

Ray Depth使用平均值标准化,先分别求每张ray depth的平均值 \(\hat{z}_{di}\in\mathbb{R}^+\),再标准化每张给入的ray depth \(\hat{D}_i/\hat{z}_{di}\)

平移向量则使用平均距离进行标准化,先求 \(\hat{z}_p=\frac{1}{|S_t|}\Sigma_{i\in S_t}{||\hat{T}_i||}\) ,其中的 \(S_t\) 为拥有平移向量的视角索引集合,接着进行标准化 \(\hat{T}_i/\hat{z}_p\)

将Ray Direction和按上述标准化后的Ray Depth经由一个较浅的卷积编码器编码,并且pixel unshuffle,最后可以得到和RGB一样尺寸的特征 \(F_R, F_D\in\mathbb{R}^{1024\times H/14\times W/14}\)

一些和具体像素内容无关的参数通过MLP与GeLU简单映射为1024维,包括四元数、平均标准化后的平移向量、ray depth平均值、平移平均值,即 \(F_Q, F_T, F_{\hat{z}_d}, F_{\hat{z}_p} \in \mathbb{R}^{1024}\)

把刚才提到的所有编码结果(\(F_I, F_R, F_D, F_Q, F_T, F_{\hat{z}_d}, F_{\hat{z}_p}\))经过一些标准化和相加操作,对于每一帧都可以得到一个 \(F_E\in\mathbb{R}^{1024\times (HW/256)}\)

另外,为锚定与区分作为起始参考的第一个视角,会在首个视角的编码结果上加一个不变的参考视角编码(constant reference view embedding)。

最后,在所有视角的patch token前,添加一个可学习的scale token来进行跨视角的信息聚合,后续用来预测全局缩放因子。

预测部分

Multi-View Transformer由24层VGTT中提出的alternating-attention transformer、若干多头注意力、MLP维度映射组成,得到的是768长度的token。

使用单个DPT解码所有视角的token,得到所有视角各种类别的预测输出;使用卷积pose head解码姿态四元数;之前拼接的scale token在此处的结果会经过一个带ReLU的两层MLP,来预测缩放因子\(m\)

训练方式

损失设计

为不同预测类别设计损失,以实现端到端的统一场景表征。下文中所有带hat的符号为ground truth

Ray Direction和相机姿态与缩放因子无关,它们的损失为:

$$ \begin{aligned} \mathcal{L}_{\mathrm{rays}} &= \sum_{i=1}^{N} \left\| \hat{R}_i - R_i \right\|\\ \mathcal{L}_{\mathrm{rots}}&=\sum_{i=1}^{N} \min\left( \left\| \hat{Q}_i - Q_i \right\|, \left\| -\hat{Q}_i - Q_i \right\| \right) \end{aligned} $$

位移的损失如下,其中的\(V_i\)为有效区域的掩码,与DUSt3R: Geometric 3D Vision Made Easy中的相同,中括号表示根据掩码进行索引;\(\tilde{X}\)为预测的全局点云:

$$ \begin{aligned} \hat{z} = \left\| \left( \hat{X}_i[V_i] \right)_{i=1}^{N} \right\| \Big/ \sum_{i=1}^{N} V_i\\ \tilde{z} = \left\| \left( \tilde{X}_i[V_i] \right)_{i=1}^{N} \right\| \Big/ \sum_{i=1}^{N} V_i\\ \mathcal{L}_{\mathrm{translation}} = \sum_{i=1}^{N} \left\| \hat{T}_i/\hat{z} - \tilde{T}_i/\hat{z} \right\| \end{aligned} $$

Ray Depth的损失如下:

$$ \begin{aligned} f_{\mathrm{log}} : \mathbf{x} \to \left( \mathbf{ x}/\|\mathbf{x}\| \right) \cdot \log\left(1 + \|\mathbf{x}\|\right)\\ \mathcal{L}_{\mathrm{depth}} = \sum_{i=1}^{N} \left\| f_{\mathrm{log}}\left( \hat{D}_i/\hat{z} \right) - f_{\mathrm{log}}\left( \tilde{D}_i/\hat{z} \right) \right\| \end{aligned} $$

局部(单个视角内)点云local pointmap的损失如下:

$$ \mathcal{L}_{\mathrm{lpm}} = \sum_{i=1}^{N} \left\| f_{\mathrm{log}}\left( \hat{L}_i/\hat{z} \right) - f_{\mathrm{log}}\left( \tilde{L}_i/\hat{z} \right) \right\| $$

置信度加权的全局点云损失:

$$ \mathcal{L}_{\mathrm{pointmap}} = \sum_{i=1}^{N} \left( C_i \left\| f_{\mathrm{log}}\left( \hat{X}_i/\hat{z} \right) - f_{\mathrm{log}}\left( \tilde{X}_i/\hat{z} \right) \right\| - \alpha \log(C_i) \right) $$

以及缩放因子的损失,其中的sg表示stop grad,即将变量值detach后再继续参与运算,不对之后的梯度产生影响:

$$ \begin{aligned} z^{\mathrm{metric}} &= m \cdot \mathrm{sg}(\tilde{z})\\ \mathcal{L}_{\mathrm{scale}} &= \left\| f_{\mathrm{log}}(\hat{z}) - f_{\mathrm{log}}(z^{\mathrm{metric}}) \right\| \end{aligned} $$

最终的总损失如下,其中的\(\mathcal{L}_{\text{normal}}\)为法线损失;\(\mathcal{L}_{GM}\)为gradient matching损失,用于约束Ray depth在空间上的梯度。考虑到真实场景数据集没有这两种精准数据,这两种损失仅在合成数据集上添加:

$$ \begin{align*} \mathcal{L} = &10 \cdot \mathcal{L}_{\mathrm{pointmap}} + \mathcal{L}_{\mathrm{rays}} + \mathcal{L}_{\mathrm{rot}} + \mathcal{L}_{\mathrm{translation}} + \mathcal{L}_{\mathrm{depth}} \\ &+ \mathcal{L}_{\mathrm{lpm}} + \mathcal{L}_{\mathrm{scale}} + \mathcal{L}_{\mathrm{normal}} + \mathcal{L}_{\mathrm{GM}} + 0.1 \cdot \mathcal{L}_{\mathrm{mask}} \end{align*} $$

流程设计

为了提高鲁棒性与可泛化性,训练时提供几何信息的概率为90%;提供几何信息时,ray direction、ray depth与pose提供的概率均为50%;若提供了ray depth,完整深度图与随机缺失10%的稀疏深度图也会同时提供。另外,以5%的概率不提供给缩放因子。

在为某一场景选择视角时,会先两两计算共视性,并以25%的阈值构建共视性图,通过随机游走以在某个连通子图中选择视角。

实验结果

下面两张可视化分别是与前作VGGT的对比,以及在不同风格下单视角仅提供RGB图片的重建结果:

与VGGT的可视化对比

单视角仅图片重建

下图展示了随着提供的视角增加,提供不同设定下数据的重建效果:

不同设定下的重建效果

表2为双视角重建任务中,各种输入设定下的性能表现;表3为single image calibration(相机参数估计)任务中的性能表现;表4为单/多视角输入设定下,深度估计任务的性能表现。

性能对比表

下表a展示了统一不同数据形式的性能表现,说明统一ray、depth、pose同时预测scale这样的配置性能最佳;表b展示了在多任务上训练的统一模型比在单任务上训练特有模型的效果好。

统一表示与多任务训练消融