动态场景下基于自适应语义分割的RGB-D SLAM算法

作者:王梦瑶, 宋薇

编辑:东岸因为

来源:一点人工一点智能

00  摘要

目前较为成熟的视觉SLAM算法在应用于动态场景时,往往会因动态对象干扰而导致系统所估计的位姿误差急剧增大甚至算法失效。

为解决上述问题,本文提出一种适用于室内动态场景的视觉SLAM算法,根据当前帧中特征点的运动等级信息自适应判断当前帧是否需要进行语义分割,进而实现语义信息的跨帧检测;根据语义分割网络提供的先验信息以及该对象在先前场景中的运动状态,为每个特征点分配运动等级,将其归类为静态点、可移静态点或动态点。选取合适的特征点进行位姿的初估计,再根据加权静态约束的结果对位姿进行二次优化。最后为验证本文算法的有效性,在TUM RGB-D动态场景数据集上进行实验,并与ORB-SLAM2算法及其他处理动态场景的SLAM算法进行对比,结果表明本文算法在大部分数据集上表现良好,相较改进前的ORB-SLAM算法,本文算法在室内动态场景中的定位精度可提升90.57%。

01  引言

以视觉传感器为核心的同步定位与地图构建(SLAM)算法通常被称为视觉SLAM。由于图像本身包含颜色、纹理等丰富的场景信息,且相机的成本相对于激光等其他传感器较低,近年来视觉SLAM算法备受关注。目前较为成熟的视觉SLAM算法有特征点法[1-4]、半直接法[5]、直接法[6]等,但这些算法中都隐含了静态场景的强假设,导致其仅适用于处理全静态或仅包含少量、较小移动对象的场景,在较大程度上限制了其应用范围。

ORB-SLAM[1-3]等传统的视觉SLAM算法是通过随机抽样一致性(RANSAC)算法剔除外点,但仅能处理外点数目较少的情况。当动态对象面积较大或数量较多时,RANSAC算法会误判动态特征点为静态特征点,这使得仅有的少数静态特征点被当作外点剔除,而应当剔除的外点却被用于位姿估计,导致位姿计算结果完全偏离真值。

近些年,国内外有较多学者对上述问题进行研究。Wang等[7]在光流信息的基础上,基于最大组属于静态环境的假设进行稀疏点追踪聚类,完成对动态对象的划分。Sun等[8]根据自运动补偿图像差异的方法来大致检测运动对象的运动,再使用粒子滤波器和最大后验(MAP)估计器来精确确定前景,剔除动态干扰,但此方法要求场景中必须包含平面,且静态背景在图像中的占比要大于动态对象。林志林等[9]将场景流表示为运动矢量,通过虚拟地图点和高斯混合模型进行运动物体检测。Chen[10]提出一种双目视觉SLAM系统,通过改进的半全局匹配算法获得视差图,结合超像素分割的结果最终确定运动对象的边界。文[11]将提取的特征点投影至深度图,在深度图上进行聚类操作,再通过两次极线约束以及运动模型完成动态点的剔除,但是在静态背景与动态对象的深度差较小时,容易产生错误的聚类结果。文[12]提出点特征和线特征结合的方法,根据点特征计算初始位姿并赋予线特征静态权重,进一步剔除动态线特征,此算法中使用的线特征虽然稳定性较好,但不易提取,且该算法仅包含里程计部分,并非一个完整的SLAM系统。魏彤等[13]提出一种适用于视觉导盲场景的双目SLAM系统,其采用改进的半全局块匹配算法结合极线约束对动态对象进行区域分割,再通过种子点生长算法对轮廓进行优化,此算法虽然适用于动态场景,但受其算法限制,只适用于场景中静态点数量占优的情况。Bojko等[14]使用提前生成的动态对象掩模对网络进行训练,将此网络与ORB-SLAM2和LDSO算法相结合,提升了原算法在动态场景中的定位精度。Bescos等[15]使用语义分割网络和生成式对抗模型对场景中的动态对象进行分割并对分割后的动态对象部位进行修复,最终生成了静态点云地图。Bao等[16]针对工地场景中有多台大型建筑机器的情况,将语义信息与目标层几何约束相结合快速检测场景的静态部分,提高了在真实工地场景中相机运动跟踪的鲁棒性。

