Real-time voxel based 3D semantic mapping with a hand held RGB-D camera

Real-time voxel based 3D semantic mapping with a hand held RGB-D camera 论文整理

作者:Xuan Zhang       整理:大头

摘要

       环境感知是机器人智能的重要组成部分。为了更好地理解周围的环境,机器人不仅应该了解现实世界中物体的几何形状,还应该了解它们的语义。在这项工作中,我们演示了如何手持RGB-D相机实时构建基于体素的3D语义地图。我们结合了一个最先进的工作-ORB-SLAM,一个用于语义分割的卷积神经网络- PSPNet和一个高效的基于体素的3D地图表示-Octomap来构建一个工作系统。我们提出了不同的方法来融合语义信息来构建地图,并在ROS中实现了开源系统,这是一个广泛使用的机器人平台。我们对整个系统进行了定性评估,证明了它在室内机器人应用构建可用的3D语义地图的能力。

1.引言

        随着机器人技术的发展,机器人正变得越来越智能。环境感知是机器人智能过程中的一个关键因素。为了能够在未知的环境中导航,机器人应该能够主动避障,并在未知的环境中自定位。此外,为了完成更复杂的任务,机器人必须了解自己周围的物体是什么。例如,如果一个机器人试图进入一个关了门的房间,它应该知道哪里是障碍物和自身位置来寻找门口,更重要的是,它应该知道哪里是门,因此需要能够识别它。

        同步定位与建图(SLAM)解决了自定位和建图的问题。计算机视觉和机器人技术的发展使得使用一个嵌入式相机在未知环境中实时定位机器人成为可能。

        语义分割解决了场景理解的问题。给定一个图像,它为每个像素确定它属于哪一类对象,进行场景分割,然后将场景中有意义的部分再进一步的推理。

        三维重建包括从一组点或面元构建一个3D地图。它保留一致的地图以便拥有关于环境的全局信息并重新使用地图。三维重建地图可以投影到地面,以助于路径规划。它也可以直接用于那些需要在3D空间中进行复杂操作的机器人,比如取一个杯子或打开一扇门。

        在本项工作中,我们结合以上三个方面来构建一个用单个RGB-D相机实时构建3D语义地图的工作系统。我们的工作系统是通过ROS系统构建,一个广泛使用于机器人的系统。一个三维重建的示例如图下图所示。

             

          RGB三维地图                                   3D语义地图

主要贡献是:

(1)结合最先进的工作建立一个工作系统来定位相机和实时构建3D语义地图。为了有利于未来的开发,我们将该代码进行了开源。

(2)对不同的语义融合方法进行了测试,并提出了一种改进版的贝叶斯融合方法,使其能够在接受大量语义类的同时能够保持内存高效且可更新。

(3)在一个真实的环境中进行定性的评估。

2、相关工作

        在本章中,我们回顾了与这项工作相关的一些领域和工作。 我们将按以下顺序回顾:视觉 SLAM、3D 地图、语义分割和类似的工作。

2.1 视觉SLAM

        在一个未知环境下,视觉SLAM的目的是进行相机定位和构建地图。视觉SLAM的基本思想是从不同的角度观察同一场景,并尝试将不同的图像相互匹配,计算图像之间的变换。同时,选择并存储帧来进行重定位和建图。视觉SLAM主要有两种方法:直接法和特征点法。

        直接法,像LSD-SLAM这样的直接通过最小化光度误差来计算帧之间的转换。另一方面,特征点法,如ORB-SLAM,通过提取图像中的特征点,并通过最小化重投影误差来求出图像之间的变换。

备注:

直接法是基于灰度不变假设来实现的,通过迭代相机的位姿变换 T,来寻找最优的 T,使得光度误差最小化。

