End2End Multi-View Feature Matching with Differentiable Pose Optimization
该页面还在建设中
Abstract
- Claim: Differentiable Pose Estimation (Eight-Point Algorithm + Bundle Adjustment) and feature matching jointly, End-to-End training
- Core Problem: reject outliers in feature matching
- GNN: predict feature matching and confidence weights
- Pose Estimation: use matching as constraints
Multi-View Graph Attention Network
Notations
- \(N\) images: \(\{I_n\}_{n=1}^N\)
- corresponding poses: \(\{p_n\}_{n=1}^N\)
- keypoints \(x\in \mathbb{R}^2\) , descriptors \(d\in \mathbb{R}^D\), confidence score \(c\in [0, 1]\)
待续。从代码可以看出用的就是 SuperGlue。
输出 confidence weight \(w_{ij}\)
Differentiable Pose Optimization
Weighted Eight-Point Algorithm
Epipolar Geometry Basics
回忆基础矩阵 (fundamental matrix) \(F\) 和本质矩阵 (essential matrix) \(E\),它们之间有关系
其中 \(K\) 是相机内参矩阵。给定对应 keypoints 的像素位置 \(p_1, p_2\),又或者对应相机坐标系坐标 \(x_1, x_2\),有对极约束 (epipolar constraint):
\(p_1=Kx_1\), \(p_2=Kx_2\)
因此,通过足够多的匹配点像素坐标可以计算基础矩阵,进而结合内参矩阵计算本质矩阵。由于有
可以证明,\(E\) 可以进行如下的 SVD 分解
Proof
Lemma
设 \(A\) 是 \(n\) 阶实反对称矩阵 (skew-symmetric matrix),若 \(n\) 为奇数,则 \(A\) 必定奇异。
Proof
设 \(Z=\begin{bmatrix}0 & 1 \\ -1 & 0\end{bmatrix}\),则有结论
Lemma
设 \(A\) 是 \(n\) 阶实反对称矩阵,则 \(A=UDU^{\top}\),其中 \(D\) 为如下的分块对角矩阵
证明见 pdf。可以得到推论:反对称矩阵的非零特征值就是 \(\pm \lambda_1 i, \cdots, \pm \lambda_m i\),都是纯虚数
\(E=t^{\wedge}R\),由于 \(t^{\wedge}\neq 0\) 是反对称矩阵,存在 \(\sigma\neq 0\) 使得
考虑
\(W\) 实际上是绕 \(z\) 轴逆时针旋转 90 度的旋转矩阵
则 \(D=\operatorname{diag}\{1, 1, 0\} W\)。由此就有
从而得证。
以上的证明也同时证明了,完成该 SVD 分解之后,可以解得如下两种可能的 \(t^{\wedge}\), \(R\):
\(R_Z(\theta)\) 表示绕 \(z\) 轴逆时针旋转 \(\theta\) 的旋转矩阵
由于 \(E\) 和 \(-E\) 等价,对任何一个 \(t\) 取负号,结果也是相同的,所以一共可以有 \(4\) 种解,需要选择其中最好的解。在训练时,作者采用了离 ground truth 最近的解;在测试时,作者采用了能让最多的点在两个相机坐标系下都具有正深度的解。
Implementation Details
一般的解出来的 \(E\) 奇异值矩阵不一定满足 \(\operatorname{diag}\{\sigma, \sigma, 0\}\) 的形式,可以有很多种修正方式:
- 解得奇异值矩阵 \(\operatorname{diag}\{\sigma_1, \sigma_2, \sigma_3\}\) 后,取 \(\Sigma=\operatorname{diag}\{\frac{\sigma_1+\sigma_2}{2}, \frac{\sigma_1+\sigma_2}{2}, 0\}\)
- 由于 \(E\) 具有尺度等价性,直接取 \(\Sigma=\operatorname{diag}\{1, 1, 0\}\)
- ……
这里作者使用的方法比较粗暴,就是简单地将解得的奇异值矩阵 \(\operatorname{diag}\{\sigma_1, \sigma_2, \sigma_3\}\) 取为 \(\Sigma=\operatorname{diag}\{\sigma_1, \sigma_2, 0\}\),这里没有保证 \(\sigma_1=\sigma_2\),我认为是不太对的。也许在作者调的来自 Kornia 的包中进行了处理,有待进一步探索。