随着深度学习技术和硬件水平的快速发展,越来越多的研究将目标检测、语义分割、实例分割等深度学习网络应用于SLAM系统,以提高机器人对周围环境的认知能力。Bescos等[17]提出DynaSLAM算法,利用Mask R-CNN[18]分割出“人”所在区域,通过多视图几何法检测非先验动态对象,并构建静态背景地图,可生成较好的位姿估计结果。Yu等[19]提出DS-SLAM算法,使用SegNet网络[20]进行语义分割,结合语义信息和光流信息进行运动一致性检测,提高了位姿估计精度并生成包含语义信息的八叉树地图。但上述DynaSLAM和DS-SLAM系统对每一帧图像均进行语义分割处理,耗时较长,即使SegNet网络的分割速度稍高于Mask R-CNN法,但仍远远不能达到实时性的要求。Xiao[21]为解决目标检测网络SSD[22]查全率低的问题,基于运动对象的加速度趋于0的假设,提出了一种漏检补偿算法,根据前后帧动态点的位移大小决定是否要将其剔除。文[23]提出的Detect-SLAM算法仅在关键帧进行目标检测,在一定程度上提高了运行效率。SaD-SLAM算法[24]使用Mask R-CNN网络获得语义信息,借助极线约束完成真实动态点的确定,在一定程度上提升了SLAM系统的位姿估计精度,但是该算法在使用前必须先获取场景数据集,提前做好掩模获取工作,因此不能用于需要即时定位的场景。Zhang等[25]利用实例分割网络和稠密光流追踪法,完成室外动态场景下的位姿计算及对象追踪,但该方法仅适用于室外运动的刚性对象,如汽车等。

本文针对室内动态场景,提出一种基于语义分割的视觉SLAM算法,通过跨帧检测的形式,将语义先验信息向后传递,再与加权静态约束结合,完成特征点真实运动状态的分类。真实运动状态的判断,一方面可以减少动态特征点与静态特征点的误判;另一方面,针对语义分割出的运动物体,并非直接剔除,而是判断其当前运动状态,如当前静止则可看作是静态特征点,从而增加参与位姿计算的特征点个数,提高位姿估计的精度。同时,跨帧检测方法可降低深度学习网络对SLAM系统实时性的影响,保证系统在提高位姿精度的同时,仍满足一定的实时性要求。

02  系统框架

本文的系统框架基于ORB-SLAM2算法构建,如图 1所示,共包含4个并行线程:追踪线程、语义分割线程、局部地图线程以及回环检测线程,重点对其中的追踪线程和语义分割线程进行了改进。系统的输入为一组连续的RGB-D图像,将其传入追踪线程后,先进行ORB特征点提取,根据先前场景中的运动等级信息和运动等级分配算法确定当前帧中每个特征点的运动等级,将特征点分为静态特征点、可移静态点和动态特征点集合,然后根据静态特征点集初步计算相机位姿。

fd2acc1fde9b34da659e1f058efdc2b7.jpeg

图 1 系统框架图

若系统判断当前帧需要增加语义信息来保证帧中特征点能被正确分类,则将当前帧的RGB图像传入语义分割线程进行处理,得到当前场景中包含的潜在运动对象的类别以及位置信息。追踪线程根据此信息以及特征点的运动等级信息对特征点的真实状态进行判断,避免发生动态特征点与静态特征点的误判情况。最后将追踪线程初步优化后的位姿、特征点、关键帧等信息传入局部建图线程以及回环检测线程,利用局部光束平差法(BA)、全局BA等优化方法对位姿、地图点再次优化,最终获得精度较高的位姿估计结果。

03  基于语义分割的特征点运动等级划分

近年来,随着深度学习技术的快速发展,提出了SegNet、Mask R-CNN、YOLO v1-v5等多种语义分割、实例分割或目标检测网络。其中,目标检测速度相对较快,但会同时选中目标和部分背景,因此需要再进行额外处理;而语义分割和实例分割可以直接获得较为准确的轮廓信息,其中实例分割可进一步区分同一类别的不同个体,但耗时也更多。

本文从深度学习网络的性能及SLAM系统实时性的角度考虑,最终选用Light-Weight RefineNet[26]网络完成语义分割的任务,对网络进行微调并利用PASCAL VOC2012数据集对该网络进行训练,该数据集共有包含背景在内的21种类别,涵盖了室内常见的物体,如人、桌子、椅子、杯子、显示器等。对象的运动状态由静到动,取值范围为0~10,0表示该物体的移动等级最低,可以认为是完全静止,比如建筑物等;10则表示该物体的移动等级最大,比如人、动物等。

为了平衡语义分割网络的精度和速度,本文在系统中单独开设线程来完成语义分割工作,并提出跨帧检测算法来进一步降低语义分割网络对SLAM系统实时性的影响。算法根据特征点运动等级初始化的结果,结合可初始化的特征点个数与总数的占比自适应选择图像帧进行语义分割处理。若采用间隔固定帧数的方法,则当间隔较大时,可能会产生某些帧中的部分特征点运动等级无法初始化的问题;若间隔较小,则语义分割次数较多,无法起到保证系统实时性的目的。

3.1 运动等级初始化

当SLAM系统处于初始化阶段时,仅根据第1帧图像无法判断当前场景中的对象是否处于运动状态,因此在初始化阶段,特征点的运动等级取决于语义分割线程获得的掩模。运动等级的定义如下:

fb3400df7010b39538ca4c08eadd0a40.jpeg

其中,Class集合为PASCAL VOC2012数据集划分的除背景以外的物体的20种类别;bc380c3c26991e060fd34b725065b499.png与Class中的元素个数相同,表示各类别的先验运动等级,取值范围为0~10,具体取值如表 1所示;式(3)用来初始化特征点的运动等级,设初始化阶段第0帧中第30bd529107a20f853fafba4f4d7f56b3.png个特征点a09ef6a8a692c835208e540e05346d74.png所属对象类别为c3a535174ef25e5fe76d6c90eba03041.png,则该特征点的初始化运动等级3708cd694609be1cc4f890fd77ba61a5.png等于所属对象的先验运动等级。

表 1 运动等级初始化

cb3b3342921134b7a2648f8a8c7db087.png

表 1中*表示该类别在室内不会出现,因此直接将其等级设为0,其他则是根据对应类别对象在日常生活中的状态进行定义。本文将运动等级小于等于4的特征点定义为静态点,大于4且小于等于7的特征点定义为可移静态点,大于7且小于等于10的特征点定义为动态点。这样,在初始化阶段,利用语义分割结果便可得到各特征点的运动等级。

3.2 运动等级传递策略

为保证系统实时性,本文并非对每一帧图像都进行语义分割,而是由跨帧检测算法自适应地选择部分图像帧进行处理。对于未采取分割操作的图像帧,本文提出了一种融合上一帧、对应关键帧、以及局部地图点等信息的运动等级传递策略来判定当前帧中特征点的运动等级。

在运动等级传递之前,需要先完成特征点匹配。采用基于ORB-SLAM2算法的特征点匹配方法,通过恒速运动模型和词袋模型加速特征点的匹配。之后的运动等级传递过程如图 2所示。

0bfc72dc2d4b4bcdfd0b1429cc8f1971.jpeg

图 2 运动等级传递策略

根据特征点在上一帧或在局部地图中是否有匹配点,可将分配方法主要分为2种:

(1) 如果在上一帧或局部地图中找到匹配点,如图 2中标号①②所示的匹配过程,则可以直接将该点的运动等级赋值为匹配点的运动等级;

(2) 对于没有找到匹配点的特征点(如当前帧I中的蓝色点所示),则需根据当前帧RGB图及对应深度图的信息在当前帧的特征点中寻找它的“相似点”(如当前帧II中的实线椭圆所示),并将该点的运动等级赋值为对应“相似点”的运动等级。

如果该过程中也没有找到“相似点”(如帧中紫色点所示),则需调用最近一次进行语义分割处理的图像帧。如果在该帧找到了匹配点,则该点的运动等级等于其匹配点的运动等级;否则,认为该点为新的特征点(如当前帧IV中的蓝色点所示),将其运动等级初始化为5,以便后续正确分类。

该过程的数学模型描述如下:如果第帧的第d02e629491b5bec6259e0d930e0d0588.png个特征点950ce532208a00259a932df9dfed856f.png在上一帧或局部地图中找到了匹配点,则用与其匹配的上一帧特征点6b1fedd9a2cacda027518764a61fd51b.png或地图点对应的运动等级来更新该特征点的运动等级。该过程可表示为式(4),其中“∼”表示匹配关系。

41196cd98bf80d37ea64da3cef4bfa4c.png

对于没有找到匹配点的特征点,则需作进一步的处理,即根据距离约束和深度约束的加权得分在当前帧中寻找“相似点”。在以当前特征点98fac15c6a5234e1c3e8c3ff9690b18b.png为中心、b755239af7c4948677b0e55cc0b3fa21.png为半径的圆形区域内搜索特征点并将其放入fab99993388ca6a47e04a3bdfb246cb8.png集合中,本文认为与当前特征点距离越近、深度差值越小的特征点与当前特征点越相似。但多数情况下,最小距离和最小深度差不能同时满足,因此将两者进行加权,总得分计算公式为

539ac0762bd1b450fa03ed6946f02c0e.png

其中,表示集合bbfaf03c9aa995d370eaa674b7518c95.png中第6d86a3d50ea85c1064306f26a81950a3.png个特征点c5d3bba72fb9a319b42c016105337fc3.png加权得分,ffd542b6301522c323462439bd12f1d7.png表示特征点5543c3e9e37d430f3933ba7b1f82ad76.png与当前帧第j个特征点f9e95633eb44b8adde772d95d03e2aeb.png之间的欧氏距离,单位为像素,947c8f547575d5ed701b88c4016cbc34.png表示8c25f928a45818584c3a9027b1ae4012.png731cb39e4eefdeb50f6bd33d40406927.png之间的深度差的绝对值,单位为m,由于8e8201c4b4b6e2ad430da8f139c2fe23.png和单位不同,因此需要用参数4347e4c2e50a71d08a430bb77735bf05.png522856ec529c2e97665f0eb03c8797bd.png将其归一化,则为距离值和深度差值的权重。