特征点法是对图像提取特征点,根据特征点匹配关系进行位姿和深度估计,通过最小化重投影误差来优化相机运动。

        视觉SLAM可以通过单目相机或带有深度信息的相机来执行,如双目相机或RGB-D相机。虽然单目相机通常成本更低,但我们无法用经典的方法得到地图的真实尺度,而且通常需要额外的操作来进行初始化深度相机可以拥有地图的真实尺度,但深度相机的可靠范围是通常有限的。人们正在努力解决单目SLAM的规模问题。Tateno等人提出了CNN-SLAM,该方法使用卷积神经网络(CNN)来预测每个像素的深度,并以一种设计良好的方式与它们的SLAM系统融合。

        ORB-SLAM是一种基于特征点的视觉SLAM,它使用ORB特征来实现跟踪、建图和重定位。得到的地图是由关键帧保留特征点形成的稀疏点云。稀疏地图限制了用单目相机进行稠密重建的可能性,因为虽然我们有相机位姿,但只有一些稀疏点的深度信息。同时,我们可以使用深度相机进行稠密重建,因为每个像素都给出了深度信息。

2.2 地图表示

地图表示是在三维空间中表示对象的方法。最直接的方法是存储点云。这种方法的问题是内存使用是无限的,随着点云的实时出现,它增长非常快。另一种方法是体素表示。体素是三维空间中的一个立方体。我们将一个有界空间细分为具有固定分辨率的小立方体,即体素的边长。这种表示在内存中是有效的,因为内存使用受体素总数的限制,并且它允许以概率的方式更新每个体素。第三种表示方法是ElasticFusion中使用的面元重建。它将一个物体的表面建模为许多小面元。每个表面都可以包含一个位置、法线、颜色、重量、半径等。这种方法提供了一个非常全面的地图,因为物体的表面保存得很好,但对于机器人导航的使用不是很直接。

surfel模型

论文链接https://www.researchgate.net/publication/314578209_ElasticFusion_Dense_SLAM_Without_A_Pose_Graph

        Octomap是一种基于体素的概率更新的3D地图表示。它将一个有界的三维空间表示为八叉树,这使得地图的存储非常高效,它可以以概率方式更新的每个体素的占用率。

备注:

(对于划分好的Octomap,每个小方块都有一个描述它是否被占据的数,通常用0-1之间的浮点数表示它被占据的概率,0.5表示未确定,越大表示被占据的可能性越高。)

2.3语义分割

        给定一个二维图像和一些语义类(表、椅子、墙等),语义分割的目的是确定每一个像素属于哪个类。有监督深度卷积神经网络的进步大大提高了该任务的准确性。Long等人提出了一个全卷积神经网络,它允许生成一个像素级的预测图,从而以端到端的方式执行训练。

        在所有有监督的机器学习任务中,数据集在训练过程中起着非常重要的作用。我们回顾了两个适合我们语义分割任务的数据集:SUNRGBDADE20K。  

         SUNRGBD数据集包含37个室内物体,如桌子、椅子、沙发、墙等,还有一个额外的背景类。它有5285张图像用于训练,5050张图像用于测试。各种形状的对象和其他一些事实使这个数据集非常具有挑战性。其室内对象词汇使其适用于室内场景的语义分割。ADE20K数据集是另一个非常具有挑战性的数据集,它包含了来自室内和室外的150个对象。它的大量词汇量使它适合于探索一个未知的环境。

        由Zhao等人提供的PSPNet在MIT场景解析基准上获得了最先进的结果,其中包含了来自ADE20K数据集的图像。PSPNet使用金字塔池模块对特征映射进行向下采样到不同的分辨率,然后将它们聚合,以获得更好的全局上下文理解

        当我们从不同的角度观察一个场景时,可以获得更多关于场景中物体的信息。提出了多种结合不同视角的语义信息来进行多视图一致语义分割的方法。Ma等人提出,在训练CNN或融合预测时,将附近的帧包装到当前的关键帧作为数据增强,以获得更好的多视图一致性。McCormac等人在语义融合中提出,在基于查询的方法中使用贝叶斯更新,逐步融合来自不同角度的语义信息。Li等人还提出在其SLAM后端选择的关键帧上使用贝叶斯融合来融合语义信息。Guerry等人在SnapNet-R中提出,从重建的3D地图中生成虚拟快照,然后将这些快照与二维语义分割结果融合在一起。

