跳到主要内容

MASt3R:在 3D 中锚定图像匹配

论文:Grounding Image Matching in 3D with MASt3R
作者:Vincent Leroy, Yohann Cabon, Jerome Revaud
机构:NAVER LABS Europe
arXiv:2406.09756
代码:naver/mast3r
论文地址:arXiv 2406.09756

这篇论文解决什么问题

图像匹配本质上是在回答:

图像 1 的这个像素

图像 2 的哪个像素
看到了同一个 3D 点?

传统方法通常把它当作 2D 图像问题:

keypoint detection
-> local descriptor
-> descriptor matching
-> RANSAC / geometry verification

LoFTR、DKM 这类 dense matching 方法已经不再依赖稀疏 keypoints,但整体仍主要在 2D 图像空间里建立对应关系。

MASt3R 的核心观点是:

matching 不是纯 2D 问题,而是一个被 3D 几何约束的对应问题。

所以它基于 DUSt3R 做扩展:保留 DUSt3R 的 pointmap 回归能力,同时新增一个 dense local feature head,让模型显式学习更精确的像素级匹配。

MASt3R 架构重绘示意图

图源说明:根据 Leroy et al., MASt3R 的模型结构描述重绘,非论文原图。

一句话版本

MASt3R 可以记成:

two images
-> DUSt3R-style 3D pointmap prediction
-> extra dense descriptor head
-> fast reciprocal nearest-neighbor matching
-> camera pose / localization / MVS reconstruction

它不是抛弃 DUSt3R,而是补上 DUSt3R 的一个短板:

DUSt3R pointmap 很鲁棒,但直接拿 3D pointmap 做 pixel matching 不够精确。
MASt3R 让网络额外输出 dense descriptors,并用 matching loss 训练它们。

和 DUSt3R 的关系

DUSt3R 输入两张图:

I1, I2I^1,\ I^2

输出两个 pointmaps:

X1,1, X2,1X^{1,1},\ X^{2,1}

其中:

  • X1,1X^{1,1}:图像 1 每个像素的 3D 点,表达在相机 1 坐标系。
  • X2,1X^{2,1}:图像 2 每个像素的 3D 点,也表达在相机 1 坐标系。

也就是说,DUSt3R 已经把两张图的像素放到了一个共同 3D 坐标系里。

MASt3R 继续沿用这套结构,但额外输出两个 dense descriptor maps:

D1, D2RH×W×dD^1,\ D^2\in\mathbb{R}^{H\times W\times d}

论文中使用:

d=24d=24

这些 descriptor 不再只是普通局部纹理特征,而是在 DUSt3R 的 3D 几何推理基础上学出来的匹配特征。

⭐ 为什么不直接用 DUSt3R 的 pointmap 做匹配?

可以直接用,但不够精细。

DUSt3R 的 pointmap 是回归结果:

XiR3X_i\in\mathbb{R}^3

如果两个像素看到同一个 3D 点,那么理论上它们预测出来的 3D 坐标应该接近。于是可以用 3D 最近邻找对应点:

pixel i in image 1
-> predicted 3D point X¹,¹_i
-> nearest predicted 3D point in X²,¹
-> pixel j in image 2

问题在于,pointmap regression 天然会有连续误差。

例如真实对应点是像素 jj,但网络预测出的 3D 点可能让 j+1j+1j+2j+2 附近的像素看起来也很接近。对 3D 重建来说,这种误差也许还能接受;但对相机位姿估计、PnP、essential matrix 来说,像素级误差会直接影响几何精度。

MASt3R 因此新增 descriptor head,并用分类式 matching loss 训练:

不是“预测得差不多就行”,
而是“必须把正确像素匹配出来”。

这就是论文说的:回归适合提供 3D grounding,但单靠回归并不适合获得高精度 pixel correspondences。

模型输入与输出

输入:

I1,I2RH×W×3I^1,I^2\in\mathbb{R}^{H\times W\times 3}

经过 Siamese ViT encoder:

H1=Encoder(I1)H^1=\mathrm{Encoder}(I^1) H2=Encoder(I2)H^2=\mathrm{Encoder}(I^2)

然后经过两个 intertwined decoders,通过 cross-attention 交换两张图的信息:

H1,H2=Decoder(H1,H2)H'^1,H'^2=\mathrm{Decoder}(H^1,H^2)

最终有两类输出头。

3D head

输出 pointmaps 和 confidence:

X1,1,C1=Head3D([H1,H1])X^{1,1},C^1=\mathrm{Head}_{3D}([H^1,H'^1]) X2,1,C2=Head3D([H2,H2])X^{2,1},C^2=\mathrm{Head}_{3D}([H^2,H'^2])

这里和 DUSt3R 一致。

Descriptor head

新增 dense descriptors:

D1=Headdesc([H1,H1])D^1=\mathrm{Head}_{desc}([H^1,H'^1]) D2=Headdesc([H2,H2])D^2=\mathrm{Head}_{desc}([H^2,H'^2])

论文把 descriptor head 实现为:

2-layer MLP
-> GELU
-> unit normalization

输出的每个像素都有一个 24 维单位向量:

Di1R24,Di12=1D_i^1\in\mathbb{R}^{24},\quad \lVert D_i^1\rVert_2=1

训练目标

MASt3R 的训练目标由两部分组成:

3D pointmap regression loss
+
matching loss

最终:

Ltotal=Lconf+βLmatch\mathcal{L}_{total} = \mathcal{L}_{conf} + \beta\mathcal{L}_{match}

论文中:

β=1\beta=1

3D regression loss

DUSt3R 原本使用 scale-normalized pointmap regression:

regr(v,i)=1zXiv,11z^X^iv,1\ell_{regr}(v,i) = \left\Vert \frac{1}{z}X_i^{v,1} - \frac{1}{\hat{z}}\hat{X}_i^{v,1} \right\Vert

其中 v{1,2}v\in\{1,2\} 表示 view,ii 表示像素。

MASt3R 对 metric ground-truth 做了一个重要调整:如果数据集提供 metric 尺度,就不希望预测结果任意缩放。因此它设置:

z:=z^z:=\hat{z}

于是 metric 数据上的回归项变成:

regr(v,i)=Xiv,1X^iv,1z^\ell_{regr}(v,i) = \frac{\left\Vert X_i^{v,1}-\hat{X}_i^{v,1}\right\Vert}{\hat{z}}

这使模型能够学习 metric depth,对 Map-free localization 特别重要。

Confidence-aware loss

和 DUSt3R 类似,confidence loss 写成:

Lconf=v{1,2}iVvCivregr(v,i)αlogCiv\mathcal{L}_{conf} = \sum_{v\in\{1,2\}} \sum_{i\in\mathcal{V}^v} C_i^v\ell_{regr}(v,i) - \alpha\log C_i^v

直觉是:

  • 如果某个点难预测,模型可以降低 confidence,减少该点误差的惩罚。
  • αlogCiv-\alpha\log C_i^v 会阻止模型把所有 confidence 都降到 0。

论文沿用 DUSt3R 设置:

α=0.2\alpha=0.2

Matching loss:为什么是 InfoNCE

MASt3R 用 ground-truth pointmaps 找到真实像素对应集合:

M^={(i,j)X^i1,1=X^j2,1}\hat{\mathcal{M}} = \{(i,j)\mid \hat{X}_i^{1,1}=\hat{X}_j^{2,1}\}

对一个真实匹配 (i,j)(i,j),希望:

D¹_i 和 D²_j 尽量相似;
D¹_i 和其他错误 D²_k 尽量不相似;
D²_j 和其他错误 D¹_k 尽量不相似。

论文中的匹配损失为:

Lmatch=(i,j)M^logsτ(i,j)kP1sτ(k,j)+logsτ(i,j)kP2sτ(i,k)\mathcal{L}_{match} = - \sum_{(i,j)\in\hat{\mathcal{M}}} \log \frac{s_\tau(i,j)} {\sum_{k\in\mathcal{P}^1}s_\tau(k,j)} + \log \frac{s_\tau(i,j)} {\sum_{k\in\mathcal{P}^2}s_\tau(i,k)}

其中相似度写成:

sτ(i,j)=exp[τDi1Dj2]s_\tau(i,j) = \exp\left[-\tau D_i^{1\top}D_j^2\right]

论文设置:

