语义slam_Jetson上的三维重建与语义SLAM初探
其实我很早就想写点关于SLAM的内容了,无奈这个领域分支太多,讨论起来又容易太发散,又容易陷入知识的诅咒。这篇文章介绍的还是经典算法,并非我们在工程中使用的,但希望对学习SLAM的同学有所帮助。我们在Jetson上早就做过各种SLAM方面的尝试,从TX2到Xavier,几乎每一种板子上都做了性能评估。我一直觉得对于机器人应用,Jetson最大的潜力不在于其AI性能,而是在GPGPU上对各种算法做并行化加速。毕竟AI目前所能解决的都不是痛点,只是锦上添花。我们在机器人学中的积累的大量技术都与AI无关。大量算法有良好的数学理论基础,比AI要透明的多,而它们在工程上被抛弃的主要原因是算不过来,或者说算的太慢。很多算法,尤其是在机器人的感知方面,都适合做并行化加速。比如图像传输时的编解码,众多机器视觉算法,点云处理算法,地图处理算法。还有一些涉及线性代数的问题,只要问题规模足够大,在GPU上也会获得较大的加速效果。比如SLAM中回环检测的全局优化。我们之所以常把里程计和回环分成前后端分开来做,一方面是便于研究和整合,另一方面也是因为后端计算要比前端慢得多。在vSLAM中,使用GPU或FPGA来加速前端的特征提取或者光流已经是很常见的操作,而后端其实也可以用GPU来加速优化问题求解。
下面要谈的三维重建,和SLAM高度相关,但又有一些区别。这方面其实在知乎上有过相关的讨论。在SLAM中,我们更关心的是定位,而建图主要也是为之后的定位服务的。SLAM并没有限定我们用什么样的地图。三维重建则几乎等同于稠密建图,为了获得物体的三维信息。这个领域的经典算法,像KinectFusion,ElasticFusion,都同时涉及到相机位置估计和稠密重建。因此既可以将他们归类为三维重建,也可以归类为基于RGB-D相机的SLAM。在该领域发展早期,大家往往使用性价比较高的Kinect相机或PrimeSense。而如今更多的人可能会使用更为小巧的RealSense。我也在之前的文章中分享过如何在Jetson上安装RealSense驱动。而现在已经不用像以前一样编译安装了,和x86一样使用apt仓库即可。arm64的deb包已针对Jetson系列优化,部分后处理已使用cuda加速。具体步骤请参考官方仓库中的文档。
Linux Distribution得益于其他开发者的贡献,许多经典已加入了RealSense支持,便于大家复现。例如想用RealSense体验KinectFusion的话,可以使用下面的ROS包。我在2年前为其添加了RealSense的launch文件。当然,以我们现在积累的RealSense调参经验来看,这里面还有很多启动参数可以再优化一下。。。
ros_kinfuKinectFusion只使用了深度图,GPU主要用来加速ICP计算。这里还需要先编译安装有GPU支持的PCL库,因此要运行起来稍微麻烦了一些。
之后的ElasticFusion加入了彩色图,还引入了Surfel地图。其中除了ICP,还有更多的实现使用了GPU加速,包括追踪规约、SO3预对齐、视角预测(通过OpenGL)。经过修改后,要在Jetson上跑起来还是比较容易的,这里不再需要ROS,唯一需要编译的依赖是Pangolin。
ElasticFusion不过要想流畅运行,建议使用AGX Xavier或Xavier NX。如果使用Jetson Nano,和原版推荐的算力相差太大。
知乎视频
在ElasticFusion的基础上,又发展出了SemanticFusion,这是对于语义SLAM的早期尝试。到了语义SLAM这部分,才真正需要AI的介入。不过我目前暂时还没完成SemanticFusion在Jetson上运行的改造,这也是为什么这次的内容鸽了这么久。。。但与其独自挖坑填坑,不如先记录在这里。原版的SemanticFusion使用Caffe模型来进行推理。但我们并不想在Jetson上折腾一个早期版本的Caffe部署,我们甚至不想让语义分割模型推理占用太多GPU资源,以影响到ElasticFusion的性能。最好就是不仅要用TensorRT推理,还要放到Xavier的DLA上去做。原版实现使用了在NYU数据集上训练的模型,现在可以考虑将其替换为jetson-inference中提供的在SUN RGB-D上训练的模型。幸运的是该模型的所有层都被DLA所支持。最后剩下的坑就是将其转换为和原版模型一致的输出格式。
知乎视频
任何语义模型都难做到绝对的准确,尤其对于NYU和SUN RGB-D这类比较困难的数据集。而SemanticFusion使用CRF来对各帧的结果进行融合,结果会好于单帧所得到的结果。高博在《视觉SLAM十四讲》中对SLAM和语义如何相互促进也做了一些讨论。在SemanticFusion中显然SLAM可以帮助语义。我们会注意到,在大多数情况下,SLAM帮助语义发生在前端,而语义帮助SLAM出现在后端。后者目前看来有较大的价值。在vSLAM中,传统的闭环检测手段大多依赖低层级特征,以至于算法对光照变化不够鲁棒。目前vSLAM大多只用作里程计,在室内光照环境可控的情况下也可做回环检测及全局定位用。而在室外应用中,如何让机器人在白天和夜晚能准确辨认出同一场景,当前还是具有挑战性的。这时候几何特征和语义信息会比低层级图像特征更具有鲁棒性。
最后我想再谈一些关于Xavier系列的使用经验。之前也提到过Xavier的算力构成比较复杂。官方宣传中所说的大多是AI算力,这部分由GPU和DLA构成。而对于机器视觉来说,还有些算法甚至可以放在专用硬件上来完成,以节约CPU和GPU资源。这方面有PVA(Programmable Vision Accelerator)和VIC(Video and Image Compositor)。这两部分的接口此前并不完善,而在最新的JetPack中提供了VPI(Vision Programming Interface)接口。已经可以在这两个专用电路上实现图像去畸变、双目视差计算、KLT追踪等算法。详情见官方文档。
VPI - Vision Programming Interface类似苹果M1 SoC,专用电路往往能提供极高的性能。甚至在特定算法上,PVA比GPU的性能要高得多。这无疑为我们的算法设计提供了更多可能和挑战,但为了这些性能,付出是值得的。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)