2.4类似的工作

        语义融合是最相似的工作之一。它使用基于面元的弹性融合(elasticFusion)作为SLAM后端,并融合每个面元上的语义信息来产生一个基于面元的三维语义地图。与我们的工作的主要区别是,我们使用基于体素的地图表示,而不是基于面元的地图,并且使用不同的SLAM算法。

        Salas-Moreno等人提出了SLAM++,一个对象级的SLAM系统。它使用已知对象的模型数据库来执行对象识别,并将地图表示为对象的图形。它适用于具有预定义对象的重复场景。SLAM++使用了关于场景的先验知识,因此,其地图包含了关于对象的非常详细的信息。这使得它非常适合于他们的增强现实这样的应用。但是,我们不能使用它来探索新环境,因为我们没有环境中对象的模型。

链接:SLAM++: Simultaneous Localisation and Mapping at the Level of Objects | IEEE Conference Publication | IEEE Xplore

        CNN-SLAM将语义分割与SLAM并行添加作为其系统的一个展示案例。CNN-SLAM使用单目相机进行SLAM。为了克服尺度问题,它使用CNN来预测深度信息,并融合这些信息在SLAM中。他们使用另一个CNN并行简单的语义分割。我们的工作与CNN-SLAM的不同之处在于,使用了基于特征法的SLAM,而不是使用直接法,并且使用了更好的语义分割方法来分割更多的语义类。

论文链接:CNN-SLAM: Real-Time Dense Monocular SLAM with Learned Depth Prediction | IEEE Conference Publication | IEEE Xplore

3、系统描述

 3.1概述

        我们的系统输入RGB图和深度图,并输出一个3D语义地图。该系统以消息传递的方式工作。它以RGB-D相机输出的RGB图像和深度图作为输入。然后将RGB图和深度图输入两个不同的过程。一个是ORB-SLAM过程,它根据在每帧中提取的特征点来定位相机。另一个过程是语义点云的生成过程,它对每个输入的RGB图进行语义分割,同时根据输入的深度图和相机内参生成点云。然后,我们将语义颜色和原始颜色都注册到生成的点云中。最后生成 3D 地图,并通过基于生成的点云的octomap生成过程时融合语义信息。然后,生成的3D语义地图被序列化并发送到一个程序(rviz),以实时可视化地图。

3.2 ROS

        我们的系统是内置在ROS(机器人操作系统)中的。ROS 是一个消息传递系统,其中许多程序可以通过传递它们的输出信息来协同工作。ROS在机器人技术领域被广泛应用,因为它允许机器人上的不同组件轻松地通过系统进行通信。我们使用ROS的一个原因是,消息传递促进了系统的未来扩展。例如,可以采用输出语义图像或产生的3D地图为其他目的,不需要复杂的修改系统。另一个用处是,我们可能会把不同的程序放在不同的机器上。例如,我们可以把相机放在几个机器人上,并以集中或分布式的方式生成一个公共地图。更重要的是,我们的工作所依赖的许多开源软件都在ROS中实现,如ORB-SLAM、octomap等。最后,ROS中强大的可视化工具(rviz)使可视化几乎开箱即用。

3.3 SLAM和3D重建

3.3.1 ORB-SLAM

        我们使用ORB-SLAM作为SLAM的后端。它以RGB图和深度图作为输入在每一帧上,提取一组特征点,在大小为640×480的图像上,每幅图像提取1000个点。关键帧的选择是基于与其他关键帧的共视程度。存储关键帧及其特征点以执行重定位和新的关键帧选择。ORB-SLAM使用稀疏特征,因此,所构建的地图也是稀疏的。计算出的相机变换(位置、角度)在系统中广播,并由octomap生成过程接收。

 3.3.2 三维重构