τ=0.07\tau=0.07
⭐ 这个 InfoNCE / cross-entropy matching loss 在做什么?

可以把它理解成两次分类。

第一类问题:

给定 image 2 的像素 j,
image 1 中哪个像素 k 才是它的正确匹配?

对应:

sτ(i,j)kP1sτ(k,j)\frac{s_\tau(i,j)} {\sum_{k\in\mathcal{P}^1}s_\tau(k,j)}

如果正确像素 ii 的相似度比分母里所有候选都大,这个比例就接近 1,loss 就小。

第二类问题:

给定 image 1 的像素 i,
image 2 中哪个像素 k 才是它的正确匹配?

对应:

sτ(i,j)kP2sτ(i,k)\frac{s_\tau(i,j)} {\sum_{k\in\mathcal{P}^2}s_\tau(i,k)}

这相当于同时要求:

i -> j 是最近的;
j -> i 也是最近的。

也就是互为最近邻的思想。

和 pointmap regression 不同,这种损失不会因为“预测到附近像素”就给很多奖励。它更像在训练一个精确的像素分类器:正确像素必须在候选集合里脱颖而出。

这就是为什么 MASt3R 的 descriptor head 能提高 pixel-level matching accuracy。

推理阶段:Fast Reciprocal Matching

有了 dense descriptors:

D1,D2RH×W×dD^1,D^2\in\mathbb{R}^{H\times W\times d}

最直接的匹配方式是 mutual nearest neighbor:

M={(i,j)j=NN2(Di1) and i=NN1(Dj2)}\mathcal{M} = \{(i,j)\mid j=\mathrm{NN}_2(D_i^1) \ \text{and}\ i=\mathrm{NN}_1(D_j^2) \}

其中:

NNA(DjB)=argminiDiADjB\mathrm{NN}_A(D_j^B) = \arg\min_i \left\Vert D_i^A-D_j^B\right\Vert

问题是,如果每个像素都和另一张图所有像素比较,复杂度是:

O(W2H2)O(W^2H^2)

对于 dense image matching,这太慢。

MASt3R 提出 Fast Reciprocal Matching,简称 FRM。

Fast Reciprocal Matching 重绘示意图

图源说明:根据 Leroy et al., MASt3R 的 FRM 算法描述重绘,非论文原图。

核心流程:

1. 从 image 1 采样 k 个起点 U⁰。
2. 每个起点在 image 2 里找最近邻,得到 Vᵗ。
3. 再从 Vᵗ 回到 image 1 找最近邻,得到 Uᵗ⁺¹。
4. 如果 Uᵗ⁺¹ = Uᵗ,说明形成 reciprocal cycle。
5. 收集已经收敛的匹配,剩余点继续迭代。

论文写成:

Ut[NN2(Du1)]uUtVt[NN1(Dv2)]vVtUt+1U^t \longmapsto [\mathrm{NN}_2(D_u^1)]_{u\in U^t} \equiv V^t \longmapsto [\mathrm{NN}_1(D_v^2)]_{v\in V^t} \equiv U^{t+1}

如果:

Unt+1=UntU_n^{t+1}=U_n^t

就得到一个 reciprocal match:

(Unt,Vnt)(U_n^t,V_n^t)

复杂度从全量 reciprocal matching 的:

O(W2H2)O(W^2H^2)

变成:

O(kWH)O(kWH)

其中 kWHk\ll WH

论文在 Map-free 上发现,适度 subsampling 不仅更快,结果反而更好。一个典型设置是:

k=3000k=3000

此时可以明显加速 matching,并提升 pose estimation 结果。

MASt3R Fast Reciprocal Matching 原论文补充图

图源说明:来自 Leroy et al., MASt3R arXiv 源码附录图,展示 FRM 的迭代过程。

⭐ 为什么少采样反而可能更准?

直觉上,更多 matches 应该更好。但 dense reciprocal matching 会产生很多非常密集、局部重复的对应点。

例如一大片墙面、地板、纹理重复区域,可能产生大量彼此很近的 matches。这些点数量很多,但几何信息不一定多,还可能让 RANSAC / pose estimation 更容易被局部区域支配。

