2018年7月,深蓝学院发起并承办的“第一届全国SLAM技术论坛”,邀请中科院自动化所申抒含老师作《基于图像的大规模场景三维建模》的报告。现将内容整理公布,希望更多SLAMer受益。
1. 三维几何视觉的核心问题
三维几何视觉是人工智能、机器人领域都会面临的问题。诸多无人设备都工作在三维的场景中,需要让计算机对三维场景有充分的感知和理解,这对机器与三维场景的交互、路径规划等至关重要。
在深度学习爆发的今天,基本上所有的二维图像的理解问题都被深度学习所统治,但在三维视觉领域,传统的三维几何视觉算法仍然占有主要地位。当然深度学习在三维视觉领域也正在蓬勃的发展,所以不排除传统算法也会被取代的可能。三维感知过程有以下两个要点:
(1)空间的三维几何结构;
(2)相机在空间中的六自由度位姿。
这是机器人对三维场景感知、决策、动作的关键基础信息。SLAM与SFM的研究目的都是通过二维图像数据还原环境的三维几何结构,以及相机的空间位姿。
目前主要通过以下两种途径从二维图像中恢复出场景结构和相机位姿:
(1)SLAM——视觉SLAM
在线处理连续帧的图像,实时重建稀疏或稠密的场景。由于在实时计算场景结构和相机位姿的过程中,所有的信息都是来自底层二维图像的匹配,必定存在匹配的外点和误差,匹配点的分布情况也会出现各种问题。SLAM重建过程中会有闭环检测这一步骤,将误差分配至每一个相机纠正漂移。检测闭环后需要进行图优化纠正漂移,使之前建立的场景结构恢复到正常欧式空间中来。
(2)SFM——从运动中恢复结构
SFM可看作是一个离线版的SLAM,但两者技术细节上还是有差异的。SFM系统输入的图像可以是无序的,不局限于视频或连续帧。重建场景稀疏结构以及计算相机位姿的过程是离线进行的。与SLAM最大的区别是SFM是在图像采集完毕后,对图像进行完全的匹配。当场景稀疏重建已经完成,如果新的相机进入场景后,可以实时确定相机位姿,相当于SLAM中把构图与闭环检测关闭只做重定位。
这两种途径本身都是通过二维图像来还原三维场景结构以及相机的位姿的,但两者有什么具体的区别?首先SLAM来源于机器人领域,除了视觉特征之外可能会引入其他的一些传感器的信息,而SFM是计算机领域视觉领域的一个概念,完全依靠图像。如果应用要求实时在线,不能离线完成,那么只用SLAM来解决。如果可以首先离线重建,定位后续再做,同时输入的是离散的图像,则可能需要使用SFM来完成。
如果输入的是视频序列且不需要实时在线处理,原理既可以输入到SLAM系统,也可以输入到SFM系统。这时两个系统处理的能力会有什么差异?是否在任何情况下两者都可以完成重建任务?
(1)SLAM系统基本沿用如下流程。首先SLAM的匹配是局部匹配,每提取到一个新的关键帧,与此关键帧之前图像进行匹配,并进行闭环检测;根据已建地图与当前图像中的点匹配通过PNP来计算相机位姿;利用三角化产生新的地图点;调用局部的BA调整,将小范围内的所有相机位姿和所有的三维点进行一次局部的反投影误差最小化优化,使我们局部的范围内的位姿和三维点得到优化。
SLAM的闭环检测将误差分解到每个相机,发现闭环后调用Pose Graph优化相机位置T与朝向R。优化完毕后调用全局BA使整体误差最小化。由于整体优化需要考虑三维点,所以优化的目标函数自变量更多。为使初始值更好,一般先用Pose Graph优化再做全局的BA优化,完成地图构建和相机位姿的解算。
(2)SFM跟SLAM的主体思想很接近,但仍然有诸多区别。SFM图像间经过完全匹配建立关系,并不是对图像逐帧进行匹配。匹配结束后从初始两视图开始重建,初始的图像可以是任意的,两图像可以是不相邻的甚至可以相邻很远的。与SLAM不同SFM的图像已经进行过完全匹配,所以只要满足初始种子点约束即可。
种子点选择后进行重建并添加新的图像,通过PNP计算相机的位姿,三角化新的地图点,最后进行局部的BA优化。SLAM的BA优化是在小范围内做优化,而SFM则是所有的相机位姿和所有的三维点都要参与BA优化,计算量较大但这样重建的鲁棒性较高。
最后所有相机都添加完之后,会调用完整的BA优化使相机的位姿和三维点都最优并且整个场景重投影误差最小化。SLAM如何解决图像增加过程中出现的漂移问题?主要依靠闭环检测之后的Pose Graph进行调整。而对于SFM系统:
(1)初始图像对是在整个匹配当中选择的,添加的下一帧图像并不一定与初始图像相临,可能是任意一帧图像;
(2)由于SFM是离线的系统,可提前构造出完全匹配图,所以在做增量式捆绑调整之前,就可对匹配关系图尽量的优化和简化,这是两者之间很大的区别。
2. 图像三维重建基本流程
SFM是对大规模场景进行高精度建模的第一步,一个完整的三维建模系统包括稀疏重建、稠密重建、点云分割、单体建模等多个步骤。
三维建模系统的输入是多视角的图像,首先重建出由特征点所构造的稀疏点云,以及每个相机的空间位姿。在相机位姿确定的情况下计算图像中每个像素点对应的空间点位置,得到稠密的空间点云。将稠密点云三角化处理成三角网格并贴上纹理,得到最终的网格模型。这时重建得到的三角网格模型只有三维几何信息没有语义信息。
为了形成三维语义模型,目前已有的解决方法是对点云进行语义分割,或是将三角网格分割为带有语义的网格。而语义模型由大量具有类别属性的三角面片构成,并没有几何属性。在点云语义分割后,还会进一步做单体的语义建模。将单个建筑物的点云变成类似于CAD所构建的模型,而不再是三角面片拟合出的模型,使模型完全矢量化和语义化。
3. 相关工作介绍
下面介绍一下近两年来我们在大规模场景三维建模这方面的一些最新研究进展。
3.1 基于正交最大生成树的渐进式SFM
SFM的关键问题主要有以下三点:
(1)所有的重建都是基于底层图像的匹配。提高底层二维图像的匹配结果的质量,可以显著提高SFM的重建质量和可靠性。
(2)特征的匹配需要消耗大量的时间。降低匹配特征点所需的时间,可使算法在超大规模的图像数据集上依旧有较高的重建效率。
(3)匹配的外点不可避免。减少外点的出现,尤其是在重复纹理和弱纹理区域,对保证重建的可靠性非常重要。
匹配点数量越多外点的个数也会不可避免的增多。如果图像匹配的结果中外点比例超过一定数量会直接导致系统崩溃,但如果匹配数量不够又会导致标定过程产生累计误差。基于这个矛盾,我们需要寻找一种途径使图像匹配的又少又好且保证充分的连接性。下图是我们解决这一问题的基本思路。图中的每个节点表示一幅图像,如果两幅图像之间有匹配关系,则节点间会建立一条边。边的颜色表示分组特性,相同颜色的连接关系更加紧密。
图中的每个节点都表示一副图像,但不同图的边所包含的内容不同,主要有四类图:
(1)Similarity Graph,两个节点的边上存储的值是两图的相似程度。两个图相似程度由BoW向量距离表示,如果相似程度达到一定的阈值则启动相应的匹配流程。
(2)Match Graph,两图之间如果相似度超过一定阈值,启动图像匹配。两图之间要作SIFT特征匹配,此时边上存储的就是两副图像间的特征匹配点。
(3)Pose Graph,基于已得到的两两图像间的匹配点计算本质矩阵,并从本质矩阵中分解出两相机间的相对旋转和相对平移。此时每条边上存储的是两相机之间的相对旋转与平移。与SLAM中的Pose Graph不同,SFM这一步并没有做重建,所以从本质矩阵中分解出的相对平移只有方向没有尺度。虽然五点法估计基本矩阵过程很快,但仍然要消耗大量的资源。
(4)View Graph,边上不仅存储了两副图象之间的相对旋转和相对平移,还存储了通过极几何验证的内点。现在绝大多数的SFM系统都要通过上述的操作,得到View Graph输入给SFM。
显然,因为匹配图像和计算相对位姿需要消耗大量的资源,所以我们从最简单的Similarity Graph着手简化计算。抽取一个图的子集,这个子集应尽量满足图的紧密连接性,并且使边尽量少,这样可以最大程度的减少匹配计算量。
另外,匹配的边越多引入匹配外点的可能性就越高,尤其是重复的纹理区域。如果抽出部分质量较好、可靠性比较高的一些边,除了降低复杂度之外,还可以剔除重复纹理弱纹理区域引入外点的影响。基于此想法我们提出基于正交最大生成树的渐近式SFM。基本的思路如下:
对SFM的输入不是View Graph,而是可以快速计算的Similarity Graph。相似性图中的每个点都有连接边,虽然越稠密对重建越好,但过多的边同样要消耗更多的资源。我们从图中抽出若干最大的生成树,并且保证最大生成树间是正交的。
一棵树就可以实现对所有结点的完整覆盖,而抽出若干棵正交的最大生成树,相当于对图像进行了多次覆盖。当覆盖次数足够多且足够的紧致,就得到一个紧致且稀疏的子图。因为子图中边的数量非常少,所以只匹配这些边可以极大减少匹配所消耗的资源。
那么什么是正交最大生成树?
比如Similarity Graph里有6幅图像,任意两幅图像之间的边都保存着两图像的相似度。在初始的Similarity Graph中,首先抽出第一棵最大生成树,树中边的相似性应尽量高,对所有的节点完整的覆盖一次。但是匹配当中不可避免产生外点,所以为了克服外点的影响,使树更加稳定,再抽第二颗正交最大生成树,正交是指这两棵树之间没有重叠的边,在这两颗树上做SFM即可。
通过抽取最大生成树,可极大减少匹配量。根据实验通过这种方法可减少6-20倍的匹配量,使匹配时间有数量级的减少。
因为子图中每一条边上都要计算图像之间的匹配点,利用SIFT可在图象中提取到相当多的点,成千上万的点在后续的捆绑调整过程中参与优化,产生大量的匹配序列(tracks)。我们把边进一步简化,边上的两两图像匹配后,匹配点在图像之间会形成匹配轨迹(tracks),我们希望从这些轨迹当中抽取出尽量完整覆盖图像、保持图像的连接性,又包含尽量少外点的tracks,称为tracks selection。
下图左方是进行tracks selection和捆绑调整后得到的三维点,如果我们不做tracks selection用原始的所有匹配点进行捆绑调整,最后得到右边的结果。可以看到密度相差非常大。把匹配点序列结构进行简化后,耗时将会从2.4小时降低至0.7小时,内存的消耗从原来的13G降到1.4G,并且重建的误差更小。
下图是北京的天坛的重建结果,要注意到天坛各个角度看起来都完全一样。另外一组很容易产生歧义的数据是对称的宾馆大堂,因为看起来完全一样,所以图象错误匹配的概率非常高,重建很容易失败。而如果使用最大生成树,我们只抽两颗树就可以完成这个重建,并很大程度克服重复纹理带来的问题。
3.2 天地融合式SFM重建
重建过程当中除了精度需要考虑,也需要考虑重建的完整性。尤其是大规模场景重建时,若只有地面拍摄的图像,那么屋顶就会缺失。如果用无人机拍摄,地面的场景细节就容易丢失。
如果要求重建的场景又完整又精确,通常需要将地面近景采集和航拍的远景采集结合起来。但是航拍的图像和地面的图像很难直接匹配,因此重建非常困难。
处理这种问题有两种策略:
一种是在图像匹配的阶段将空中图片与地面图片进行匹配,但图像虽然拍的是同一个建筑却因为视角和尺度相差太大,若直接用SIFT匹配,得不到任何有利的信息。
还有一种策略,地面的图像和空中图像分别单独做SFM,将得到的点云相融合。由于地面图像是近景,所以点云的密度和精度高很多,而天空图像是远景,点云密度和精度就会低很多。由于密度和精度的巨大差异,直接在两者的稀疏点云上面做点云的ICP配准通常是无效的。
为解决这个问题我们提出融合天地图像的SFM方法。天空图像和地面图像分别进行SFM,得到天空的稀疏点云和地面的稀疏点云;稀疏点云简化为稀疏网格;依据地面的三维稀疏网格及地面相机位置,通过地面图像合成天空相机位置处的虚拟图像。
如上图所示,左边是一幅空中图像,将较小的一块区域放大,右边是基于地面稀疏网格得到的合成图像,这时使用SIFT特征进行匹配就可以得到大量的内点。有了这样的地空匹配结果后,可以将地面的图像与天空图像连接点连成匹配序列(tracks),这样做一方面可以把天空和地面图像的匹配连接起来,另一方面更容易形成天地闭环以纠正模型的变形。下面就是我们重建后的结果。
3.3 通过主动学习对三维模型进行分类
目前我们已经得到大规模场景的高精度三角网格,但是得到的只有场景的三维几何结构,没有任何的语义信息。
目前将大规模的三角网络赋予语义类别有两种途径:
第一种训练直接对三维网格或三维点云分类的神经网络,但训练这样的网络非常困难,尤其是对于大规模场景的精细分类。
第二种更现实的方式是使用二维语义的分割网络对每幅二维图像做语义分割,并将分割结果投影至三维网格进行融合。如果想以这样的途径实现,通常需要从当前场景中选择出一些样本图像,以 Fine tuning的方式来微调参数,使语义分割网络更适合目前场景。
那么我们究竟需使用多少样本才能把原来的网络迁移学习到当前场景中?当然如果有很多手工标注的样本来Fine tuning网络自然最好,但这样的标注代价非常高。与单纯的二维分割不同,三维模型可以很大程度上指导的二维语义分割,并大幅降低手工标注量。
这里我们使用了基于主动学习(active learning)的方式来降低手工标注的样本量,即有选择性的进行标注。先标注很少的样本去训练网络,再利用网络去分割剩余图像,观察剩余的图像分割结果中什么样本是比较难分,再对比较难分的类别进行标注,再次训练网络。再次去分剩余的样本,继续观察哪些样本分类不够好,然后依次的迭代。
在整个流程中3D模型都扮演着很重要的角色,每一轮图像分割完毕后,都在3D模型进行融合得到三维分割结果,并反投回图像上作为弱监督信息来衡量图像的分割质量,以此作为选择难分样本的标准。
结果如上图,刚开始使用三幅图进行手工标注,分割融合后得到最左图的结果。之后每一轮从中挑出5幅比较难分的结果人工进行标注,经过四轮之后网络就收敛了。最终整个数据集有超过1600幅图像,而我们只需要从中挑出18幅给人进行手工标注,就可以得到超过93%的分割精度。这个结果让人意外,因为一般的迁移学习至少要标注上百幅的图像,才能使模型收敛。
3.4 基于MVS的城市大尺寸场景模型化
网格模型转为语义模型后,三维网格中每个三角面片既有自己的几何性质,也有自己的语义性质。但这个模型仍然是以大量的三角网格来表达的,这种表达方式与人工建模结果差距很大。例如用CAD进行建模,可以使用平面和曲面来紧凑的建立一个建筑物模型,而使用三角面片来表达如下的场景却需要成千上万的面片来表达。显然,这个模型虽然同时具有几何和语义信息,但它的尺寸过大,并且三角网格存在许多的噪声。因此我们需要将它变成完全矢量化的模型。
上图中左边第一列是航拍的图像,左边第二列是三角网格通过语义分割成为单体的建筑。我们希望把他全自动的变成符合真实建筑物的矢量化模型。模型应尽量符合现有的行业标准例如CityGML,CityGML是国际地理信息联盟发布的行业标准,为方便建筑物语义建模将建筑物分成LOD0,LOD1,LOD2,LOD3这几级。因为这个过程当中涉及到大量的图形学操作,所以做不详细的介绍了,只介绍一下主体的思想。基本上分为4步:
(1)对每个建筑进行语义分割后,首先进行主方向的检测。这个难度在于整个网格模型本身有很大的噪声,所以在这样的场景下检测主方向还是需要一定技巧的;
(2)要建立LOD2模型,最困难的是建筑物顶面的细节,而通过图像重建得到的网格,很多顶面的细节变得模糊,所以我们在RGB图像上做边缘检测,并在对应的在深度图和法向图上进行分割,之后把两者融合起成顶面,还原出许多边缘的局部的细节;
(3)形状的检测,需要通过一种改进的VSA算法来检测建筑物顶部不同面的平面,然而因为有噪音的影响,所以检测出来的平面可能在相交性上会出现不一致。为此我们会做一个整体的优化,使整体的平滑性和一致性更好;
(4)最后基于这些结果,就可以得到包括顶面和立面细节的LOD2模型。
实验的结果如下,在一个通过倾斜摄影拍摄的区域,重建出的原始网格是由9400万个三角面片构成的,可以看到噪音非常大的。中间部分是完全语义化和矢量化的LOD2模型。我们输入9400万个三角面片,输出只有79万个面,相当于在几何结构没有缺失的前提下数据量压缩到原来的十分之一,,并自动重建出4343个单体建筑的LOD2模型。这种完全矢量化的模型不仅规整性高得多,也利于我们的存储、传输、使用。
4. 未来发展趋势
最后谈一下我对未来发展趋势的个人见解。
我们目前所做的许多工作,比如应用于智慧城市、数字文化遗产,虚拟现实等领域的三维模型,都属于给人进行浏览和使用的三维精模,比较重视模型的完整性、准确性。另一方面,使用图像得到的三维模型也可以给机器使用,例如高精地图,模型本身是给机器用来进行路径规划、场景的感知、空间高精度定位的。
目前给人用和给机器用这两种应用是单独发展的,各有自己的一套思路,两种规范也没有完全相通。未来就是两者的融合,使模型可以同时适用于地理信息系统、BIM、智慧城市、高精地图等很多情景。
注:文章由深蓝学院第二期视觉SLAM课程优秀学员张国星整理,未经允许,禁止以任何形式转载。
来源:深蓝学院,关注“深蓝学院”公众号,查看更多论坛报告。