点云

        在插入三维地图之前,结构信息以点云的形式存储,进行消息传递。点云是一组无序的点,每个点都包含在某一参照系中该点的坐标。深度图首先被配准到RGB图的参考帧上,这可以通过硬件或软件来实现。然后,根据每个像素在图像上的位置、深度和相机内参,计算每个像素的真实世界坐标,从而生成点云。在针孔相机模型中,给定一个具有像素坐标(x,y)和深度d的像素,其在相机光学中心帧中的真实世界坐标(X、Y、Z)可以计算

        其中,fx、fy是相机的对焦长度,(cx、cy)是图像上像素坐标中的相机中心。下图显示了点云生成的一个示例。

        除了位置和RGB信息外,语义信息也存储在点云中。不同的语义融合方法使用了不同的点类型。最大融合方式只存储一个的语义信息,而贝叶斯融合存储3个语义信息,简化的点数据结构的说明如下图所示

Octomap

        我们使用Octomap作为三维地图表示,Octomap一个有界空间表示为占用网格(体素)的八叉树。八叉树中的每个节点代表一个特定大小的体素,这取决于它在树中的级别。八叉树的每个父节点被细分为8个子节点,直到达到最小的分辨率。通过这种方式,可以将一个大规模的3D地图有效地存储在内存中。

         原始Octomap实现了一个16层的八叉树。例如,在分辨率为1厘米的情况下,该地图在每个维度中最多可以覆盖2^16×0.01m=655.36m。Octomap用命中率和缺失率对传感器进行建模,以概率方式更新不同测量值的体素的占用率。在我们的例子中,发现它适合在室内场景使用2厘米的分辨率,因为它提供了良好的细节,同时保持了插入管道的实时性。此外,Octomap还能够区分自由空间和被占据空间。

        左输入点云;中心占据了体素;右占用的体素(黑色)和自由体素(白色)

点云插入管道

当在三维地图中插入一个点云时,首先通过体素过滤器对点云进行向下采样,然后将过滤后的点云插入Octomap,再进行光线投射,以清除一定范围内的自由空间。然后更新Octomap的内点,即具有较低分辨率的体素。最后,将更新后的Octomap进行序列化来进行可视化。

 

点云插入八点图的管道 

体素过滤器

        体素滤波器用于下采样点云。其原理是在一个给定的体素空间(分辨率)中只保留一个点。由于我们只需要一个点来更新Octomap节点,体素过滤器的分辨率被设置为与Octomap的分辨率相同(在本项目中为2cm)。这个过滤器可以大大提高性能,因为它减少了很多点云,特别是那些距离传感器很远的点进行光线投射时是非常耗时的。给一个粗略的想法是,如果使用640×480的图像大小,就需要插入307200(640×480)个点。经过体素过滤器后,大约得到了大约15000到60000个点,具体取决于点的距离。

更新叶节点

        当将点云插入到Octomap中时,只有最高分辨率的体素(叶节点)会被更新。它们的占用率、RGB颜色、语义颜色和置信度都被会更新。网格的占用率按照参考文献[4]所述进行了更新。RGB颜色与前一种颜色一起取平均值。根据所选择的语义融合方法,更新语义颜色和置信度。考虑到深度相机的有限范围和效率,只插入距离原点(相机的光学中心)有限的点,在本项目最大范围设置为5米。

 

参考链接:octomap的入门与学习_qq_42424625的博客-CSDN博客_octomap是什么

光线投射

        为了清除自由空间,当我们在Octomap中插入一个点时,可以执行光线投射来清除沿着原点和这个终点之间的线上的所有体素。当该点离原点很很远时,这可能是一个非常昂贵的操作,因为执行了很多次八叉树搜索。为了清除必要的自由空间保持合理的运行时效率,只在有限的范围内进行光线投射,小于点云插入的范围。同时,在光线投射范围之外但在点云插入范围内的点也应该被认为是有效的,并且应该能够清除自由空间。为了解决这个问题,对于这类点,我们首先创建一个虚构的点,它与原点位于同一方向,但与原点的距离为光线投射范围内。当点更接近原点时,它们就变得更接近。因此,应用另一个体素过滤器来进一步向下采样虚拟点,这些虚拟点位于从原点开始的球体上,半径为射线投射范围。然后,我们为对虚构的点进行光线投射。光线照射的说明如下图所示。

        为给出光线投射的运行时间,使用我们的方法和640×480的图像大小,当光线投射范围设置为3.5米时,Octomap生成的运行速度约为0.3 Hz,而当光线投射范围设置为2米时,Octomap生成运行速度约为1 Hz。 在我们的例子中,发现将光线投射范围设置为2米是合适的。

         红点是原点,蓝色点是要插入Octomap的点。绿色的填充线是光线投射路径,即已创建的自由空间.