由式(5)可知,20cac67a2492484a7b44952e745e29d4.png集合中得分越低的特征点的相似度越高,但为确保2个特征点之间具有足够的相似性,仅当该点得分小于等于阈值时,才认为两者“相似”,否则认为在当前帧中没有特征点与其“相似”,需要与最近一次进行语义分割的帧再次进行匹配,若依旧没有找到匹配点,则认为该特征点为新出现的特征点,将其运动等级初始化为5。

运动等级传递前后的特征点状态如图 3所示,图中标志中心点为特征点位置,绿色标志表示参与位姿计算的特征点,红色标志表示不参与位姿计算的动态特征点。图 3(a)为直接采用ORB-SLAM2算法得到的当前帧特征点,没有经过筛选,所有点都将参与位姿计算;而图 3(b)为经过运动等级传递过程后的特征点分类结果,图中2个人正处于运动状态,由图可知,2个人身上的大部分特征点都被正确归类为动态点,不参与位姿计算过程,因此会在较大程度上提高后续位姿估计的精度。

0fc3e9f0e62f2aef69370e8e2cbfffca.png

图 3 运动等级传递示意图

04  基于加权静态约束的位姿优化

4.1 位姿估计

运动等级传递过程结束后,可根据特征点的运动等级值将其存入对应的静态点、可移静态点、动态点集合中。利用静态特征点集,采用最小化重投影误差的方法进行位姿估计:

cf8189650b62e16a881ceda7de127afd.png

其中,fadf0b49d336da288cc697c87fd818ef.png表示相机位姿;1742fa6eccbc509600127cbf622cbcc9.png为Huber核函数,用来避免当2范数以指数增长时误差项太大导致优化方向错误的问题,保证优化过程的正确性[1];082abe21a7c05fa4795c0bb761831eb6.png为静态点集中匹配点对的总数;ae92048caf862350f3265d575783ab01.png为2D特征点坐标;bb66d28ffeabbcefecbd74670fdc8e1d.png表示与特征点匹配的3D空间点坐标;9490a81b13f6b56c859756e6536fae58.png为从相机坐标到像素坐标的投影函数,定义如下:

f8b8f0928b30d062e8db3a91b71af118.png

其中,0839ca17d88831b6d561e46bef0950bc.png表示焦距,ccc8ff3c9140b64debda4d69f24164a4.png指主点坐标。

4.2 加权静态约束

若直接根据静态特征点计算位姿,则会存在静态点数量较少或难以发觉某对象已由静态转为动态的问题,从而降低位姿估计的精度。为了有足够数量的特征点能参与后续局部BA优化和全局BA优化,需要进一步确认场景中可移静态点和动态点的真实运动状态,如其在当前场景中处于静止状态,则可看作是静态特征点,从而增加可参与位姿计算的特征点个数。

本文提出加权静态约束的方法获得特征点的真实运动状态,并对位姿进行更新。

当相机从不同视角观察同一空间点时,见图 4(a),e58a0a4d8fee4b5191443a584b109d40.png3a59d0db2b3849a4c714aa91d8150fe7.png分别为参考帧和当前帧的相机中心,e7522c061e8277e63335413f81ac0832.png为某一空间点,直线3684e6be8c9657cd7f4c1240420a85b0.pngb23d00003c3afba9e8f28649a7991a9e.png为极线,64c1f1b86c6b011f3cf5ed1fc15c2b40.pngcfa932f2cde013342c64fd3ad0fec780.png为空间点P在2个相平面上的投影点,其理论上应满足:

6cde6ba58604f3e53cf2522fb888edca.png

9904c6bacd93b70e6e57a172d933b921.png

图 4 极线约束示意图

其中150b2290eb1642966896c656812e0789.png分别为和的归一化像素坐标,79924c43de25c240a1298249b541e72b.png表示基础矩阵,其可根据4.1节中的初始位姿通过八点法计算得到。

理想情况下,53b65270d8d02b289a5029d4b7c3afc4.png位于极线d710bed553b27ccab6a1148215f65354.png上,满足式(8)约束。设极平面的法向量为92d7b25e2d3d255d841ba367fe5962df.png,则此时可满足:

764ff6650a7abe189b4177521100a632.png

