在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):TurtleZhong/Map-based-Visual-Localization开源软件地址(OpenSource Url):https://github.com/TurtleZhong/Map-based-Visual-Localization开源编程语言(OpenSource Language):开源软件介绍(OpenSource Introduction):Map-based-Visual-LocalizationA general framework for map-based visual localization. It contains
I will release some related papers and An introduction of the work in the map based visual localization. I guess the introduction will writen in Chinese first. So coming soon, Let's do it. 随缘持续更新中!!
[TOC] 基于地图的视觉定位基于已知地图的视觉定位是一个比较大的问题,基本上会涉及到slam系统,重定位,图像检索,特征点提取及匹配,多传感器融合领域。 0.写在前面作者:钟心亮 https://github.com/TurtleZhong 在写本文之前,我想先简单的总结一下历年用的比较多的slam系统,另外会提出一些开放性的思考问题,这些思考性的问题我也会提供一个简单粗暴的替代办法或者思路,然后后面讲这个项目可以解决的一些问题以及后面还要探究的问题,原则上来讲,本文: a)应该不会放出太多的代码[当然看心情],但会整理一些这个项目参考过的有意思的项目以及一些教学性代码小样; b)不会涉及到太多公式细节,尽量写成白话文,且大多数东西都能在github上找到或者进行魔改; c)会有这个项目的一些框架图,以及效果图,应该会对想涉足这个领域的有帮助; d)会涉及到slam系统,重定位,图像检索,特征点提取及匹配,多传感器融合领域。 主要做了以下方面的一些工作,但也并不是说拿来就能用。 a)基本上支持绝大部分SLAM系统的输出轨迹进行视觉地图构建,当然这是离线的,一方面,有些slam系统的历史轨迹是会经过优化的,所以这部分是拿最终的轨迹和图像来进行离线选择pose和image进行SFM构建地图的; b)支持传统特征如SIFT以及深度学习特征如SuperPoint等众多特征的地图构建,但问题在于轨迹的来源是各式各样的,我甚至可以使用rtk或者激光雷达作为真值,但实际重定位使用的时候必须要使用与构建视觉地图的特征一致,不然是会定位失败的;这里建议参考一些开源SFM的文档,hack它们也不算难。 c)整个框架在线定位基本基于C++开发,可以方便集成到ROS,所以也许会提供一个提取深度学习特征点和描述子网络,模型本身不会修改,只是改成cpp版本,便于后续开发,不然ros的python2环境和现在各大网络的python3环境很烦;一个可用的版本在这里. d)将SFM重建之后的元素分解整合成视觉定位所依赖的元素,譬如关键帧,特征点,描述子,3D点等等; e)一个可以兼容传统特征和深度学习特征的重定位框架,之所以叫重定位,是因为基于b步骤的地图定位的,另外本质上确实也是重定位过程; f)一个理论上可以融合imu, wheel encoder等其它传感器的融合思路或者说方案。之所以要是因为当你机器人走到了没有视觉地图的地方怎么办呢,对吧。 g)代码不一定开源,但会提供思路,会提供相关论文,这些应该只要追了近几年的论文很容易想到,也有很多论文是这么干的,我只是做了一点微小的工作。 1.历年slam系统总结与思考玩视觉slam的小伙伴想必都跑过各种vo,vio,slam系统,至少下面的一款你肯定玩过的ORB-SLAM,SVO,DSO,VINS-Mono,MSCKF,Kimera等等。下面先简单总结一下历年来slam系统的对比,对比如下表
1.1 现有slam系统到实际使用存在的问题ok 如果这些还不够,那么可以参考吴同学的 83 项开源视觉 SLAM 方案够你用了吗?,参考了那么多的slam系统之后,咱们来思考一下以下问题: 1)是否可以将表格中的一个或者某几个算法原理弄懂,在自己的相机,自己的项目场景中跑起来,修改一些参数适配自己的场景等等。 想必这个应该是最基础的,玩过的同学至少先能在数据集上跑通,跑通之后大多也都会买一个双目imu相机或者rgbd相机等等,用kalibr标定自己的相机,然后修改配置文件,不出意外的话,你拿着相机不断的动,相机的轨迹就会显示在屏幕上。ok,到这应该大家都是这么过来的。 2)有没有小改或者大改过一个开源项目,使得能更鲁棒,cover更多的corner case? 譬如老板给你提出的下面这些需求:
可能上面的问题有点夸大,但是应该来讲是现实场景中会实实在在遇到的问题。总结来讲,这几个问题可以归结为,大多数slam系统不考虑地图的保存以及复用,试想现在的自动驾驶行业,应该很少有说离开了高精地图来做定位的吧,这里的高精度地图当然也包含激光雷达事先建立好的点云地图。反观到视觉其实也是一样的,如果要完成一个需要满足机器人任何时刻放置在场景中都输出同一个绝对坐标的任务时,譬如室内或者小区送货等等,如果说你事先都没有一张地图的话,那么上面提到的83项slam应该都是以每次启动的时候作为坐标系原点,那么问题来了,你能保证每次都在同一个位置?就算保证了,有一些slam系统还涉及到和imu的初始化,你能保证每次初始化都一样? 1.2 基于已知地图的视觉定位涉及到的知识综上,我们这里主要关注的问题在于怎么尽量让一个slam系统可以实际使用,以及结合DL的一些知识去提高系统的鲁棒性。参考2D激光SLAM,使用激光雷达的SMLAM方案,我们先建图,然后保存地图,然后实际使用的时候我们把地图加载进来,然后对单帧图像进行重定位,再然后融合其他信息譬如轮子和IMU和GPS来做融合定位,这样机器人的定位输出坐标系就是你事先建立的那张地图的坐标系了,所有东西都基于一个坐标系是十分nice的!那么到这里基于已知地图的视觉定位主要会包含以下内容:
1.3 文章结构基本上来讲文章是针对已知视觉地图的定位方法,端到端的算法当然也能做定位,但本文还是将视觉定位拆开几个部分来讲。首先会确定整个定位框架的脉络,其次从如何构建稀疏特征点视觉地图,地图都可以包含哪些有用的元素以及图像检索,局部定位等等方向来讲解,最后从当前热门计算机视觉的方向怎么集成或者说提取一些对定位信息有帮助的元素来提高定位精度。 2. 基于地图的视觉定位框架-建图开局一张图,剩下全靠编,那整体上来说就以这个图作为行文的框架。 事实上,这里也已经很明显了,整体来看有三个大块:
这里的每一大快都是一块非常大的话题,我们就从这张图来分析整个流程,首先看图的上半部分为建图, 这个框架在这里是离线的,其过程为一个已知图像关键帧6DOF pose的一个SFM过程,最后生成视觉地图所需要的元素。所以整理以下其实可以将步骤罗列在下面
当成功获取到图像的时候,因为这里以稀疏特征点为例,所以必不可少的需要提取某种特征作为你的建图基础,这种特征一般来讲跟你的使用需求有关,你可以选择自己喜欢的特征点和描述子.
当有了图像,有了图像的pose之后,剩下的过程便是建图,建图又可分为在线建图和离线建图,在线建图可以使用文章开篇提到的各种slam方法,我们这里主要注重离线建图,为什么要离线建图呢?离线建图有它的优势,最终要的是获取到的图像和pose是可以人为控制的,也就意味着在精度方面有一个基本保障,这也是大多数基于激光雷达定位方法的方式,只不过地图换成了视觉地图。离线建图即恢复出2D特征点的3D位置,最小化到一个三角化算法的过程,最后整体做BA,关于三角化原理可以参考我之前写的博客.
到目前位置还有一个疑问是,有些开源工具仅仅支持自己的特征,大部分是SIFT,这里不得不说SIFT的牛逼,所以在选择开源工具时需要考虑是否支持外部特征,是否支持自己的特征点匹配方式等等,这里假设提供这么多方式都解决了以上问题,根据流程我们可以得到如下稀疏的三维特征点地图如下: 请注意,上图是根据已知pose进行重建,对重建之后的地图加载效果图,而非实时过程。 3. 基于地图的视觉定位框架-视觉地图元素建图的主要目标是构建一个描述周围环境的模型。生成的图具有多方面的作用:1)可以为使用者提供能够理解的地图参考,2)为机器人任务提供环境信息,如导航规划等 3)限制里程计的误差发散 4)作为先验模型为全局定位提供参考。这里参考了一个survey. 所谓的视觉地图可以分为很多种类,根据模型的输出以及地图的表达元素,可以将地图分为:几何建图(Geometric Mapping),语义建图(Semantic Mapping)和广义建图(General Mapping),几何建图主要提取场景的形状和结构描述。用于场景表达的普遍选择包括深度(2.5D)、体素(Voxel)、点(Point)和网络(Mesh), 语义建图则更加注重对环境的理解,如物体的类别,等等,这是一个比较高层次的地图,而语义地图又可以使用语义分割(Semantic Segmentation)、实例分割(Instance Segmentation)和全景分割(Panoptic Segmentation)来进行语义建图。当然在深度学习的极力推动下,也有一些更高层次的地图表达方式,类似于拓扑地图一样可以称作为广义地图,可以将地图搞成(Autoencoder)压缩场景、神经渲染模型(Neural rendering model)以及任务驱动的地图(Task-driven map)。 就这个项目来讲,我们重点关注几何地图中的稀疏点特征地图,以ORB-SLAM2为例子,我们来看一下如果一张稀疏特征点视觉地图如果用于定位,它需要哪些元素。 // TODO: Save/Load functions. 其目的是让读者自己实现地图的保存与加载功能,事实上这也是大多数SLAM/VO/VIO系统的问题,你想保存地图?那是不可能的。这个保存地图其实在16年就已经有人写出来了,并且我们当时也使用过,现在github上也有很多版本,这里给大家推荐两个版本: 言归正传,我们来看一下作为一个通用的稀疏特征点视觉地图,它包含哪些元素:
假设保存了这些元素之后,我们试想来了新的一帧之后,怎么去重定位出当前帧的位姿,首先对新来的帧提取局部特征点和局部描述子,然后根据局部特征计算出BOW向量,用当前帧BOW向量计算出与地图中最接近的关键帧(visual place recognition),这时候会有候选帧,事实上如果场景变化不大,那么你已经做出了一个精度为m级别的粗略定位了,因为关键帧是保存了位姿的,所以候选关键帧和当前帧的几何信息是接近的,故它两的pose也会很接近。其次最粗暴的方法就是与最像的关键帧先做2D-2D的特征匹配,然后关键帧的特征点有些是带有3D地图点的,所以一系列的outlier剔除之后你可以得到一群2D-3D的匹配,然后粗暴的PnP方法就可以计算出当前帧的位姿。总结其过程主要有两个步骤:
所以我们可以将地图元素像这样存放,当然你也可以根据自己的喜好序列化成自己的格式。 map
├── config
├── global_desc
├── keyframes
├── kpts_desc
├── map_info.bin
├── mappoints
└── voc_db 4. 基于地图的视觉定位框架-重定位之粗定位粗定位很好理解,又可以理解为回环检测的第一步,试图寻找当前帧与历史帧最像的候选帧,然后进行粗定位,方法又很多种,这里将其分为传统方法和基于深度学习的方法。由于当前输入数据和已知地图(在使用之前就建立好的)之间的视图、照明、天气和场景动态等因素变化,导致这一数据关联问题变得尤其复杂。在这里,我们只针对常用的方法进行讲解,具体使用要case by case. 下图表示了图像检索的样例: 传统方法来讲,这里讲最经典最经典的几个方法:
无论以何种方式实现,其输入是一张图,输出是database中的query对象。 当然以神经网络对图像的强大表达能力,近些年深度学习的方法比较流行,核心思路应该理解为对图像提取特征,这种特征能够描述这个场景,相似场景特征之间的距离要近,不同场景对应的特征向量的距离应该尽量远,这样才有区分度,这里也列举近些年一些基于深度学习的算法。
上述DL的方法基本上输入是图像,输出是一个N(1024/2048/4096...)维度的向量,即描述子。如果两张图很接近,那么其描述子之间的距离会比较接近,反之则比较距离较远,另外近年也有与语义信息结合的工作,但目前(2020.09)还没有看到比较好的开源工作。 这里推荐一个CVPR2017的一个Tutorial,需科学上网: 5. 基于地图的视觉定位框架-重定位之精定位 总结性的来讲,精定位无非干一件事情,想尽一切办法找到可靠的3D-2D的匹配对。我们将精定位部分分为三个大部分,特征点和描述子的选择,特征点之间的匹配以及位姿恢复。 首先来看特征点和描述子之间的选择,其实从SIFT开始,各种个样的hand-craft描述子和特征点不断兴起,大多是在保证精度的同时加快特征点和描述子的提取速度,这些方法也都大多被集成到opencv中,调用起来也很方便,另外近些年基于DL的特征提取方法不断兴起,也涌现了很多优秀的特征提取和描述子算法,它们的出现也都集中在解决精度,尺度变化大,运动模糊,光照变化大,旋转变化大,环境变化大等等还能保证精度的问题。 这里推荐CVPR2020的一个Workshop,CVPR2020: Image Matching Workshop. 内容还是比较硬核的,讲述了图像特征点和匹配的一些方法,大家可以仔细观看视频并学习。 对于传统算法,github上又一个不错的项目,对opencv中支持的各大detector和descriptor以及matching method都做了对比测试,包括特征提取匹配的耗时等等,不过看命名像是Udacity的课程,其github项目名称为 SFND_2D_Feature_Tracking 对于DL方法,我在第二章提到的,大家都可以去对于的github上去做测试。
到目前位置,我们选择了一套精定位的方法,同时我们也选择了用于粗定位的方法即特征点和描述子,当然特征匹配这一块是一个单独的问题,其实有很多特征点的匹配方法,但常规来讲,我们一般来讲常用的有暴力匹配和knn-based匹配,另外一些cross-check等等以及一些加速匹配的方法都可以用上,只要记住整个系统的输入输出即可。之后便是PnP求解问题,或者可以推广到BA问题,假设前期工作做的好,那基本上来讲直接PnP的精度也不会太差。 实质上,如果说到这里你还不明白为什么要花那么多时间讲挑选特征点,建图,定位,等等,都是有道理的,在这里我也想在声明一下大家都说自己是做SLAM的,其实本质上有可能是不一样的,不过大同小异,侧重点不一样,从我的角度来讲,定位是定位,建图是建图,SLAM(同时定位建图是同时定位与建图):
6. 基于地图的视觉定位框架-流程总结首先我们来看一个之前说的框架加载地图到单张图像重定位的一个效果,视频地址在Youtube,其次我们再回顾一下各个步骤都干了些什么事情。 <iframe src="//player.bilibili.com/player.html?aid=842567889&bvid=BV1M54y1r7gz&cid=250223772&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
7. 基于地图的视觉定位框架-融合8. ReferencesDH3D: Deep Hierarchical 3D Descriptors for Robust Large-Scale 6DOF Relocalization Loop Closure Detection through saliency re-identification IROS 2020 Image Matching Across Wide Baselines: From Paper to Practice [ECCV 2020] Learning Feature Descriptors using Camera Pose Supervision |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论