动态场景下基于实例分割的SLAM(总结与反思)
动态场景下基于实例分割的SLAM(总结与反思)
简单的聊聊之前做的动态场景下的语义SLAM问题吧。
先介绍下我毕设的总体思路:双目,室外,框架选用ORB-SLAM2,并加入MaskRCNN语义分割,整体结构设计仿照DS-SLAM,但是没有使用光流金字塔追踪,而采用LightTracking思路,利用两帧之间计算F矩阵,并用RANSAC算法计算已采集的特征点序列,将其分离为预选动态特征点和预选静态特征点。之后,检查预选动态特征点序列,如果预选动态特征点序列位于MaskRCNN传递的先验掩码范围内,则认为该动态特征点序列为真实动态特征点,从关键点序列中删除。
与DynaSLAM相比,这种方法避免了当特征点位于实际上并不移动先验物体掩码内,经常被无故去除的情况;与DS-SLAM中,这种方法避免了当前图像存在一个移动的先验掩码与一个非移动的先验掩码时,两者掩码范围内的特征点同时被剔除的情况。
实验数据集选取KITTI数据集01-03。其中01序列为高速公路场景,存在大量动态车辆,为主要测试对比内容;02序列含有大量的静态车辆,适合于其他数据集对比;03序列是仅存在少量车辆,大部分为静态场景,适合作为对照基准。
然而综合而言,对于我个人毕设来说,最终达到的效果远远没有我所满意的效果。数据不方便放出来,仅讨论动态剔除情况下,系统总体精度提升效果并不明显,甚至有时因为参数选择降低了总体效果。
个人以为,有以下几个原因导致了下述效果:
1.Mask R-CNN本身识别问题:
语义分割网络本身精度并不高,这里精度不高,不仅仅只分割算法的精度,其实还包括了识别的精度,经常会出现以下的错误:
上图把光影变换识别为了汽车,下图把绿化带识别为了汽车。在01序列中其实更常见的是将护栏识别为行人,使系统可能丢失一些可靠的特征点。
其次,还有对小物体和识别问题,以及上一帧存在该物体掩码,下一帧该物体突然消失的情况。
对于上述问题,一个发散的想法是利用数据关联算法,将无监督学习引入语义分割优化或者是slam系统,加强识别的准确性和稳定性。或者是更换更加适合室外的cityspace数据集,但比较遗憾的是,目前尚未找到这类数据集权重,而自己从头开始训练代价太大(8gpu跑两天)
或者另外一种思路是改用yolo算法之类的纯检测,关于这个问题我去问了一位同样做这个课题的朋友(@Xav1er),据他所述,由于仅做定位不做分割,删除范围较大,所以速度明显更快,准确性更高。但是也存在一定缺陷:如不利于点云地图标注,无法对追踪物体实例化等。
- 特征点选取问题
尽管采用了按网格分配尽量均匀分配特征点,但是在01序列中由于高速公路上存在大量树木,这些树木于远方天空相接,不是很容易精准的匹配,因此也造成误差的产生。
综合1、2点问题,我个人以为如果不考虑实例化动态物体,可以选全像素分割,剔除和天空相连的特征点。或者做一些全景分割的工作。
- 对极约束参数选取变换
此外,由于需要适用不同场景,对极约束偏差dd难以选择。过于严苛可能导致异常点过多,可能会多删一些特征点,这一点在掩码出现识别错误后很麻烦。过于宽松又有可能找不到异常点。我认为可以基于特征点匹配质量动态的设定参数,但是目前还没有思路。