基于ORB-SLAM2与YOLOv8剔除动态特征点
以下方法以https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download#freiburg3_walking_xyz数据集进行实验测试APE
首先在不剔除动态特征点的情况下进行测试:
方法1:segment坐标点集合逐一排查剔除
利用YOLOv8的segment获取动态对象(这里指人person)所在区域的坐标点集合segpoints,之后将提取的特征点的坐标逐一与segpoints中的所有坐标作判断,将出现在segpoints中的特征点的坐标改为(-1,-1),然后在畸变校正时会将坐标为(-1,-1)的异常坐标剔除。
得到的轨迹精度还是可以的,但是segpoints中的数据量太大,完成一次剔除任务花费的时间太长(基本在20~30ms,画面中人所在区域较大时能达到50+ms)。
方法2:利用目标检测框
利用YOLOv8进行目标检测,将检测到的目标分为两类:动态对象和静态对象。
这里仅将person设为动态对象。获取动态对象及静态对象的检测框后判断提取的特征点是否在动态对象检测框内以及是否在静态对象检测框内。
1.特征点在动态对象检测框内而不在静态对象检测框内,则满足剔除条件,将其剔除;
2.其余情况皆不满足剔除条件。
采用这种方法速度提升至0.02~0.03ms,最多也在0.05ms以内。
精度与方法1差不多。
再次测试
下面以数据集https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download#freiburg2_desk_with_person对上面两种方法再次进行测试APE
首先ORB_SLAM2的运行结果如下:
方法1的结果如下:
方法2的结果如下:
速度方面仍然是方法2要比方法1快上千倍,精度方面相差不大。
RPE结果:
ORB-SLAM2结果:
方法1:
方法2:
虽然在程序运行中发现动态对象影响的特征点剔除的效果没有达到理想效果,但与ORB_SLAM2相比精度确实提高了很多,采用方法2在速度方面也没有太大影响。
一开始采用方法1的想法是可以获取所有人所在区域的坐标点集合,然后将提取的特征点与此坐标点集合进行对比判断进而剔除,但是在实现过程中发现利用YOLOv8获得的坐标点为整型坐标(我刚开始认为图像是由一个个像素组成的,一个点就是一个像素,因为我将获取的坐标点集合在空白画布上展现是图像是连续的,在上一篇博客里面写过,之后我会继续思考方法1的),而提取的特征点坐标是浮点型,很多应该被剔除的特征点却没有被剔除,而且由于提取的特征点是比较多的,人所在区域的坐标点也是很多的,使用嵌套循环时速度就会很慢了。
而方法2是利用识别物体的检测框来判断提取的特征点是否为动态对象的特征点,但是在程序运行时,比如以desk_with_person为数据集时,person坐在chair上面,chair的检测框是比较大的,导致许多person身上的特征点没有被剔除。
如果朋友们有更好的方法还请分享一下。一起学习!一起进步!