实际情况下,若空间点发生移动,如图 4(b)中红色点所示,相机由参考帧移动至当前帧位置时,空间点bc203d5c2aeff1ecfb5eabab827ffdb0.png移动至566b97fef4affdb274fe171f0c4eeca2.png,此时f659f9e6a952850d2e335040e86f678a.png在当前帧上的投影位置将偏离对应的极线,导致不能满足上述约束。但当特征点沿着相机光轴方向运动时,如图 4(c)所示,空间点由3bb02e86e3b816528085790653cf0043.png移动至d9fb88037686a2a6c5ff4624e193a621.png位置,由于移动方向的特殊性,移动后的9ac6220ff2b9008991e5e569a496c0e0.png位置在当前帧上的投影点6288026dcf51fb5174b5f56f6e7fa17c.png仍落在极线上,满足极线约束。由此可见,仅通过极线约束判断特征点的运动情况具有一定的局限性,因此为准确判断特征点的真实运动状态,本文定义一种加权静态约束:

c3806b3b5ffe600676c26593c8bc1de5.png

其中,b2b266a383be7f7182b06c674f04e970.png表示加权静态约束得分,e27d3ccaac32460d6b88a8022ad19bcc.png表示矢量21bac85817792cd6d3a920a49c235806.png与极平面法向量n夹角的余弦值,夹角越接近90∘,说明投影点dd6952a16dd6690f2527ec25a84ce231.png相对于极线的偏离程度越低,则该点为动态特征点的可能性越小;0539604b731eae6fe3a1b8ea27c25f09.png表示相机在参考帧和当前帧所观测的地图点的深度差值;b6aafab30725e5ebcf95eead8993a6e9.png49565ac7a721e52616f21b738141b2ec.png表示对应的权重,当该余弦值的绝对值大于预先设定的阈值0326cc3a0eaee0319a8f564ffd9fb408.png时,令44dec5d0718574f7c402b2e1b5b74729.png=1,d56f7a3b01100e9f0e3232316f012b28.png=0,即表示不需要计算深度差便可认为该特征点为动态点,否则令a31015013eb2289034cb0529559a3b6d.png=0,442af5a0a7b17aa09d2824a7e07d8132.png=1。最后设置阈值cab0a0f3a5bb28d5b75397eee04d02aa.png,若c6454918aded384a78f7132c9a45b3f7.png5dd585caeabf412ca51f987feea5f850.png,则认为该特征点为动态点。

通过加权静态约束及先前运动等级来更新当前帧中特征点的最终运动等级,更新策略如表 2所示。其中f31c07b21e437c8f531e151a3a7eb33e.png表示某特征点经过运动等级传递后得到的运动等级(运动等级的定义详见表 1),6925a8d3714fe1d051b585e0c043e1d2.png表示施加加权静态约束后特征点的最终移动等级,f6b52159fb8555583f8054c9b3930c9e.png为式(10)的计算结果,c740c8e8be1fd4690dba82f27be38fa2.png为判定动态或静态点的阈值。当按运动等级更新策略更新后的1cc2219c1d8df193a8be3a4ea18a79a3.png值大于10时,令9ba1aae26d784229542ccb88a725b372.png=10。运动等级更新的原则是尽量保证动态点的检出率,因此当特征点被判定为动态时,运动等级的修改步长比静态情况下更大。

表 2 运动等级更新策略

0d2c9cce18503da5a2b83b5990421f78.jpeg

图 5(a)~(f)为TUM数据集03ed001e1b12551672924cfd1547244d.jpeg序列中的连续6帧图像,当前场景中右侧的人正在向其右前方移动,左侧的人正坐在转椅上旋转。每帧图像上绿色点表示可参与位姿初优化的特征点,即静态点和可移静态点集合,红色点表示外点,其不参与位姿的优化,构成动态点集合。对图 5(a)对应的帧进行了语义分割,再结合上一帧的移动等级传递,使得2个人身体上的特征点以及椅背部分被正确分类为动态点,图 5(b)~(e)都为运动等级传递以及加权静态约束得到的结果,没有进行语义分割处理,虽然2个人身上或人体边缘背景上仍有少数被错分的特征点,但数量较少,在位姿优化过程中可通过RANSAC(随机抽样一致性)算法剔除。图 5(f)中,虽然场景没有发生很大变化,但由于特征点的随机性,该帧图像上从人体上提取的特征点相较于图 5(e)变化较大,因此存在较多特征点无法找到匹配点,进而无法获得运动等级信息,满足跨帧检测的条件,因此在该帧图像进行了语义分割操作,使人体上的特征点又被归类为动态点。

a079f00b94e53a6f69d12389ab53c2e2.png

图 5 特征点运动状态分类结果

4.3 位姿二次优化

采用上述加权静态约束方法确定场景中特征点的真实运动状态并更新了运动等级后,需要对位姿进行二次优化以提高位姿估计的精度。优化仍选用最小化重投影误差的方法,初始值设为位姿初步估计值,参与优化的特征点为静态点集以及可移静态点集中的所有特征点,即通过特征点的状态更新利用特征点数目增加后的结果对位姿初值进一步优化,得到更精确的位姿结果。

