论文阅读记录:MAst3R
引言
经过一周的对SLAM3R进行 online 以及可视化 demo 改造的低效率劳作且工作完成,我终于有时间来补档我这篇早在近两个周之前就读完的论文Grounding Image Matching in 3D with MASt3R
读完这篇论文之后,我的第一感觉就是:这是一个 DUst3R 的修补模型,他并没有太多的像 DUst3R 那样的开创性地将 transformer 运用于双目三维重建那样的举动,而是在 DUst3R 模型上进行了
少许修补,并提出了少许修补中的一些独创性方法,感觉是一篇介绍 small trick 的论文。同时,我们似乎也可以这么说: MAst3R 发现本聚焦于三维重建任务的 DUst3R 在像素匹配问题上同样达到了 SOTA
于是, MAst3R 将 DUst3R 稍加改造,得到了一个在像素匹配上表现更强的模型 MAst3R.
模型介绍
MASt3R 的模型结构与 Dust3R 大致相同:
Encoder
与 DUst3R 相同, MAst3R 的 encoder 部分同样是由 ViT 组成的,且与 DUst3R 相同的是, MAst3R 的 encoder 部分也是共享权重的。
就像这样:
Decoder
MASt3R 的 Decoder 同样采用了 cross-attention 的机制,这能使得 MAst3R 能够理解同一像素在不同视角下的信息,有助于后续进行像素匹配。
Heads
对于 Dust3R 来说,他只有一个 head ,直接将 decoder 的输出转化为点图信息和置信度(上图灰色部分)
3D Heads
MASt3R 对这个 head 基本上与 DUst3R 的 head 相同,都是将 decoder 的输出转化为点图信息和置信度。
Matching Heads
MASt3R 在此基础上又增加了一个 head ,专门用于像素匹配任务(上图蓝色部分),这个头部由一个简单的两层的 MLP 组成,使用了 GELU 作为激活函数,另外在处理完后进行归一化处理,负责输出两张密集的特征图:
Loss
Mast3R 的损失函数由两部分组成:
3D Loss
MAst3R 的 3D Loss 与 DUst3R 的 3D Loss 基本相同,都是由点图的 L1 损失和置信度的交叉熵损失组成。
但是, MAst3R 在计算回归损失的时候,原本的 DUst3R 计算公式是这样的:
MAst3R 认为在它的应用场景中,并不鼓励尺度不变性,而更多的是需要绝对的尺度一致性,因此 MAst3R 将上式改为了:
因此, MAst3R 的 3D Loss 计算公式为:
Matching Loss
这个损失函数是对 Matching Head 输出的特征图进行监督的,基本思想是:我们鼓励一个图像中的一个特征匹配符,最多与另一张图像中代表同一个 3D 点的特征匹配符进行匹配,
需要注意的是,这个匹配本质上是一个交叉熵分类损失,当网络猜到正确的像素(而非邻近的像素)时,才会得到奖励。
具体实现上,我们利用了 InfoNCE loss 来实现这个想法,其作用于一组对应关系,具体公式如下:
其中,,是一个温度参数,和分别是图像 1 和图像 2 中所有像素的集合。
这极大地鼓励了网络进行高精度匹配。
最后,两个损失函数被结合起来,形成了 MAst3R 的总损失函数:
有了上述模型与 Loss 就可以训练了,但是网络的输出还需要经过一些处理,才能得到需要的匹配关系。注意,网络只输出了 PointMap 和每个像素的 LocalFeature ,而期望得到的是两个图像之间的像素点级别的匹配,匹配相关的部分就是图中新增的 NN 模块。
快速互惠匹配
当给定两张特定的预测图时,我们的目标是提取一组可靠的像素对应关系,即互惠最近邻。
数学定义:
- 互惠最近邻集合由公式定义:̲</li>
<li>这里的$…" style="color:#cc0000">\mathcal{M}={(i,j)|j=\mathrm{NN}_2(D_i^1)\mathrm{<del>and</del>}i=\mathrm{NN}_1(D_j^2)}
$$</li>
<li>这里的表示在特征图中与特征距离最近的特征的索引。其数学定义为:
\mathrm{NN}_A(D_j^B)=\arg\min_i|D_i^A-D_j^B|</li> </ul> <h3 id="传统方法"><a href="#传统方法" class="headerlink" title="传统方法"></a>传统方法</h3><p>传统上,计算互惠最近邻的方法是通过暴力搜索来实现的,这种方法的时间复杂度为,这在高分辨率图像中是不可行的。</p> <p>虽然优化最近邻搜索是可能的,例如使用 <strong>K-d</strong> 树,但这种优化在高维特征空间中通常会变得非常低效,在某些情况下,其速度甚至比 MASt3R 输出和的推理时间慢几个数量级。</p> <h3 id="MASt3R的方法"><a href="#MASt3R的方法" class="headerlink" title="MASt3R的方法"></a>MASt3R的方法</h3><p>MASt3R 提出了一种基于<strong>子采样</strong>*的快速方法。</p> <p>这个方法是从一个稀疏的第一张图片的像素集合出发的,通过找到这个集合中每个像素在第二张图片上的最近邻得到最近邻集合,然后再从这个最近邻集合中找到每个像素在第一张图片上的最近邻,最后通过检查互惠性来得到最终的互惠最近邻集合。</p> <p>整个过程可以表示为:
U^t\mapsto[\mathrm{NN}2(D_u^1)]{u\in U^t}=V^t\mapsto[\mathrm{NN}1(D_v^2)]{v\in V^t}=U^{t+1}
$$- 当 时,这些像素形成了一个闭环,并被收集为一组互惠匹配 。
- 对于下一次迭代,那些已经收敛的像素(即 )会被过滤掉,新的 更新为 。
- 这个过程会迭代固定的次数,直到所有的对应关系都收敛到稳定的(互惠)对为止。
- 最终的输出对应关系集合 由所有互惠匹配集合的拼接而成:。
这种快速匹配算法的总体复杂度大概是,相比朴素方法的,有了显著的提升。

具体证明过程可以参考论文的附录部分。
个人总结
MAst3R 这篇论文的阅读,本人自己对 mast3r 的理解,以及对 transformer 在三维重建任务中应用的理解,基本上就到这里了,当然, mast3r 的实验部分我并没有过多地去阅读,因为我觉得 mast3r 的实验部分并没有太多的创新性,基本上都是在验证 mast3r 在各个任务上都达到了 SOTA 的水平。
我个人觉得 mast3r 的创新点主要有以下几点:- 在 DUst3R 的基础上,增加了一个匹配头,用于像素匹配任务,这个头部的设计比较简单,但是效果却非常好。
- 在 3D 损失函数中,改变了点图回归损失的计算方式,使其更加适合绝对尺度一致性的任务。
- 提出了一个快速的互惠匹配算法,大大提升了匹配的效率。
总的来说, MAst3R 是一篇比较实用的论文,通过一些小的改动和创新,使得模型在多个任务上都达到了 SOTA 的水平,值得学习和借鉴。
另外, MAst3R 的代码也已经开源:
喵喵补坑完毕,虽然感觉说了和没说一样😭
论文阅读记录:MAst3R