Structure-from-Motion Revisited
该文章是colmap对应的稀疏重建论文,主要讲了稀疏重建的几个步骤。
-
特征提取与匹配
colmap利用SIFT算子进行特征提取与匹配,匹配完之后就获得了两两图像之间的匹配对。但是SIFT算子的匹配仅仅是基于外观的匹配,没有考虑图像之间的几何关系,不能保证对应的特征点能映射到同一三维场景点。因此,将利用RANSAC的方法计算两两图像的基础矩阵和单应性矩阵,根据几何关系筛选出可靠性较高的匹配对pairs。剔除外点后,输出图像连接图(其实就是图像之间的匹配关系)。
-
增量重建
增量重建的输入是场景图,也就是上一步的图像连接图,输出为每个相机的pos信息。增量重建包含四个过程:初始化、图像注册、三角量测和BA优化。
1)初始化
初始图像对的选择对于SFM来说至关重要,重建的鲁棒性、准确性和性能取决于增量过程的局部位置。由于冗余度增加,从图像图中密集的位置初始化并使用多个重叠的摄像头通常会导致更健壮、更精确的重建。相比之下,从更稀疏的位置初始化会导致更低的运行时间,因为BAs处理重建过程中累积的总体稀疏问题。
2)图像注册
SFM系统进行初始化之后,会去寻找下一张符合条件的图片进行增量重建。通过解决PnP问题,可以将新图像注册到当前模型中,方法是使用已注册图像中三角点的特征对应(2D-3D对应)。
3)三角量测
一个新注册的图像必须观测到场景中存在的部分点。另外,它还可能与已注册的图像之间有未三角化的匹配点,通过三角量测,可以给场景添加新的三维点。三角量测是SfM中的一个关键步骤,因为它通过冗余增加了现有模型的稳定性,并通过提供额外的2D-3D对应关系来实现新图像的注册。
4)BA优化
图像注册和三角量测在pipeline里是分开的两个步骤,如果没有其他的算法约束,SFM系统将会迅速漂移到不可恢复的状态。因此,人们利用BA算法对相机的pos和三维点进行优化。BA优化分为几种:只对相机Pos进行优化,只对三维点进行优化、对相机pos和三维点同时优化、对相机内参和外参和三维点同时优化等等。虽然其变种很多,但都拥有同样的计算方式(只是雅克比矩阵形式的变化)。
LM方法是求解BA问题的首选方法。BA参数矩阵中的特殊结构可以利用Schur方法。该方法把大型的矩阵求解简化为:先求较少的相机参数,然后求解三维点。一般利用PCG算法求解方程。
本文章所做的贡献:
1. 提出了一种几何验证的策略,使用信息增强场景图,提高了初始化和三角量测的鲁棒性
2. 提出了一种次优视图的选择策略,最大限度地提高增量重建过程的鲁棒性和准确性
3. 提出了一种稳健的三角量测方法,可以再降低计算成本的情况下生成比现有技术更完整的场景结构
4. 提出了一种迭代BA、重新三角化和异常值过滤的策略,通过减少漂移效应显著提高完整性和准确性
5. 通过冗余视图挖掘,为密集照片集提供更高效的BA参数
改进细节
1.场景图增强
提出了一种多模型几何关系增强场景图,内容为:
- 首先将计算图像对的基础矩阵F,如果内点数大于
N
F
N_{F}
NF,则该图像对通过几何验证
- 估计单应性矩阵H,统计内点数
N
H
N_{H}
NH,如果
N
H
/
N
F
<
ε
H
F
N_{H}/N_{F} < \varepsilon_{HF}
NH/NF<εHF,则认为这是一个通常场景
- 如果是校准过(知道相机内参)的图像,估计其本质矩阵E,并计算内点数
N
E
N_{E}
NE,如果
N
E
/
N
F
>
ε
E
F
N_{E}/N_{F} > \varepsilon_{EF}
NE/NF>εEF,则认为内参是准确的。
- 如果同时满足条件2和3,我们将分解本质矩阵E,并使用对应的内点进行三角化。
- 计算所有内点的三角化角度,排序后选择中值
α
m
\alpha_{m}
αm,利用其判断是纯旋转(全景)还是平面场景(平面)
- 为了检测网络图像的水印、时间戳和边框(WTF)等,通过估计图像间的相似变换并计算图像边缘的内点数
N
s
N_{s}
Ns,如果某对图像的
N
s
/
N
F
>
ε
N
F
N_{s}/N_{F} > \varepsilon_{NF}
Ns/NF>εNF或者
N
s
/
N
E
>
ε
N
E
N_{s}/N_{E} > \varepsilon_{NE}
Ns/NE>εNE,则认为这是一对WTF图像,不加入到场景图。
- 对于场景图中的所有图像对,将场景图的类型标记为图像对中最多的情形(一般、全景、平面)。
- 初始图像对倾向于选择非全景的、校准过的图像对。
2. 次优视图的选择策略
在鲁棒的SFM系统中,选择下一个最佳视角目的是为了最小化重建误差。作者认为在增量SFM中,每个次优视图的选择都会影响剩下的重建。一个错误次优视图的选择可能导致一系列的图像注册和三角量测。一种流行的策略是选择共视点最多的图像,以最大程度地减少不确定性。但是作者发现Lepetit在Epnp文章中提及 PnP的精度取决于观察点的数量和其分布。因此,作者提出了一种鲁棒的次优视图的选择策略。
作者将图像划分成不同尺度格网,然后对不同尺度的格网点分布状况进行打分,这样可以同时考虑到点的数量与分布的影响。总的来说,点的数量越多,分布越均匀,则该图像的得分越高。对不同匹配图像进行打分后,选择得分最高的图像作为下一最佳匹配图像。实验表明,使用该策略可以提升重建的鲁棒性和精度。
鲁棒高效的三角化
BA优化
作者提出的BA优化策略是:在每次增加一张新图像后,只对与该图像有最大关联的一部分图像进行局部BA。当模型增加一定比例之后,才进行一次全局BA。这样做可以减少计算的代价。
对于参数的求解方法:作者采用柯西(Cauchy)核函数来应对outliers的影响,使用ceres进行优化。对于数百张图像的情况,使用sparse方法进行求解。对于更多数量的图像,利用PCG算法求解。
**过滤:**每次BA时,将重投影误差较大的三维点过滤掉。在优化过程中,使相机焦距和畸变参数自由优化,然后在全局BA后,将视野不正常或者畸变参数大的相机视为错误估计,并进行剔除。
**再三角化(RT):**为了提高重建场景的完整性,对于先前被过滤掉的但是偏差不是很大的三维点进行再三角化。不提高三角化的阈值,只对误差低于过滤阈值的观测进行再三角化。
**迭代精化:**由于漂移(drift)或者错误的位姿估计,通常会有很大一部分三维点被错误滤除,而使用两步BA可以显著提升结果精度。因此,迭代进行BA、RT、过滤,直到被滤除的观测点和再三角化点减少。大多数场景下,在第二轮迭代过后,结果就会有显著的提升了。
冗余视图处理
BA是SfM性能的瓶颈。因此,作者针对大重叠度场景提出一种高效的相机分组优化策略,代替了昂贵的图割操作。与将很多相机聚类到一个子图上相比,作者将场景分割成很多小的、高度重叠的相机组,然后将每组相机使用一个(自由)相机来代替(这样可以减少BA优化过程中自由参数的数量)。
通过图像之间的共视程度来决定哪幅图像归于同一组。具体的,对于一个具有n个三维点的场景,使用一个{0,1}向量来表示每张图像的观测,若观测到该三维点,则为1,否则为0。然后通过交集/并集来获得共视程度,如下式所示:
V
a
b
=
∥
V
a
⋀
V
b
∥
/
∥
V
a
⋁
V
b
∥
V_{ab}=\parallel V_{a} \bigwedge V_{b} \parallel / \parallel V_{a} \bigvee V_{b} \parallel
Vab=∥Va⋀Vb∥/∥Va⋁Vb∥
若共视程度大于阈值且组内图像数量小于阈值,则将该图像加入该组。在每组内使用局部坐标系来参数化组内的相机。针对图像组的BA损失函数如下式所示:
E
g
=
Σ
j
ρ
(
∥
π
g
(
G
r
,
P
c
,
X
k
)
−
x
j
∥
2
2
)
E_{g}=\Sigma_{j} \rho (\parallel\pi_{g}(G_{r},P_{c},X_{k})-x_{j}\parallel_{2}^{2})
Eg=Σjρ(∥πg(Gr,Pc,Xk)−xj∥22)
其中,Gr是图像组共用的外参,Pc是组内每张图像的位姿。在进行优化的时候,组内每张图像的位姿为Pcr=PcGr,其中Pc在优化过程中固定不变,Gr可变。如此,BA优化时候,自由变量的数量就大大减少了。
参考:https://blog.csdn.net/weixin_44120025/article/details/123769174
https://zhuanlan.zhihu.com/p/342928560