05  实验与分析

本文算法采用的运行测试平台为笔记本电脑,运行环境为64位Ubuntu 18.04系统,AMD 4800H CPU,内存大小为16 GB,显卡为GTX 1650。

采用公开数据集TUM RGB-D与原系统ORB-SLAM2以及一些用于处理动态场景的优秀的SLAM系统进行比较,并尽可能采用原文所提供的实验结果。本文实验结果为5次运行结果的平均值。评价指标采用SLAM算法的常用指标:绝对轨迹误差(ATE)以及相对位姿误差(RPE)。

5.1 TUM数据集及实验结果对比

TUM数据集[27]由慕尼黑工业大学的计算机视觉实验室发布,其包含3个序列,其中fr1、fr2为静态场景数据集,而fr3为动态场景数据集。每个序列中包括RGB图像、深度图像以及该序列对应的相机运动轨迹真值。图像由Kinect深度相机采集,分辨率为640×480,并经过对齐等预处理。

fr3序列包含fr3/walking、fr3/sitting两个动态序列,其中fr3/walking序列的动态程度较高,场景中有2个人在桌前走动,而fr3/sitting序列的动态程度较低,2个人坐在桌前交谈,运动幅度较小。

5.1.1 ORB-SALM2

首先,为验证本文算法的有效性,利用高动态数据集对比原ORB-SLAM2算法和本文算法。

图 6为绝对轨迹误差对比图,(a)~(c)分别表示ORB-SLAM2(上)与本文算法(下)在fr3/walking_halfsphere、fr3/walking_xyz及fr3/walking_xyz_validation序列上的绝对轨迹误差对比图,图中黑色曲线表示相机轨迹真值,蓝色部分表示ORB-SLAM2算法或本文算法的轨迹估计值,红色线段表示估计值和真值之间的绝对误差,因此红色线段越短表示误差越小,系统精度越高。图 7为2种算法在上述3个序列上的3维轨迹误差热力图对比图,图中灰色虚线表示轨迹真值,带有颜色的实线表示系统估计轨迹,颜色越偏向深蓝,表示误差越小,颜色越偏向深红,表示误差越大。图 8为2种算法分别在上述3个序列上的位姿计算结果与真值轨迹之间的相对位姿误差(平移部分)对比图。第1列表示的是ORB-SLAM2算法分别在3个序列上的位姿计算结果与真值之间的相对位姿误差,第2列表示本文算法分别在3个序列上的位姿计算结果与真值之间的相对位姿误差。横轴表示整个数据序列的时间,单位为s;纵轴表示算法在某一时刻的位姿计算结果与位姿真值之间的相对位姿误差,单位为m。由图可知,本文算法相比ORB-SLAM2算法在动态场景下的位姿估计精度方面有较大的提升。

05815f6762422db477cacdb6f89855ba.jpeg

图 6 绝对轨迹误差对比图

dbb3525466a15d0cc837524829f5fb47.jpeg

图 7 3维轨迹误差热力图对比

f0fb81da9b99b783dcd97617ed9d67c0.jpeg

图 8 相对位姿误差示意图

在表 3~5中,第1列表示数据序列的名称,*表示该序列为低动态的,在该序列中,仅有小幅度的身体扭动和手势变化,这种低动态场景中仅包含极少数的外点,因此在ORB-SLAM2算法中仅根据RANSAC算法便可得到处理,并同时保留了更多的静态点参与优化,但在本文算法中,由于特征传递过程可能会导致少量潜在移动对象在静止状态下被错分为移动状态,使得参与位姿优化的特征点数目减少,导致精度稍低于ORB-SLAM2系统。但本文算法相比原始ORB-SLAM2系统在高动态场景中系统位姿估计精度有较大提升,在高动态场景中,位姿的绝对轨迹误差的均方根值可提升95.81%~99.31%,相对位姿误差的平移部分的均方根值提升89.46%~96.23%,旋转部分的均方根值提升85.24%~95.39%。

表 3 本算法与ORB-SLAM2算法的绝对轨迹误差对比(单位:m)

f26a1914ad3214a5d581be8fb9dba550.png

表 4 本文算法与ORB-SLAM2算法的相对轨迹误差(平移部分)对比(单位:m)

06bc8436a4cd3868027dca14f8464bac.png

表 5 本算法与ORB-SLAM2算法的相对位姿误差(旋转部分)对比(单位:°)

1393776c69b2c7db92c50a382b90edd9.png

5.1.2 其他SLAM算法