备注:

 参考链接:【可视化】光线投射算法原理、改进与实现_稷殿下的博客-CSDN博客_光线投射算法

更新内点

        更新Octomap的内点,以获得较低分辨率的颜色和语义信息。父节点的占用率被设置为其8个子节点的最大值。父节点的颜色被设置为其子节点的平均值。父节点的语义信息是其子节点语义的融合。Octomap中,可以修剪相同的子节点,以减少地图数据的大小。在Octomap的起源实现中,如果所有这些子节点都具有相同的占用率,则会对子节点进行修剪。由于语义信息必须保留在叶节点上,只有在节点的所有子节点具有相同的占用率、相同的语义颜色和相同的语义置信度时,才对其子节点进行修剪。因此,在我们的例子中,一个子节点不太可能被修剪。

3.4语义分割

        我们使用PSPNet(与resnet50)作为我们的CNN模型。网络结构如下图所示。它以一个RGB图作为输入,并生成一个类分数的地图。PSPNet的工作原理如下:

1. 使用resnet来生成特征图。

2. 在生成的特征图上执行金字塔池,以具有不同分辨率的特征图。

3. 对每个合并的特征图进行卷积。

4. 上采样特征图,并将它们连接起来,以生成最终的特征图。

5. 执行最终的卷积以生成类分数映射。

         在我们的系统中,首先将图像大小调整为CNN的输入大小。 我们将softmax 激活应用于输出类分数图以产生概率分布(新分数总和为1)。然后,根据语义融合方法,我们为每个像素取概率最高的语义标签(最大融合,第3.5.1节)或采用概率最高的前3个语义标签(贝叶斯融合,第3.5.2节)。我们将这些概率称为相关语义类标签的语义置信度。最后,根据颜色表将语义标签解码为RGB 颜色。 我们有两个版本的训练PSPNet模型,一个在ADE20K数据集上训练,另一个在SUNRGBD数据集上训练。

在ADE20K数据集上训练的模型

        该模型由PSPNet的原始论文的作者进行训练。在原论文中所述,它在ADE20K数据集上的平均IoU为41.68%。由于使用了不同的实现,我们的系统中的准确性可能不会那么高。(原始工作用Caffe实现,而我们的工作用PyTorch实现。),该网络输入图像大小为473×473。ADE20K数据集包含了来自室内和室外的150个类的大型词汇表。所以它适用于分割一个带有各种物体的未知空间。ADE20K数据集的语义标签如图3.11所示。

 使用在ADE20K数据集上训练的PSPNet的语义分割示例

ADE20K数据集的语义标签

在 SUNRGBD 数据集上微调模型

        我们还在SUNRGBD数据集上微调了在ADE20K数据集上训练的PSPNet,期望在室内场景中具有更好的性能。SUNRGBD数据集包含38个室内场景语义类。为了获得更快的推理时间以测试更好的实时性能,我们以391 × 391的输入大小训练网络。我们使用5285幅图像进行训练,使用5050幅图像进行验证,并保持最佳模型进行验证。尝试了一些迁移学习方法(详见第4.3节),但是当直接端到端训练(没有原论文中使用的辅助损失)时,获得了最好的结果。最好的模型使用随机梯度下降 (SGD) 作为优化器进行训练,学习率为 0.001,权重衰减为0.001,动量为0.9。

3.5语义融合

        两种融合不同测量的语义信息:最大融合和贝叶斯融合

