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,让模型显式学习更精确的像素级匹配。
图源说明:根据 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 输入两张图:
输出两个 pointmaps:
其中:
- :图像 1 每个像素的 3D 点,表达在相机 1 坐标系。
- :图像 2 每个像素的 3D 点,也表达在相机 1 坐标系。
也就是说,DUSt3R 已经把两张图的像素放到了一个共同 3D 坐标系里。
MASt3R 继续沿用这套结构,但额外输出两个 dense descriptor maps:
论文中使用:
这些 descriptor 不再只是普通局部纹理特征,而是在 DUSt3R 的 3D 几何推理基础上学出来的匹配特征。
⭐ 为什么不直接用 DUSt3R 的 pointmap 做匹配?
可以直接用,但不够精细。
DUSt3R 的 pointmap 是回归结果:
如果两个像素看到同一个 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 天然会有连续误差。
例如真实对应点是像素 ,但网络预测出的 3D 点可能让 、 附近的像素看起来也很接近。对 3D 重建来说,这种误差也许还能接受;但对相机位姿估计、PnP、essential matrix 来说,像素级误差会直接影响几何精度。
MASt3R 因此新增 descriptor head,并用分类式 matching loss 训练:
不是“预测得差不多就行”,
而是“必须把正确像素匹配出来”。
这就是论文说的:回归适合提供 3D grounding,但单靠回归并不适合获得高精度 pixel correspondences。
模型输入与输出
输入:
经过 Siamese ViT encoder:
然后经过两个 intertwined decoders,通过 cross-attention 交换两张图的信息:
最终有两类输出头。
3D head
输出 pointmaps 和 confidence:
这里和 DUSt3R 一致。
Descriptor head
新增 dense descriptors:
论文把 descriptor head 实现为:
2-layer MLP
-> GELU
-> unit normalization
输出的每个像素都有一个 24 维单位向量:
训练目标
MASt3R 的训练目标由两部分组成:
3D pointmap regression loss
+
matching loss
最终:
论文中:
3D regression loss
DUSt3R 原本使用 scale-normalized pointmap regression:
其中 表示 view, 表示像素。
MASt3R 对 metric ground-truth 做了一个重要调整:如果数据集提供 metric 尺度,就不希望预测结果任意缩放。因此它设置:
于是 metric 数据上的回归项变成:
这使模型能够学习 metric depth,对 Map-free localization 特别重要。
Confidence-aware loss
和 DUSt3R 类似,confidence loss 写成:
直觉是:
- 如果某个点难预测,模型可以降低 confidence,减少该点误差的惩罚。
- 但 会阻止模型把所有 confidence 都降到 0。
论文沿用 DUSt3R 设置:
Matching loss:为什么是 InfoNCE
MASt3R 用 ground-truth pointmaps 找到真实像素对应集合:
对一个真实匹配 ,希望:
D¹_i 和 D²_j 尽量相似;
D¹_i 和其他错误 D²_k 尽量不相似;
D²_j 和其他错误 D¹_k 尽量不相似。
论文中的匹配损失为:
其中相似度写成:
论文设置:
⭐ 这个 InfoNCE / cross-entropy matching loss 在做什么?
可以把它理解成两次分类。
第一类问题:
给定 image 2 的像素 j,
image 1 中哪个像素 k 才是它的正确匹配?
对应:
如果正确像素 的相似度比分母里所有候选都大,这个比例就接近 1,loss 就小。
第二类问题:
给定 image 1 的像素 i,
image 2 中哪个像素 k 才是它的正确匹配?
对应:
这相当于同时要求:
i -> j 是最近的;
j -> i 也是最近的。
也就是互为最近邻的思想。
和 pointmap regression 不同,这种损失不会因为“预测到附近像素”就给很多奖励。它更像在训练一个精确的像素分类器:正确像素必须在候选集合里脱颖而出。
这就是为什么 MASt3R 的 descriptor head 能提高 pixel-level matching accuracy。
推理阶段:Fast Reciprocal Matching
有了 dense descriptors:
最直接的匹配方式是 mutual nearest neighbor:
其中:
问题是,如果每个像素都和另一张图所有像素比较,复杂度是:
对于 dense image matching,这太慢。
MASt3R 提出 Fast Reciprocal Matching,简称 FRM。
图源说明:根据 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. 收集已经收敛的匹配,剩余点继续迭代。
论文写成:
如果:
就得到一个 reciprocal match:
复杂度从全量 reciprocal matching 的:
变成:
其中 。
论文在 Map-free 上发现,适度 subsampling 不仅更快,结果反而更好。一个典型设置是:
此时可以明显加速 matching,并提升 pose estimation 结果。

图源说明:来自 Leroy et al., MASt3R arXiv 源码附录图,展示 FRM 的迭代过程。
⭐ 为什么少采样反而可能更准?
直觉上,更多 matches 应该更好。但 dense reciprocal matching 会产生很多非常密集、局部重复的对应点。
例如一大片墙面、地板、纹理重复区域,可能产生大量彼此很近的 matches。这些点数量很多,但几何信息不一定多,还可能让 RANSAC / pose estimation 更容易被局部区域支配。
FRM 从 个起点出发,并沿 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 |
| Backbone | ViT-Large encoder + ViT-Base decoder |
| 每个 epoch | 650k image pairs |
| batch size | 64 |
| epochs | 35 |
| optimizer | AdamW |
| base lr | |
| weight decay | 0.05 |
| descriptor dimension | |
| matching loss weight | |
| InfoNCE temperature | |
| confidence loss weight |
训练时会随机改变图像宽高比,并把最大边控制在 512 像素。论文强调这一点很重要,因为 coarse-to-fine 推理时会从缩小图像再 zoom-in 到细节窗口。
实验结论
Map-free localization
Map-free 是一个很难的重定位 benchmark:给单张 reference image,没有预建地图,要估计 query camera 的 metric pose。
MASt3R 在 test set 上明显超过已有方法。论文报告:
| 方法 | VCRE AUC | median pose error |
|---|---|---|
| LoFTR + KBR | 0.634 | 2.23 m / 37.8 deg |
| DUSt3R + DPT | 0.697 | 0.97 m / 7.1 deg |
| MASt3R + DPT | 0.726 | 0.80 m / 2.2 deg |
| MASt3R auto depth | 0.933 | 0.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 方法。

图源说明:来自 Leroy et al., MASt3R arXiv 源码附录图,展示通过 MASt3R matches 三角化得到的 MVS 点云效果。
这篇论文和 VGGT 的区别
| 维度 | MASt3R | VGGT |
|---|---|---|
| 基础思路 | 基于 DUSt3R,两图 pairwise matching | 多图一起输入,一个 feed-forward Transformer |
| 核心输出 | pointmaps、confidence、dense descriptors | cameras、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:
Descriptor maps:
Mutual nearest-neighbor matches:
Fast reciprocal matching step:
Total loss:
个人总结
MASt3R 最适合放在 DUSt3R 后面读。
DUSt3R 说明:
可以直接从图像对预测共同坐标系下的 pointmaps。
MASt3R 接着说明:
这个 3D 表征不仅能做重建,还能反过来提升图像匹配。
这对你后面理解 stereo、point-map、多视角重投影很有用:matching 不是一个孤立的 2D 纹理问题,而是和相机位姿、深度、pointmap、三角化全部绑在一起。