FRM 从 kk 个起点出发,并沿 nearest-neighbor graph 走向 reciprocal cycles。论文附录把这个过程解释为 convergence basin:

很多起点可能会汇入同一个 reciprocal match;
不同 basin 的大小会影响被采到的概率;
最终得到的点更像是按“收敛区域”采样,而不是按像素密度采样。

结果是:匹配点覆盖可能更均匀,重复密集区域的影响被压低。

所以 FRM 的好处有两个:

速度:不用枚举所有像素对;
鲁棒性:减少过密、重复、局部偏置的 matches。

Coarse-to-fine matching

MASt3R 的主网络训练和推理时最大边长约为 512 像素。高分辨率图像如果直接缩小后匹配,再把匹配坐标放大回原图,会损失像素级精度。

论文因此使用 coarse-to-fine:

低分辨率整图匹配
-> 得到 coarse correspondences
-> 在原图上生成 overlapping windows
-> 选择覆盖大部分 coarse matches 的窗口对
-> 对每个窗口对重新跑 MASt3R + FRM
-> 把窗口内 matches 映射回原图坐标

窗口大小仍保持模型能处理的尺度,窗口之间有 50% overlap。

论文选择窗口对时采用贪心策略:不断添加窗口对,直到覆盖约 90% 的 coarse correspondences。

⭐ 为什么 coarse-to-fine 对 matching 很重要?

如果只在缩小图上做 matching,例如把一张 1600×1200 的图压到 512×384,原图里多个相邻像素会被合并到低分辨率网格里。

这会带来两个问题:

1. 细小结构的对应点消失;
2. 匹配坐标放大回原图后,像素误差也被放大。

但完全在原图上跑 Transformer 又太贵。

coarse-to-fine 的折中是:

先用整图低分辨率获得全局对应范围;
再只对可能对应的局部窗口做高分辨率匹配。

这样既保留了全局定位能力,又拿回了局部像素精度。

这和光流、立体匹配里的 coarse-to-fine 思路很像:粗层负责大位移,细层负责精修。

训练数据与实现细节

MASt3R 用 14 个数据源混合训练,覆盖 indoor、outdoor、synthetic、real-world、object-centric 等场景。论文列出的数据包括 Habitat、ARKitScenes、BlendedMVS、MegaDepth、ScanNet++、CO3D-v2、Waymo、Map-free、VirtualKITTI、TartanAir 等。

关键训练设置:

项目设置
初始化使用公开 DUSt3R checkpoint
BackboneViT-Large encoder + ViT-Base decoder
每个 epoch650k image pairs
batch size64
epochs35
optimizerAdamW
base lr10410^{-4}
weight decay0.05
descriptor dimensiond=24d=24
matching loss weightβ=1\beta=1
InfoNCE temperatureτ=0.07\tau=0.07
confidence loss weightα=0.2\alpha=0.2

训练时会随机改变图像宽高比,并把最大边控制在 512 像素。论文强调这一点很重要,因为 coarse-to-fine 推理时会从缩小图像再 zoom-in 到细节窗口。

实验结论

Map-free localization

Map-free 是一个很难的重定位 benchmark:给单张 reference image,没有预建地图,要估计 query camera 的 metric pose。

MASt3R 在 test set 上明显超过已有方法。论文报告:

方法VCRE AUCmedian pose error
LoFTR + KBR0.6342.23 m / 37.8 deg
DUSt3R + DPT0.6970.97 m / 7.1 deg
MASt3R + DPT0.7260.80 m / 2.2 deg
MASt3R auto depth0.9330.36 m / 2.2 deg

这里最重要的观察是:MASt3R 的 metric depth 对 Map-free 帮助非常大。

Relative pose estimation

在 CO3Dv2 和 RealEstate10K 上,MASt3R 作为 pairwise 方法,能和多视角方法竞争甚至超过它们。

论文中 RealEstate10K 的 mAA(30):

DUSt3R pairwise:61.2
MASt3R pairwise:76.4

说明额外的 matching head 确实改善了相对位姿估计。

Visual localization

在 Aachen Day-Night 和 InLoc 上,MASt3R 支持 top1、top20、top40 retrieved images。

一个值得注意的现象是:

direct regression 在 Map-free 上很强,
但在 Aachen / InLoc 这类更大尺度场景上很弱。