3.5.1 最大融合

        在执行最大融合时,我们只包括CNN生成的置信度最高的语义颜色及其对生成的点云的置信度。相同的信息存储在octomap的每个体素中。在将点云插入octomap时,如果一个体素有新的测量值,将两个语义信息融合如下:如果两个语义颜色相同,则保持语义颜色,置信度为两者置信度的平均值。在另一种情况下,如果两种语义颜色不同,则保留具有较高置信度的语义,我们将置信度降低 0.9作为对不一致的惩罚。这样做还可以确保我们始终可以更新语义信息,即使我们已经以非常高的置信度进行了测量。最大融合的优点是只存储一个语义信息,因此内存效率更高。伪代码如下所示。

 3.5.2贝叶斯融合

        贝叶斯融合广泛用于多视图语义融合。原理是将融合过程假设为马尔可夫过程。(备注:马尔科夫性:"将来"与"过去"独立的特性)

        简单地说,贝叶斯融合是通过在像素处获取单个帧语义标记可能性的乘积并对乘积进行归一化以产生有效的概率分布来实现的。

        在我们的案例中,经典贝叶斯融合的主要缺点是它在记忆效率方面不能很好地与语义类的数量相适应。例如,如果我们对在ADE20K数据集上训练的模型执行经典贝叶斯融合,我们应该在每个体素中存储150种语义颜色及其相关的置信度,这将成倍增加数据结构的大小来存储每个地图节点。

        内存问题的一种解决方案是仅存储具有高概率的类,并为其他类分配相同的小常数值。这可以解决内存问题,但是当我们有大量类时可能很难更新,因为许多小常量加起来会产生很大影响。更重要的是,我们应该提前知道语义类的数量。

        我们在这项工作中提出的方法是只存储3具有最高置信度的语义颜色,我们将其命名为语义集,将其他类分成同一个类,即c_others,其置信度为conf_others,它等于1减去3个最高语义置信度的融合两个语义集过程如下:如果两个语义集具有相同的元素,即前3种语义颜色是相同的。然后我们对这 3 个类和c_others执行经典的贝叶斯融合。在另一种情况下,如果两个集合的语义颜色不相同,我们首先为每个集合添加新的语义颜色,使它们具有相同的语义颜色。为此,我们通过拆分类c_others的置信度来添加新的必要语义颜色。每个新的语义颜色将被分配给0.8 × conf_others的置信度,而conf_others将相应地下降到0.2 × conf_others。这样做的见解是,如果一种语义颜色不在一组但在另一组中,它可能在其余概率中占很大一部分。 最后,我们只保留融合语义集中前3个置信度最高的颜色。

        算法2中显示的伪代码。

3.6评价

3.6.1语义重建

        我们对自定义室内场景的语义重建方法进行定性评估(图 3.13a)。为了便于评估,我们首先记录图像流并同时执行SLAM以获得相机轨迹,然后使用图像流和计算的相机轨迹进行语义重建。我们使用不同的语义融合方法和不同的训练模型进行语义重建。

三维重构

         在2厘米的分辨率下,我们获得了一个非常精细的三维重建。清除的空闲空间如图3.13b所示。

         ADE20K 数据集的优势在于它的词汇量很大(150 个类)。因此,我们的系统可以区分椅子(绿色)和转椅(橙色)。在另一方面,我们对类似的物体有些混淆,例如椅子和扶手椅或沙发和垫子。

        我们注意到最大融合和贝叶斯融合给出了非常相似的结果。定性评估可能无法显示差异。我们注意到我们的系统可以很好地分割场景。它很好地分割了椅子、地面、墙壁和沙发。最大融合和贝叶斯融合的左上角是不同的。在max fusion中,左上角被正确分割为绘画,而在贝叶斯融合中,它被分割为镜像。实际上这部分在相机远的时候首先被分割为镜像,然后当相机靠近时被分割为绘画。 最大融合只需要一个收入帧就可以改变语义,因此左上角的语义立即得到纠正。贝叶斯融合需要更多的收入框架来改变语义。更重要的是,与最大融合相比,贝叶斯融合的运行时间更短,从而导致收入帧更少。结果,贝叶斯融合中的左上角仅部分更新。 在这种情况下,最大融合显示出优于贝叶斯融合的优势。但在其他情况下,贝叶斯融合可以产生更一致的结果,因为它使用更多的语义信息。

