系列文章目录
无参考价值
文章目录
给定两张图像 I 1 I_1 I1 和 I 2 I_2 I2,分别由两个相机 C 1 C_1 C1 和 C 2 C_2 C2 拍摄; 相机的参数是未知的(也就是说我们没有已知的内参矩阵 K、外参 R 和 T);我们希望恢复(估计)一组像素点对应关系,记作一组 { ( 𝑖 , 𝑗 ) } \{(𝑖,𝑗)\} {(i,j)}。每个像素 𝑖 𝑖 i 和 𝑗 𝑗 j 用坐标 ( 𝑢 , 𝑣 ) ( 𝑢 , 𝑣 ) (u,v) 表示, u u u 是横坐标(列索引), 𝑣 𝑣 v 是纵坐标(行索引), 这些坐标范围在图像大小范围内:宽 𝑊 𝑊 W,高 𝐻 𝐻 H。为了简化叙述,假设两张图像大小一样(即同一个 W 和 H)。但这不是必须条件,模型其实能处理任意分辨率和比例的图像。
提示:以下是本篇文章正文内容,下面案例可供参考
一、The DUSt3R framework
一个点图(pointmap) 𝑋 𝑎 , 𝑏 𝑋^{𝑎 , 𝑏} Xa,b 是一个大小为 𝐻 × 𝑊 × 3 𝐻 × 𝑊 × 3 H×W×3 的张量,它的作用是将图像中每一个像素点映射到一个三维点:
- 图像尺寸是 𝐻 × 𝑊 𝐻 × 𝑊 H×W
- 对于图像 𝐼 a 𝐼_a Ia 中的每个像素点 𝑖 = ( 𝑢 , 𝑣 ) 𝑖 = ( 𝑢 , 𝑣 ) i=(u,v), 它被映射为一个三维点 𝑋 ( 𝑢 , 𝑣 ) 𝑎 , 𝑏 ∈ 𝑅 3 𝑋^{𝑎 , 𝑏}_{( 𝑢 , 𝑣 )} ∈ 𝑅^3 X(u,v)a,b∈R3
- 这个三维点是在相机 C b C^b Cb 的坐标系下表示的
通过预测(回归)两个点图 𝑋 1 , 1 𝑋^{1 , 1} X1,1 和 𝑋 2 , 1 𝑋^{2 , 1} X2,1 ,DUSt3R 同时完成了:
- 相机标定(joint calibration):推理出相机间的相对位置关系;
- 三维重建(3D reconstruction):恢复出每个像素对应的三维点。
如果输入不止两张图(比如多视图),理论上可以通过一个“全局对齐”的后处理步骤,把所有点图对齐到同一个坐标系中,形成统一的大点云模型。不过这篇论文里只讨论“双目情况”(也就是只处理两张图像),暂时不做多视图融合。
两张图像(比如 𝐼 1 𝐼_1 I1和 𝐼 2 𝐼_2 I2)首先会被输入一个特征提取网络(encoder);这里的“编码”(encode)就是将原始图像转换成高维特征表示,以便后续处理。
用“Siamese(孪生)结构”进行编码,意思是:两张图像被分别送入相同的网络结构(共享权重的 encoder);好处是让模型更容易捕捉图像间的对应关系或差异;编码器使用的是 ViT(Vision Transformer),也就是视觉领域的 Transformer 模型;ViT 将图像切成 patch(小块),然后像处理序列一样对每个 patch 建模;
H
1
=
E
n
c
o
d
e
r
(
I
1
)
H
2
=
E
n
c
o
d
e
r
(
I
2
)
H^1 = Encoder(I^1) \\ H^2 = Encoder(I^2)
H1=Encoder(I1)H2=Encoder(I2)
编码过程会输出两组特征张量(表示):
- H 1 H^1 H1 :图像 𝐼 1 𝐼_1 I1 的特征
-
𝐻
2
𝐻^2
H2 :图像
𝐼
2
𝐼_2
I2 的特征
这两个表示将用于后续的匹配 / 三维估计等模块中。
然后,两个交织的(intertwined)解码器对这两个特征表示 H 1 H^1 H1和 H 2 H^2 H2进行联合处理;解码器之间使用 cross-attention(交叉注意力机制) 来交换信息(Cross-attention 是 transformer 中的一种机制,可以让一个序列关注另一个序列中的重要信息);解码器的目标是让模型学会理解:
- 两个相机视角之间的空间关系(即从不同视角看同一个场景是怎么变化的);
- 整个场景的三维结构(也就是要恢复的 3D 几何信息);
H
′
1
,
H
′
2
=
D
e
c
o
d
e
r
(
H
1
,
H
2
)
H'^{1},H'^{2} = Decoder(H^1 , H^2)
H′1,H′2=Decoder(H1,H2)
原来的特征
H
1
H_1
H1,
H
2
H_2
H2被解码器增强(augmented)之后,得到了新的特征表示;这些新的特征包含了空间上下文信息,记作:
H
′
1
H'^{1}
H′1
H
′
2
H'^{2}
H′2
- H ′ 1 H'^{1} H′1 :增强后的图像 1 特征
- H ′ 2 H'^{2} H′2 :增强后的图像 2 特征
最终模型用了两个预测头(prediction heads) 来做回归任务:
- 生成 pointmap(每个像素的三维坐标);
- 生成 confidence map(模型对每个三维预测的置信度);
输入给预测头的不是单一来源,而是将编码器(ViT encoder)输出的表示 H 1 H^1 H1 H 2 H^2 H2 和 解码器输出的增强表示 H ′ 1 H'^{1} H′1 H ′ 2 H'^{2} H′2 拼接(concatenate) 起来作为最终的特征输入; 这样可以结合局部原始信息和空间上下文,做出更准确的 3D 预测
X 1 , 1 , C 1 = H e a d 3 D 1 ( [ H 1 , H 1 ′ ] ) X 2 , 1 , C 2 = H e a d 3 D 2 ( [ H 2 , H 2 ′ ] ) X^{1,1}, C^1 = Head^1_{3D} ([H^1,\ H^{1'}]) \\ X^{2,1}, C^2 = Head^2_{3D} ([H^2,\ H^{2'}]) X1,1,C1=Head3D1([H1, H1′])X2,1,C2=Head3D2([H2, H2′])
损失函数
v ∈ {1, 2}
:视角编号,表示第几张图像(I₁ 或 I₂)。i
:图像中的像素坐标,例如 (u, v)。- X ( i ) v , 1 ∈ R 3 X^{v,1}_{(i)} ∈ ℝ³ X(i)v,1∈R3:模型预测的 3D 点,表示图像 Iᵥ 中像素 i 在相机 C₁ 坐标系下的三维位置(pointmap 输出)。
- 𝑋 ^ ( i ) v , 1 ∈ R 3 𝑋̂^{v,1}_{(i)} ∈ ℝ³ X^(i)v,1∈R3:像素 i 的真实(ground-truth)3D 坐标。
z
:对预测 3D 点的归一化因子,定义为所有预测点到原点的平均距离。𝑧̂
:对 GT 3D 点的归一化因子,定义为所有 GT 点到原点的平均距离。∥ ⋅ ∥
:欧几里得距离(L2范数),表示两点之间的空间距离。
除以一个归一化因子,让这个误差在尺度变化时保持稳定,这个损失是对尺度不敏感的。后面论文还说了,在某些 metric ground-truth 可用的数据集上,就不需要归一化,直接比较。
在某些任务中(如 map-free visual localization),尺度不变(scale-invariant) 的预测并不理想,因为这些任务需要预测出 具有真实尺度(metric scale) 的三维位置。因此,在 ground-truth 是 metric 的情况下,我们对回归损失进行修改,移除归一化。具体做法:
- 设置归一化因子
z := 𝑧̂
,即使用相同的因子; - 此时,回归损失简化为如下形式:
ℓ regr ( v , i ) = ∥ X v , 1 ( i ) − X ^ v , 1 ( i ) ∥ z ^ \ell_{\text{regr}}(v, i) = \frac{ \left\| X_{v,1}^{(i)} - \hat{X}_{v,1}^{(i)} \right\| }{ \hat{z} } ℓregr(v,i)=z^ Xv,1(i)−X^v,1(i)
在DUSt3R中,最终的置信感知回归损失定义为:
v ∈ {1, 2}
:视角编号,表示图像 I₁ 和 I₂;- i ∈ V v i ∈ V^v i∈Vv:在视角 v 中所有有 ground-truth 的像素点;
- C ( i ) v ∈ ( 0 , 1 ) C^v_{(i)} ∈ (0, 1) C(i)v∈(0,1):模型预测的置信度(confidence map)在像素 i 处的值;
- ℓ r e g r ( v , i ) ℓ_{regr}(v, i) ℓregr(v,i):之前定义的回归损失(预测 3D 点和 GT 之间的距离);
α
:一个超参数(权重系数),用于平衡两个项,一般是一个小的正数;
二、 Matching prediction head and loss
从 pointmap(点图)中获取像素间的可靠对应关系,常见做法是: 在某个不变性特征空间中寻找互为最近邻(reciprocal matching) 的点对。这种方法在 DUSt3R 中其实效果很好,哪怕视角变化很大, 通过点图的 3D 点进行 reciprocal matching,仍能找到很多有效匹配。但问题是,这些匹配的精度并不高,导致整体匹配准确度不理想。这是可以理解的,原因包括:
(i) 点图回归本身容易受噪声影响;
(ii) DUSt3R 的设计初衷是做 3D 重建,并没有明确训练过用于匹配的能力。
所以我们提出增加一个第二个输出模块(head),并行于原来的 3D 点图预测头。
2.1 Matching head
所以我们提出增加一个第二个输出模块(head),并行于原来的 3D 点图预测头。这个新模块的输出是两个“密集特征图”,也就是每张图中每个像素都有一个高维特征向量(dense feature)。
- D 1 , D 2 ∈ R H × W × d D^1, D^2 ∈ ℝ^{H×W×d} D1,D2∈RH×W×d:两张图像的 dense feature maps(每个像素对应一个 d 维向量),用于后续像素匹配;
- H e a d d e s c Head_{desc} Headdesc:匹配头(matching head),是一个小的网络模块,用于生成高质量的可匹配特征;
- [ H 1 , H ′ 1 ] [H^1, H'^1] [H1,H′1]:将编码器输出的特征 H₁ 和经过解码器增强的特征 H₁′ 进行拼接,结合局部信息和空间几何;
这两个特征图 D 1 D^1 D1 D 2 D^2 D2 会用于:
- 后续的 相似度计算;
- 构建 像素匹配对;
- 并通过 InfoNCE loss(对比损失) 进行训练,让匹配更准确
我们将 matching head 实现为一个简单的两层 MLP(多层感知机),中间加了一个 非线性激活函数 GELU(Gaussian Error Linear Unit)。
- 两层 MLP 就是:
- 第一层全连接 + GELU 激活
- 第二层全连接,输出维度为
d
(比如 128)- GELU 是比 ReLU 更平滑的激活函数,常用于 Transformer、BERT、ViT 等模型中。
最后,我们对每个像素的特征向量进行 单位向量归一化(L2 归一化),也就是让每个特征的范数为 1。 d ^ i = d i ∥ d i ∥ 2 \hat{d}_i = \frac{d_i}{\|d_i\|_2} d^i=∥di∥2di 这么做的目的是为了方便后续计算 余弦相似度 或 点积 作为匹配分数。
2.2 Matching objective.
让图像中每个局部特征(descriptor)至多匹配上另一张图中表示相同 3D 点的一个特征。 也就是说,希望匹配是一 一对应的,避免多对多、模糊、重复的匹配。为实现这个目标,我们采用 InfoNCE 损失函数,这是对比学习中常用的一种损失形式。 它能让“正样本对”特征靠得更近,同时把“负样本”推远。
M ^ = { ( i , j ) ∣ X ^ i 1 , 1 = X ^ j 2 , 1 } \hat{\mathcal{M}} = \{(i,j) | \hat{X}_i^{1,1} = \hat{X}_j^{2,1}\} M^={(i,j)∣X^i1,1=X^j2,1} 是通过3D真值点云定义的匹配对集合。
s
τ
(
i
,
j
)
s_τ(i,j)
sτ(i,j) 是一个经过温度系数调整的归一化相似度度量函数
s
τ
(
i
,
j
)
=
exp
[
−
τ
D
i
1
⊤
D
j
2
]
s_{\tau}(i,j) = \exp\left[-\tau D_{i}^{1\top}D_{j}^{2}\right]
sτ(i,j)=exp[−τDi1⊤Dj2]
其中:
-
D i 1 D_{i}^{1} Di1 图像1中像素 i i i 的特征描述符,是一个d维的向量,由匹配头(2层MLP)生成
-
D j 2 D_{j}^{2} Dj2 图像2中像素 j j j 的特征描述符。
-
τ τ τ 温度系数 论文设为0.07,控制匹配的"严格程度"
L match = − ∑ ( i , j ) ∈ M ^ ( log s τ ( i , j ) ∑ k ∈ P 1 s τ ( k , j ) + log s τ ( i , j ) ∑ k ∈ P 2 s τ ( i , k ) ) \mathcal{L}_{\text{match}} = -\sum_{(i,j)\in\hat{\mathcal{M}}} \left( \log \frac{s_{\tau}(i,j)}{\sum\limits_{k\in\mathcal{P}^{1}} s_{\tau}(k,j)} + \log \frac{s_{\tau}(i,j)}{\sum\limits_{k\in\mathcal{P}^{2}} s_{\tau}(i,k)} \right) Lmatch=−(i,j)∈M^∑ logk∈P1∑sτ(k,j)sτ(i,j)+logk∈P2∑sτ(i,k)sτ(i,j)
其中: -
( i , j ) ∈ M ^ (i,j)\in\hat{\mathcal{M}} (i,j)∈M^ , i i i 和 j j j 是真值匹配,所以上式子中 s τ ( i , j ) s_{\tau}(i,j) sτ(i,j) 是正确匹配对的相似度
-
∑ k ∈ P 1 s τ ( k , j ) \sum\limits_{k\in\mathcal{P}^{1}} s_{\tau}(k,j) k∈P1∑sτ(k,j) 图像1中所有可能与 j j j匹配的点的相似度和
-
P 1 = { i ∣ ( i , j ) ∈ M ^ } \mathcal{P}^1 = \{i | (i,j) \in \hat{\mathcal{M}}\} P1={i∣(i,j)∈M^}, P 2 = { j ∣ ( i , j ) ∈ M ^ } \mathcal{P}^2 = \{j | (i,j) \in \hat{\mathcal{M}}\} P2={j∣(i,j)∈M^}
-
s τ ( i , j ) ∑ ( . ) \frac{s_{\tau}(i,j)}{\sum (.)} ∑(.)sτ(i,j) 是归一化项,类似softmax的概率分布
双向匹配机制
第一项(图像1→图像2):固定图像2的像素j,要求在图像1中i必须是j的最佳匹配
第二项(图像2→图像1):固定图像1的像素i,要求在图像2中j必须是i的最佳匹配
对称设计确保匹配的唯一性
总损失:
L
total
=
L
conf
+
β
L
match
\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{conf}} + \beta \mathcal{L}_{\text{match}}
Ltotal=Lconf+βLmatch
实验表明(论文表1),联合训练比单独使用匹配损失(β=0)将旋转误差从10.8°降至3.0°
三、Fast reciprocal matching
互最近邻匹配定义:
NN₂(·) 在图像2中搜索最近邻 - 基于L2距离
NN₁(·) 在图像1中搜索最近邻
正向验证:𝑗 = NN₂(𝐷ᵢ¹) : 在图像2的所有像素中,𝑗是使得特征𝐷ⱼ²与𝐷ᵢ¹最相似的像素
反向验证:𝑖 = NN₁(𝐷ⱼ²) : 在图像1的所有像素中,𝑖是使得特征𝐷ᵢ¹与𝐷ⱼ²最相似的像素
Fast matching
初始化采样,在图像I₁的网格上均匀采样k个点 U 0 = { U n 0 } n = 0 k U^0 = \{ U^0_n\}^k_{n=0} U0={Un0}n=0k。网格采样优于随机采样,能保证空间覆盖均匀性(论文附录C验证)
-
前向映射(𝐼₁→𝐼₂) :对每个采样点 u ∈ U t u \in U^t u∈Ut ,计算其在图像 𝐼 2 𝐼₂ I2 中的最近邻 v = N N 2 ( D u 1 ) v=NN_2(D_u^1) v=NN2(Du1),生成集合 V t V^t Vt。复杂度:O(𝑘𝑁₂),𝑁₂为𝐼₂的像素数
-
反向映射(𝐼₂→𝐼₁): 对每个点 v ∈ V t v \in V^t v∈Vt ,反向计算其最近邻 u ′ = N N 1 ( D v 2 ) u' = NN_1(D_{v}^2) u′=NN1(Dv2),生成集合 U t + 1 U^{t+1} Ut+1
相互匹配的集合(即 M 𝑘 𝑡 = ( 𝑈 𝑛 𝑡 , 𝑉 𝑛 𝑡 ) ∣ 𝑈 𝑛 𝑡 = 𝑈 𝑛 𝑡 + 1 ) M^𝑡_𝑘={(𝑈^𝑡_𝑛,𝑉^𝑡_𝑛)|𝑈^𝑡_𝑛=𝑈^{𝑡+1}_𝑛}) Mkt=(Unt,Vnt)∣Unt=Unt+1) 。表明该匹配对 𝑈 𝑛 𝑡 , 𝑉 𝑛 𝑡 𝑈^𝑡_𝑛,𝑉^𝑡_𝑛 Unt,Vnt 满足双向最近邻条件,是几何一致的可靠匹配。然后剔除收敛的点,仅对未收敛点继续迭代,降低计算量。在 U t U^t Ut 中将 U t + 1 U^{t+1} Ut+1 的点剔除掉,赋值给 U t + 1 U^{t+1} Ut+1 然后继续迭代。即更新 𝑈 1 𝑡 : = 𝑈 𝑡 + 1 / U 𝑡 𝑈^𝑡_1:= 𝑈^{𝑡 +1} / U^𝑡 U1t:=Ut+1/Ut。
同样,我们也从 𝑡 = 1 𝑡= 1 t=1 开始验证和过滤,并以类似的方式将其与𝑡进行比较。如图3(左)所示,此过程然后迭代固定次数,直到大多数对应收敛到稳定(互反)对。
在图3(中)中,我们可以看到,经过几次迭代后,未收敛点
∣
𝑈
𝑡
∣
|𝑈𝑡|
∣Ut∣ 的数量迅速减少到零。最后,对应的输出集由所有互反对
M
𝑘
=
⋃
t
M
k
t
M_𝑘= \bigcup _t M_k^t
Mk=⋃tMkt 的串联组成。
四、Coarse-to-fine matching
Coarse-to-fine matching
从对两张图像的缩小版本进行匹配开始,通过子采样获得的一组粗对应。
在每个全分辨率图像上独立生成重叠的窗口,每个窗口最长边固定为512像素,连续的窗口重叠50%,确保无信息遗漏。窗口集 W 1 ∈ R w × 4 W^1 \in R^{w \times 4} W1∈Rw×4 ,一共w个窗口,每个窗口用4个坐标值表示(x_min, y_min, x_max, y_max)
先在降采样图像上获取粗匹配点集 M K 0 M_K^0 MK0。统计哪些窗口对 ( W 1 , W 2 ) (W^1,W^2) (W1,W2)覆盖最多的粗匹配点
高分辨率图像匹配流程:
[全图I¹] → [滑动窗口W¹₁, W¹₂...] → [与W²₁, W²₂...匹配] → [坐标反变换] → [稠密匹配结果]
│ │
└─── 50%重叠 ────────┘
对于每个选中的窗口对
(
w
1
,
w
2
)
(w1,w2)
(w1,w2)
特征提取:
D
w
1
,
D
w
2
=
MASt3R
(
I
w
1
1
,
I
w
2
2
)
快速匹配:
M
k
w
1
,
w
2
=
fast_reciprocal_NN
(
D
w
1
,
D
w
2
)
\begin{aligned} &\text{特征提取:} &D^{w_1}, D^{w_2} &= \text{MASt3R}(I_{w_1}^1, I_{w_2}^2) \\ &\text{快速匹配:} &M_k^{w_1,w_2} &= \text{fast\_reciprocal\_NN}(D^{w_1}, D^{w_2}) \end{aligned}
特征提取:快速匹配:Dw1,Dw2Mkw1,w2=MASt3R(Iw11,Iw22)=fast_reciprocal_NN(Dw1,Dw2)
对重复区域的匹配点取置信度最高者