这说明对于大尺度定位,单纯从 pointmap 直接回归 pose 并不稳,显式 feature matching + PnP / geometry estimation 更可靠。

MVS reconstruction

MASt3R 还可以用于 dense multi-view stereo。做法不是传统 plane sweeping,而是:

MASt3R matching
-> triangulate matches
-> geometric consistency filtering
-> point cloud

在 DTU 上,MASt3R 是 zero-shot 使用,没有在 DTU train set 上 finetune。论文报告它明显优于 DUSt3R baseline,并接近专门训练的 MVS 方法。

MASt3R MVS 质性结果图

图源说明:来自 Leroy et al., MASt3R arXiv 源码附录图,展示通过 MASt3R matches 三角化得到的 MVS 点云效果。

这篇论文和 VGGT 的区别

维度MASt3RVGGT
基础思路基于 DUSt3R,两图 pairwise matching多图一起输入,一个 feed-forward Transformer
核心输出pointmaps、confidence、dense descriptorscameras、depth maps、point maps、tracks
多图处理通过 pairwise matching / localization / MVS 后处理网络内部直接处理多图 token
matching显式重点任务,使用 descriptor + FRM输出 tracking features,可用于点跟踪
优点高精度匹配、定位、MVS,工程上接近传统 matching pipeline统一输出多种 3D 属性,端到端前馈
局限多图仍依赖 pairwise 图和后处理大模型,多图 attention 成本和训练规模更高

可以粗略理解为:

MASt3R:把 DUSt3R 变成强 matching engine。
VGGT:把多视角几何任务压进一个统一前馈模型。

我认为最关键的理解

MASt3R 的创新不只是“多加了一个 descriptor head”。真正关键的是它把 descriptor 学习放在 DUSt3R 的 3D reconstruction 表征上:

2D local descriptor
容易受纹理、光照、视角变化影响

3D-grounded dense descriptor
同时利用图像外观和跨视角 3D 几何关系

这解释了为什么它在大视角变化、弱纹理、重复结构和定位任务上更强。

⭐ “Grounding image matching in 3D” 到底是什么意思?

不是说 matching 阶段一定要先显式重建出完整 3D mesh。

它的意思是:匹配特征不是只从 2D 局部 patch 里学出来,而是通过 DUSt3R-style network 先让两张图在共同 3D pointmap 空间里发生关系。

因此一个像素的 descriptor 可能已经编码了:

它属于哪个 3D 表面;
它在另一个视角中大概对应哪里;
它附近的几何结构;
当前图像对的相对视角关系;
这个点的可见性和遮挡上下文。

最后再做 nearest-neighbor matching 时,比较的就不是普通外观特征,而是带 3D 场景理解的 dense features。

所以这里的 grounding 可以理解成:

用 3D pointmap regression 约束中间表征,
再从这个表征中读出更适合 pixel matching 的 descriptor。

读完后应该记住的公式

Pointmap:

Xa,bRH×W×3X^{a,b}\in\mathbb{R}^{H\times W\times 3}

Descriptor maps:

D1,D2RH×W×dD^1,D^2\in\mathbb{R}^{H\times W\times d}

Mutual nearest-neighbor matches:

M={(i,j)j=NN2(Di1) and i=NN1(Dj2)}\mathcal{M} = \{(i,j)\mid j=\mathrm{NN}_2(D_i^1) \ \text{and}\ i=\mathrm{NN}_1(D_j^2) \}

Fast reciprocal matching step:

UtVtUt+1U^t \to V^t \to U^{t+1}

Total loss:

Ltotal=Lconf+βLmatch\mathcal{L}_{total} = \mathcal{L}_{conf} + \beta\mathcal{L}_{match}

个人总结

MASt3R 最适合放在 DUSt3R 后面读。

DUSt3R 说明:

可以直接从图像对预测共同坐标系下的 pointmaps。

MASt3R 接着说明:

这个 3D 表征不仅能做重建,还能反过来提升图像匹配。

这对你后面理解 stereo、point-map、多视角重投影很有用:matching 不是一个孤立的 2D 纹理问题,而是和相机位姿、深度、pointmap、三角化全部绑在一起。