CNN在SUNRGBD数据集上微调

         SUNRGBD数据集的词汇量要少得多(38 类)。这样我们就有了更清晰的分割结果。我们注意到桌子(或书桌)、墙壁、椅子和地面被很好地分割。同时,地毯覆盖的部分地面和其他一些东西被归类为背景。

更改分辨率

         我们可以通过使用octomap的内点来改变octomap的分辨率。请注意,内节点在重建过程中会更新。当分辨率较低时,我们可以获得更多关于3D场景的全局语义信息,并且噪声更少,如图 3.16b 中 8 cm 的分辨率所示。

3.6.2运行时间

        所有评估均使用 6 个 Xeon 1.7 GHz 内核和一个 GeForce GTX Titan Z 完成。输入图像尺寸为 640×480。

        当我们的系统一起工作时,ORB-SLAM的工作频率约为15 Hz(设置为 30Hz)。仅点云生成就可以以30 Hz 的频率运行。语义分割的运行时间如表 3.1 所示。请注意,在 ADE20K数据集上训练的CNN比在SUNRGBD数据集上微调的CNN慢,因为我们对在 SUNRGBD 数据集上训练的CNN使用较小的 CNN输入大小,因此推理时间更短。另请注意,最大融合比贝叶斯融合更快。 这是因为为每个像素选择前3个最可能的标签比只取最大值更昂贵。如果我们使用更有效的实现,可能会有所改进。

         Octomap 插入的工作频率约为1 Hz。 两个主要耗时的步骤是光线投射和生成地图的消息传递(用于可视化)。当我们不执行体素过滤器时,在2 cm的分辨率下,一个带有完整光线投射的点云插入可能需要20秒。当我们将光线投射范围限制为3.5 m时,一个点云插入以大约0.3 Hz的速度运行。当我们将光线投射范围限制为2 m时,一个点云插入以大约1 Hz的速度运行。生成地图的消息传递大约需要0.6秒,并且可能会有所不同。

        总之,我们的 SLAM 后端有足够高的帧率来实时跟踪和重新定位。我们的3D重建系统以1Hz运行,速度不如SLAM系统,但足以满足大多数在线室内应用。

4. 讨论

        在本章中,我们讨论了最初目标的变化以及我们在项目过程中遇到的困难。 本章的其余部分将按以下顺序讨论:最初的深度预测、点云生成的矢量化和神经网络的实验训练方法。本章末尾增加了项目进度表。

4.1最初的深度预测

        在项目开始时,预期目标是创建仅使用单目相机的3D语义地图。正如我们在第2章中所讨论的,我们无法用单目相机获得地图的真实尺度。更重要的是,我们基于特征法的SLAM只为收入框架提供了一组稀疏的深度,这使得密集重建不可行。解决这个问题的一种自然方法是使用CNN-SLAM中所做的深度预测。 我们可以将深度预测用于3D重建,同时纠正单目SLAM的尺度问题。

         至于深度预测,Laina等人提出使用全卷积残差网络进行深度预测。我们测试了这种方法来执行3D重建,结果是合理的,但不够精确。 特别是,如图 4.1a 所示,由于深度CNN的输出分辨率小,从预测深度生成的点云边界非常模糊。椅子的形状是全局一致的,但明显变形。具有预测深度的重建场景如图 4.1b 所示。由于上述边界问题,重建的场景被连续的点云模糊。我们可以从重建的地图中获得粗略的对象信息,但精度太低而无法制作可用的地图。应该使用更复杂的方法来使其工作。在CNN-SLAM中,作者使用SLAM将附近的预测扭曲到关键帧以改进预测。在他们的方法中,使用直接方法SLAM可以细化预测的模糊边界。需要更多的研究才能将其与基于特征法的SLAM一起使用。

        在使用基于特征法的SLAM时获得密集深度信息的另一种可能方法是从稀疏集进行深度补全。马等人提出用RGB图和一组稀疏的深度样本作为输入来训练CNN,以输出密集的深度预测。他们使用稀疏SLAM作为可能应用的示例。 使用这种方法的一个问题是单目SLAM不能具有真实的规模。由于CNN是用真实的深度测量训练的,这可能不是一个非常合适的解决方案。但是使用来自稀疏特征点的深度信息的想法仍然是一个很有前途的方向。

