今天要介绍的是J. L. Sconberger等人于2016年发表在CVPR的文章。本文针对增量式SFM中三角化/BA等步骤进行了改进,能够比较明显地提升SFM的精确率/鲁棒性以及重建完整性。
首先给出代码+教程:
Code: https://github.com/colmap/colmap
官方教程:https://colmap.github.io
在公众号「3D视觉工坊」后台回复colmap获取,下面是COLMAP软件的使用教程,感兴趣的同学可以看看。
SFM通常首先进行特征提取/匹配以及后续的几何校验滤出外点,经过上述步骤可以得到所谓的场景图「scene graph」,该场景图是后续的增量式的基础(提供数据关联等信息)。增量式重建中需要非常仔细地挑选两帧进行重建,在图像进行注册(即定位当前帧在地图中的位姿)之前,需要进行三角化场景点/滤出外点以及BA优化当前的模型。
输入:一系列输入图片;输出:经过几何校验后的图像匹配关系。
为了得到尽可能准确的匹配关系,该步骤中涉及特征提取,匹配以及几何校验。
输入:「scene graph」;输出:相机位姿以及3D路标点;
为了完成增量重建,需要完成初始化,图像注册,三角化以及BA优化这些步骤。
BA问题通常可以通过LM算法进行求解。作者提到,当SfM面对网络图像时,特别对于那些几乎一样的图像时,上述优化过程会占用极长的时间。本文尝试对该问题进行解决,后续章节进行介绍。
本文的贡献主要有以下5个方面:
采用了一种多模型几何校验策略增强场景图。对于输入的图像对,具体过程如下:
,若此时的内点数大于
,则认为图像对满足几何校验通过;
,记内点数为
;若
,则认为该场景为常规场景(general scene
);
,记内点数为
;
,则认为此时相机标定参数是符合要求的;
;随后利用该角度判断场景是纯旋转(pure rotation, panoramic)还是平面(planar scenes, planar)。
,记录图像对在图像边缘的内点数
;若此时,则认为该场景为WTFs,此时该图像不加入场景图。
综上,通过统计几种几何校验的内点数,根据设计的条件,判断出了该模型的类型:常规,全景,平面(general, panoramic, planar)。模型类型用于仅从非全景和已标定图像才参与重建。
注意:不对全景图像进行三角化,以避免退化点,可以提高三角化和后续图像注册的鲁棒性。
参与重建的图像的选择对重建的效果的影响是非常大,若选择了不好的图像,可能会导致相机无法注册或者三角化失败。
通常的做法是选择能看到三角化点最多的图像进行注册。但仅数量多并不意味着好,文献[1]已经通过实验验证「PNP位姿解算多精度不仅与观测点数量相关而且与观测点在图像上的分布有关」:若点分布越均匀,位姿结算精度越高。
作者认为:可见点的数量越多且分布越均匀得分
越高,得分越高点的图像越会被先注册。于是作者设计了一种多尺度统计点分布点算法,具体见上图。将图像划分成
层,每层划分为
个格子,其中
(
),同时给每一层设计一个权重
(原文有误),然后统计可见点在每层上的得分并累加。上图所示的得分计算如下(左滑查看全部):
可见在同样点数量下,点分布越均匀得分越高。
作者提到,如果地图点能够被持续观测,这样可以使大基线情况下的图像也能够关联得不错,这对重建是有利的。但与此同时,特征追踪过程中可能由于外观相似的特征导致错误匹配,这样帧间三角化就会出现错误,这种现象在实际过程中是比较常见的!
本文使用了RANSAC对多帧观测进行三角化。记特征追踪
,它是由一系列的外点率
未知的观测构成的集合。观测Tn包括归一化坐标
以及它对应的投影矩阵
。最终目标是最大化三角化模型对观测的复合程度,于是三角化的点
为:
其中是任何一种三角化方法(本文使用了DLT[2]方法)。一个比较好的三角化点需要满足两个条件:
;
值得注意的是,三角化的过程中使用了RANSAC,即从上述特征追踪中随机选择2个点(一对点)进行三角化,统计内点数(即,重投影误差小于阈值记为内点),选择内点数最多的那个作为三角化点。这个过程中存在一个问题:假如该点被追踪到了比较少的次数
,此时随机采样会重复选择相同的一对点进行三角化,这样会造成不必要的资源消耗。本文设计了一种可以产生不重复随机组的random sampler
;另外,为了能够保证以置信度为的概率至少选择一对无外点的最小解集,该过程至少重复进行
次。
为了消除累计误差,在图像注册以及三角化之后需要进行BA优化。由于增量式重建仅会影响邻近帧,所以没有必要每次都做GBA。因此,当图像被注册之后仅对相关性最好的图像集合进行LBA即可。只有当模型增长到了一定程度才会对进行GBA,这可以分摊时间消耗。
BA是SfM的瓶颈,本文针对“稠密数据采集”带来的问题设计了一种高场景覆盖度的图像聚类的BA参数化策略。
本文主要改进了文献[3]提出的方法,具体操作如下:
图像与地图点根据重建过程中是否受到最新帧点影响分为两类。对于比较大的重建问题,最新的重建帧仅会影响其邻近的图像以及地图点,很大一部分图像/点并不会发生改变。本文将不受影响的那部分定义很多组的集合
,其中
表示一组「高重合度」的相机,它被参数化为「一个相机」。那么问题来了,什么才叫做高重合度呢?作者提到,一个组内相机的共视区域必须高度重合。令场景中共有
个点,那么每一张图像都可表示成一个二值向量
,其中当某个地图点被观测到时为1,否则为0;有了以上定义之后,我们可以定义图像
与图像
之间的重合度
为:
之后呢,对待处理帧的
个空间最近邻的那些图像计算重合度得分并排序,这样可以构造一组「高重合度」的相机集合。对于这一个相机组的BA (Group BA)损失被构造为如下形式:
上式中
表示该组的外参变换,
表示组的固定位姿。全局的损失函数是所有组/非组的BA损失之和。经过上面一顿操作之后,BA优化的效率得到了大幅度提升。
可以看到三角化采样的数量有了大幅度减少。
增加Group BA之后,GBA的次数大幅度减少。
三角化以及GBA耗时下降。
本文提出了一套集精度/鲁棒性以及完整性为一体的通用SfM框架,实验表明该方法能够获得非常好重建效果。该框架进行了模块化实现,且开源,到目前为止很多视觉三维重建的任务(如视觉定位[4])基于此项目完成(框架不变,提升模块性能),可谓“功德无量”。
[1]: V. Lepetit, F. Moreno-Noguer, and P. Fua. EPnP: An accurate O(n) solution to the PnP problem. IJCV, 2009. 2, 4.
[2]: R. Hartley and A. Zisserman. Multiple view geometry in computer vision. 2003.
[3]: K. Ni, D. Steedly, and F. Dellaert. Out-of-core bundle adjustment for large-scale 3d reconstruction. ICCV, 2007.
[4]: Long-Term Visual Localization, https://www.visuallocalization.net/
本文仅做学术分享,如有侵权,请联系删文。