arxiv上一篇很新的视觉SLAM论文,能够在不使用GPU的情况下进行语义分割的辅助运算。
一、跟踪流程
作为一个语义结合的视觉SLAM,其基本的思路和以前看过的DynaSLAM基本类似,都是依赖语义分割模型对场景中动态的特征点进行剔除,这样子减少动态物体对里程计的干扰。传统的解决方案是传入的每一帧开两个线程,一个用于语义分割,另一个用于特征提取,之后根据语义结果过滤特征结果。由于特征提取速度一般要比语义分割快得多,所以经常会出现整个系统等待语义分割模型推理的现象。而NGD-SLAM通过巧妙的框架设计,让跟踪线程不需要完全等待语义分割。
从论文中的流程图可以看出,第一帧还是存在一个等待的过程,但是后续的过程中得益于语义跟踪的加入,并不需要每一帧都等待。
二、语义线程
整个框架选择使用YOLO-fastest来进行语义分割,而且作者设置了一个很独特的缓冲区用于传递模型的输入和输出。输入的部分会实时更新,推理的结果会保存到输出缓冲区。跟踪线程每处理一张图像,就把这张图放入输入缓冲区,之后模型推理完再放到输出缓冲区。这样跟踪线程就不会被迫等待语义分割线程。但这也使得两个线程不同步,也就是处理的图像并不是同一时刻的,这个问题NGD-SLAM使用掩码预测进行了修正。
三、掩码预测
所谓掩码预测,其实就是根据类似恒速模型的方法,推测一个可能动态物体的位置。作者将这个模块分为六步。
检测
对于上一帧的图像,首先使用YOLO进行目标检测,得到一个带有语义信息的bounding box。这一步和DynaSLAM的方法是一样的。
分割
bounding box一定程度上已经给出了动态物体的位置信息,但是不够准确,所以这里又对检测后的bounding box基础上,利用深度信息进行了一次分割。作者并没有提到深度信息哪里来的,但是如果是对整张图进行的分割,那么就要求每个像素都要有深度,这种情况下,估计作者使用的是深度相机来直接得到深度。
取样
分割完成后,我们得到了上一帧图像动态物体的掩码,之后为了完成掩码预测,作者对这部分归属于动态物体的像素进行了采样。标记为动态物体的像素划分为15×15的网格,每个网格内提取FAST特征点并选取响应值最高的一个,如果提取不到就随便选一个。这些点就会被认为是动态关键点。
跟踪
动态关键点之后使用光流法进行跟踪,这里的跟踪不是ORBSLAM里面的那种跟踪,而是利用光流法,通过最小化光度误差的方法,计算出动态关键点在当前帧的位置。我们也可以将其理解为是利用实际SLAM过程中图像之间差距不大的特点,让动态关键点也能像一般的关键点一样进行跟踪,但是由于动态物体和相机移动不一致,所以这里用光流法进行跟踪。
聚类
得到当前帧的动态关键点之后,作者又使用DBSCAN进行了一次聚类,这主要是区分出动态关键点分属于那些动态物体示例。
预测
聚类之后,我们基本可以得到每个动态物体的大体位置,但是由于是采样点,所以边缘位置存在一定的不稳定因素。作者又补充了一个深度信息的预测,具体来说也就是用大体位置指示出来的bounding box位置,通过深度信息进行聚类来修正掩码,以此得到边缘位置更加准确的掩码。
对于这个掩码预测机制,个人理解是除了第一帧,其余的每一帧实际上都是根据上一帧语义分割的结果进行的预测,而不是真正的语义分割结果,通过将分割线程后置,确实可以解决等待问题,但代价就是推理结果的时间不对等。实际上的运行过程应该是这样的,第一帧进入系统,先语义分割得到结果,然后进行跟踪以及关键帧初始化的内容,第二帧开始,用第一帧的语义分割结果产生预测掩码,这个掩码直接拿到跟踪线程使用,与此同时语义分割线程依然在进行推理,推理完可能赶不上第二帧的跟踪,但可以用于第三章预测掩码的生成。
四、双阶段跟踪
双阶段跟踪指的实际上是对动态物体和静态特征点采用两种策略的跟踪。其中动态物体跟踪和掩码预测的过程是一致的,但作者提到使用YOLO可能会导致图像出现旋转时分割失败,这种情况作者选择直接使用前一帧的预测掩码作为分割结果。而对于静态特征点,作者使用了光流法进行跟踪。
虽然跟踪过程使用的是光流法,但是框架依然保留了ORB关键帧的提取,当稳定跟踪的静态关键点数量不足时,就会用ORB特征点提取来补充。对于一般的ORBSLAM,基本流程是每一帧提取特征点然后计算描述子,稳定跟踪的情况下利用恒速模型计算出位姿,当出现关键帧的时候,就利用共视图找出共视关系最好的关键帧,对这些关键帧上没有匹配地图点的特征点进行描述子匹配并三角化。而在NGD-SLAM中,个人感觉基本流程保持一样,只不过跟踪过程的方法变了,不是投影找关键点,而是光流法跟踪,跟踪得到的点直接被认为是特征点。不理解的地方在于,光流法跟踪不提取特征点,这也就是说当前帧跟踪到的点并不是真正意义上用提取器提取出来的特征点,那么在提取特征点的部分这里会不会出现重复。
五、关键帧跟踪
NGD-SLAM保留了ORB相关的代码,这主要是用来维护共视关系等ORBSLAM3中用到的关键部件,当静态跟踪效果不好时也会使用这种方法进行跟踪。所以双阶段跟踪的部分计算出来的位姿在产生新的关键帧的时候叠加产生两个关键帧之间的位姿,用这个位姿进行ORBSLAM3中的新建地图点等内容。
总的来说文章掩码预测的部分是很有新意的,给推理速度过慢情况下的处理方法提供了一个很好的解决方法。网上说这是一个本科生的毕业论文,能做到这种程度已经贼厉害了,但是从实验和一些实现细节上来看,依然有改进的地方。