4.2点云生成的矢量化

        在实施点云生成过程中遇到的一个主要困难是运行时间效率。由于图像流的频率为30 Hz,因此点云生成应该至少以相同的速率而不是瓶颈。点云生成基本上是在3D空间中的向量和3×3内参矩阵之间执行矩阵生成,如公式 3.1 所示。当点的数量增加时,这可能是大量的计算。通常对于大小为640×480的输入图像,有307200个点来执行相同的操作。虽然如果我们使用 C 或 C++ 等低级语言实现这可能不是问题,但我们的点云生成是在python中实现的(因为我们使用 CNN的python实现)。循环整个点云每帧需要0.7秒,输入大小为640×480。向量化矩阵乘积被证明可以大大加快计算速度。我们首先将所有点的坐标并排连接为一个矩阵,然后与固有矩阵进行矩阵乘积。通过这样做,我们实现了 30 Hz 来执行深度配准。

        在实现过程中会遇到其他效率问题,例如ROS消息的序列化。读者可以参考这些小而重要的实现细节的源代码。

4.3神经网络的训练

        我们使用两种PSPNet模型来执行语义分割。一个是在ADE20K数据集上的原始论文中训练的。我们在SUNRGBD数据集上进一步微调了这个模型。我们首先训练了整个网络,即所有参数都被更新(除了用于训练的辅助损失层),我们在验证集上达到了33.6%的平均 IoU。与其他 2D 语义分割方法相比,这是一个相对较好的结果,因为SUNRGBD数据集非常具有挑战性。特别是,SegNet在他们的论文中报告了31.8%的平均 IoU。然后我们尝试冻结CNN的内层,不更新它们的参数,只训练最终的分类层。我们这样做是因为我们认为在 ADE20K上训练的模型可能包含相似且更丰富的特征表示。但是通过这样做,我们并没有取得更好的结果。我们还尝试冻结所有批量标准化层并微调网络的其余部分。这样做的原因是原始PSPNet是通过在两个GPU之间执行消息传递来使用大批量大小进行训练的,作者报告说批量大小可能是获得良好结果的重要因素。同时,通过这样做,我们并没有在验证集上获得更好的平均IoU。图 4.2显示了训练过程中最佳模型的平均IoU和训练损失的演变。最好的结果是在epoch 7获得的。图4.3显示了训练期间训练集和验证集的示例图像。

 图 4.2 – 在SUNRGBD微调期间最佳模型的平均IoU和训练损失数据集。 验证结果为橙色,训练结果为蓝色。达到最佳效果在第7个epoch。

 图4.3 – SUNRGBD数据集微调期间的示例图像。左表示提取的RGB图像。中间是CNN生成的语义图像,最右边是正确的语义分割图像。

5. 结论

        在这项工作中,我们演示了如何构建一个工作系统,以实时构建基于体素的 3D语义图,单手手持 RGB-D相机,适用于室内机器人应用。 我们结合了视觉 SLAM、语义分割和地图表示的最先进方法。我们提出了贝叶斯语义融合方法的修改版本,以便能够接受大量语义类,同时保持内存高效和可更新。 我们在ROS 中实现了我们的开源系统,这是一种广泛使用的机器人系统,以促进未来的扩展。 我们的定性评估显示了良好的映射和语义分割结果。未来的工作可以集中在预期的深度预测和单目相机的使用上。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值