为进一步验证本文算法的先进性,将本算法与DynaSLAM、DS-SLAM、SaD-SLAM等目前较为优秀的处理动态场景的算法进行对比,对比结果如表 6所示,表中“–”表示该文献中没有此数据集对应的位姿精度分析结果。根据对比结果可以看出,本文算法在大部分数据集上表现良好。但由于ORB-SLAM2算法内包含静态场景的假设,只允许系统中有极少数的误匹配点对存在,因此其在静态数据集上表现较好。而DynaSLAM算法本身是将位于“人”这个类别上的关键点直接剔除,因此在部分数据集上表现较好,但此算法并没有考虑到人的真实运动状态,当人在图像中占大部分面积时,极可能会导致算法失效。

表 6 本文算法与其他处理动态场景的先进SLAM算法的绝对轨迹误差对比(单位:m)

48c5ea46916dff41682dde1dd1a51bdc.png

5.2 实时性评估

为验证本文算法的实时性,选用每帧的跟踪时间作为系统实时性评估的参数,跟踪时间是指在系统运行期间每帧图像在跟踪线程中的耗时。通过对多次实验的跟踪时间进行均值计算,得到本算法在处理TUM数据集时平均每帧耗时0.0529 s,即平均每秒可跟踪18.9帧,基本达到实时性。

本文系统各部分的耗时情况如表 7所示。其中语义分割部分耗时较为严重,但本文并非对每一帧图像都采用语义分割,而是由跨帧检测算法自适应地选择图像帧进行语义处理,因此较大程度上降低了其对系统实时性的影响。

表 7 本算法跟踪阶段每部分耗时情况(单位:ms)

4c0ad6160f895c90a50200325b17b141.jpeg

虽然系统可基本实现实时性,但本文采用的跨帧检测方法会导致进行语义分割的图像帧处理速度较慢,使整个序列处理的速度不均匀。本文通过选取轻量级语义分割网络来尽量降低对系统实时性的影响,因此系统在等待语义分割结果时不会出现等待时间较长或者长时间运行速度较慢的现象。

由于场景、相机运动方向和角度、运动对象的不同,特征点提取的随机性等原因,经在TUM数据集上实验,发现每次间隔的帧数并不固定,跨帧情况见表 8,表中数字表示进行语义分割操作的平均间隔帧数。第1列表示数据序列,第2~4列为本文算法在对应序列上的3次运行结果,第5列为3次运行结果的均值。由表中数据可知,低动态场景的语义分割间隔要大于高动态场景,这是因为低动态场景中运动对象的移动幅度较小,通过移动等级传递即可确定绝大部分特征点的状态。在同一动态程度的不同序列中,当相机运动幅度较大时,便需要更多的语义分割信息以确定特征点的状态。

表 8 跨帧检测平均间隔帧数

aa3c050c7f95a7e8f0d5c9edd84e024b.jpeg

06  结论

为提升传统视觉SLAM系统的鲁棒性,本文基于ORB-SLAM2算法提出一种融合语义信息的RGB-D SLAM算法,可在动态场景下保持较好的定位精度和实时性。

本算法借助语义先验信息与等级传递过程确定特征点的移动等级,利用静态点完成位姿初估计,然后通过加权静态约束确定特征点的真实运动状态,最后进行二次优化,保证SLAM系统的定位精度。最后在TUM公开数据集上对本文算法以及ORB-SLAM2、DynaSLAM、DS-SLAM等算法进行比较,结果表明在动态场景下,本文算法的位姿估计精度相对于ORB-SLAM2算法有较大的提升,并且相对于其他处理动态场景的先进SLAM算法,也有较高的定位精度和实时性,算法的鲁棒性也得到提升,但仍存在一定问题,例如帧处理速度不一致。

在下一阶段的工作中,将进一步发挥语义信息在SLAM系统中的作用,尝试构建语义八叉树地图来服务于上层应用,如机器人的路径规划、避障等,同时加入IMU(惯性测量单元)等其他传感器,进一步提升SLAM系统的精度和鲁棒性。

本文仅做学术分享,如有侵权,请联系删文。

点击进入—>3D视觉工坊学习交流群

干货下载与学习

后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

后台回复:3D视觉课程,即可学习3D视觉领域精品课程

3D视觉工坊精品课程官网:3dcver.com

1.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
2.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
3.国内首个面向工业级实战的点云处理课程
4.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
5.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
6.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
7.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

8.从零搭建一套结构光3D重建系统[理论+源码+实践]

9.单目深度估计方法:算法梳理与代码实现

10.自动驾驶中的深度学习模型部署实战

11.相机模型与标定(单目+双目+鱼眼)

12.重磅!四旋翼飞行器:算法与实战

13.ROS2从入门到精通:理论与实战

14.国内首个3D缺陷检测教程:理论、源码与实战

15.基于Open3D的点云处理入门与实战教程

16.透彻理解视觉ORB-SLAM3:理论基础+代码解析+算法改进

重磅!粉丝学习交流群已成立

交流群主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、ORB-SLAM系列源码交流、深度估计、TOF、求职交流等方向。

扫描以下二维码,添加小助理微信(dddvisiona),一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

d1ca472f6f21e42206ffecab5a732d3a.jpeg

▲长按加微信群或投稿,微信号:dddvisiona

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看,3天内无条件退款

98964158514543053d100ee2144c2768.jpeg

高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

<think>好的,我现在要帮用户了解如何实现ORB-SLAM3的语义分割功能。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的信息。根据引用[2],ORB-SLAM3结合了语义分割算法,将场景分割为不同的语义类别,并融合语义信息与几何信息。引用[3]提到基于ORB-SLAM2的语义地图构建,使用了COCO-Stuff数据集和DeepLabv2模型。用户现在想实现ORB-SLAM3的语义功能,可能需要参考这些方法。 首先,ORB-SLAM3本身可能没有内置的语义分割模块,所以需要集成外部模型。用户需要选择一个合适的语义分割模型,比如DeepLab、PSPNet或Mask R-CNN。然后,考虑如何将这些模型的输出与ORB-SLAM3的地图点或关键帧结合。可能需要修改ORB-SLAM3的数据结构,添加语义标签的存储。此外,实时性是一个挑战,因为语义分割通常计算量大,可能需要优化模型或用轻量级网络。 接下来,要处理数据关联,将分割结果与SLAM的特征点对应起来。可能需要使用几何信息或投影方法。然后,在回环检测或地图优化时利用语义信息,比如通过语义一致性来优化位姿或地图。最后,生成语义地图可能需要将语义标签映射到3D点云或网格上,并可视化。 用户可能需要查阅ORB-SLAM3的代码结构,找到关键帧插入的地方,插入语义处理模块。同时,确保实时性可能需要多线程处理,比如在单独线程运行分割模型。此外,数据集的选择和模型的训练也是关键,如果使用预训练模型,可能需要调整输入尺寸或输出格式。 需要提醒用户注意版本兼容性,比如ORB-SLAM3的代码是否支持所需的深度学习框架,如PyTorch或TensorFlow。可能涉及ROS集成,如果用户是在机器人平台上应用。最后,推荐参考已有的实现,如引用[3]中的方法,或者查找最新的相关论文和开源项目,看看有没有现成的解决方案可以借鉴。</think>### ORB-SLAM3语义分割功能实现方法 #### 一、技术路线分析 ORB-SLAM3的语义功能实现主要包含以下技术环节: 1. **语义分割模块集成** 需选择高效的语义分割网络(如DeepLab系列、PSPNet等),推荐使用轻量化改进的$MobileNetV3+DeepLabV3+$结构[^1]。输入图像尺寸建议调整为$480\times 640$以匹配ORB特征提取尺度。 2. **数据关联策略** 通过投影将2D语义标签与3D地图点关联,定义投影误差函数: $$ E_{sem}=\sum_{i=1}^{n}\| \pi(T_{cw}X_i) - u_i \|_{\Sigma}^{2} $$ 其中$\pi$为相机投影模型,$T_{cw}$为位姿矩阵,$X_i$为地图点坐标,$u_i$为像素坐标[^2]。 #### 二、代码实现步骤 1. **框架改造** 在`KeyFrame`类中添加语义属性容器: ```cpp class KeyFrame { public: std::vector<cv::Mat> semantic_masks; // 语义掩码 std::vector<int> object_classes; // 物体类别标签 }; ``` 2. **实时语义处理线程** 创建独立处理线程运行分割模型: ```python # 示例PyTorch推理代码 def semantic_thread(): model = torch.hub.load('pytorch/vision', 'deeplabv3_resnet50', pretrained=True) while True: img = get_camera_frame() with torch.no_grad(): output = model(img.unsqueeze(0))['out'] send_semantic_result(output) ``` #### 三、优化策略 1. **特征-语义关联优化** 使用ORB特征点坐标反投影语义标签,建立联合优化因子图: ```mermaid graph LR A[相机位姿] --> B[ORB特征点] A --> C[语义标签] B --> D[重投影误差] C --> E[语义一致性约束] ``` 2. **动态物体过滤** 基于语义标签构建动态概率模型: $$ P(dyn|cls)=\frac{1}{1+e^{-(w_0+w_1\cdot cls)}} $$ 其中$cls$为物体类别编码,$w_0,w_1$为可学习参数[^3]。 #### 四、实现建议 1. **硬件配置要求** - NVIDIA GPU(建议RTX 3060以上) - 至少16GB内存 - ROS Melodic/MoveIt环境 2. **调试技巧** - 先离线测试语义分割模块的mIoU指标 - 使用TUM数据集进行带语义标签的仿真测试 - 逐步增加语义约束权重(建议从0.3开始)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值