深度学习与slam的小小思考

深度学习与slam的小小思考

好久不发文章了,主要是研究的东西因为要发论文,所以发表之前很难分享出来,加上研一上学期老师安排的工作比较琐碎,所以更新的很少。不过研一下可能会好些,立个flag,每月至少更新一篇。

  1. 关于深度学习处理图像的低级和高级特征

    对于计算机视觉而言,图像处理分为低级特征和高级特征。我们通常把一些去雨去云去雾,去模糊,去反光,去玻璃等等这些相关的任务,认为是针对图像低级特征(low-level)而言的,当然,特征提取这种CNN拿手好戏除外,不参与本章节的讨论。而目标识别,场景理解等这些更接近object级别的任务属于是关于高级特征进行处理的(high-level)。这些基础知识大家估计都很清楚,我也就不再赘述。

    说来惭愧,我初入slam领域的第一个尝试就是基于深度的模糊监测和视觉slam结合的研究(下文除特殊说明一律指的纯视觉slam系统),然而在研究过程中我逐渐意识到了我的失误,也是我第一部分想要总结的:**普遍适用的场景下,针对图像低级特征的深度学习不适合和slam系统相结合。**要理解这一点首先需要明白两点:1. slam系统到底受到这些低级别特征误差的影响多大,以及 2. 图像高级特征能为slam带来哪些低级特征所不具备的特性?

    我们首先看第一个问题。需要注意的是,图像低级特征的深度学习不适合和slam系统相结合,并不意味着低级别特征误差的影响对slam系统很小,影响大小实际上是受到不同环境影响的。有的对slam影响不那么大,比如,我之前在测试TUM数据集上的数据集时发现模糊对slam系统影响较小(极端场景下除外);还有一些对slam系统的影响比较突出,比如在图书馆测试时候我们发现地面和玻璃的反光极大的降低了slam系统的建图及定位质量。但是,这些问题真的没办法用深度学习以外的方法解决吗?当我们把目光放开,不局限于视觉算法这个点的时候,我们会发现问题豁然开朗。处理运动模糊,我们可以从硬件上解决,比如全局快门,事件相机等;处理反光折射,我们可以利用多传感器融合技术,融合IMU、4D毫米波雷达,超声波等其他传感装置处理这种极端情况;对于一些云雨雾问题,甚至有不少算法直接集成到了相机芯片上,不再需要我们额外考量。

    当然,仅仅如此的话,我们只是能说针对图像低级特征的深度学习方法是没有必要的,而不是说是不合适的。真正决定因素在于图像低级特征很难融入slam的核心环节中,优化和建图之中。处理这些低级特征仅仅能够一定程度上提高找到匹配正确的特征点准确率而已,也就意味着,这些处理仅仅在前端匹配上生效,并且由于改进方法大多是帧独立的,甚至连里程计都没办法完整的参与。而这一点也是高级特征相比低级特征独特的地方。以我个人比较熟悉的动态slam为例,对于动态刚体很多文章的思路就是将动态特征点和静态特征点建立一个综合的因子图,联合进行优化;还有一些文章是利用动态知识建立一个特殊的地图,辅助后续的导航等任务。上述例子很多,我也就不再列举相关文章了(主要是懒),不过可以清晰的看出,高级语义信息是和slam系统是“紧耦合”的,它深度参与到slam系统中,而这一点图像的低级特征很难做到。

    那么针对图像低级特征的深度学习系统和针对图像的高级特征系统能否共同存在呢?如果设备足够强大当然可以考虑,但是就当前一般场景而言,是不可能的。slam系统脱胎与三维重建,与后者重要区别就是实时性(虽然三维重建也有实时性的,不过容我们之后再提),因此在有限设备上,并且要求实时的情况下很难支撑起两个深度网络,哪怕他是可以并行的。因此,从我现在看的一些文章来说,大部分深度学习结合slam系统的文章主要都集中到了图像的高级特征这块。这类文章的特点就是,想做出点东西简单,但是想做出点好东西,很难。

  2. 再谈动态场景下的slam

    如果看我的博客的可能会注意到,我之前本科毕设的课题就是做的动态场景下的slam,因此尽管到了研究生阶段不再从事相关课题,我有时也会关注相关文章和思路,也有了一些新的思考,于是趁着最近有空就把这些新的收获说一说。当然,这个属于一家之言,大家可以参考但是不要太认真,说不定过两天我就要推翻自己的说法了。

    首先还是那个老问题,动态干扰对slam影响大不大?尽管各种文章有各种实验证明和对比,emmm,但是怎么说呢,我个人认为影响真的没那么大(当然分情况,这里说的是不那么极端的情况下)。首先,以我之前做的kitti为例,一辆车从后往前过去了,咦,为什么车上面的有效特征点那么少?在VSO的论文中,作者认为运动物体的patch很大程度上会有尺度、视角和光照的剧烈变换,这种变换可能超出了普通SLAM的处理范围(比如八叉树处理尺度等),加之ORB-SLAM采用的网格划分方法均匀化特征点分布,这带来的问题是,运动刚体上的能够真正化为地图上点云的特征点没有那么多。另一个常见的运动对象是人体,他属于那种非刚体的变换,人体身上的特征点也是不稳定的,比如衣服上的花纹,会随着运动有遮挡,褶皱,因而匹配也是比较少的。但是,运动物体占据视角的很大一块区域的时候,运动效果影响还是比较大的。

    我们对于动态物体怎么处理?有些非刚体直接去除就去除了(比如行人),但是车辆是不是还可以继续利用?这就是车辆检测和速度估计结合。之前我做过速度估计,不是很好做,主要是动态物体的特征点太难提取,一般还得用密集光流才能保持稳定追踪,而密集光流还得用深度学习效果才比较好,所以得嵌套两个网络,还是串联(虽然想了想并行也行,就是有点浪费),硬件不够的话实时性直接完蛋。

    对于深度网络该如何选择呢?目前提供语义信息的主要有两种(这里仅考虑二维图像,不考虑点云),一种是语义分割,也就是我之前毕设的思路,还有一种是目标检测。两种各有优劣,但是我个人反而比较推崇的是目标检测提供语义。这个和slam关联不大,主要是深度学习的问题。从我个人实践的效果来看,语义分割,特别是实例分割级别的效果没有想象中的那么好,其一是速度较慢(相较目标检测而言),其二是分割不干净或者有奇怪的延伸。第一点的话目前很少看到实例分割和slam结合后还能达到实时的文章(部分达到实时的采用了关键帧技术),但是目标检测确实有不少。第二点,目标检测的优点在于检测的类别较多,如果语义分割要达到目标检测的水平可能需要更多的数据和训练技巧(训练种类较少会导致对于非训练内容,比如KITTI数据集中的高速公路栏杆,容易被识别为行人等已训练种类,本质上是由于训练数据的负样本缺乏导致的),并且定位目标检测的定位由于目标框的形式限制了范围,不会有奇怪的延伸。当然目标检测也是有缺点的,它的稳定性或者连续性是不如语义分割的。目标检测很容易出现那种目标框一闪一闪的情况,这就是由于其中某几帧没有检测到物体导致的。不过不要紧,这个方面我们可以用数据关联的技术解决。除此之外,目标检测还可以比较简单的扩展到3D目标框检测,如港科大沈老师他们实验室的那篇文章(Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving)

    语义分割还有一个分支比较有意思,车道线检测,利用车道线或者车库引导线建立高效的SLAM系统,这也是很有意思也是很成功的一个方法,我记得港科大的秦通大佬好像写过,还有今天(2021.3.28)泡泡机器人推的文章正好也是这个,大家有兴趣可以看看。不过这个偏向于系统,多目相机多传感器联合工作,能把误差弄到厘米级,正常学校实验室很少有这个条件和实验环境就是。

    当前研究的难点在于:1. 如何利用数据关联技术维护语义信息的稳定性和准确性;2. 将语义信息加入后端联合优化。目前有不少文章在这两个领域有所成果。数据关联方向(Probabilistic Data Association for Semantic SLAM, VSO等),联合优化之前文章提过,懒得复制了,大家自己去找就好。

  3. 建图与重定位

    再次声明,这块也是个人理解,如果有不同见解欢迎讨论。这块可能和深度学习关联不大,但是就几句话,所以干脆放在这里了。

    标准的SLAM定义是同时定位与建图,但是很多时候我们没有必要做到一边建图一边定位。如在自动驾驶领域,或者一些环境固定的区域,我们完全可以把任务分解为两个部分,第一遍建立地图,之后只需要定位与地图维护的工作就好,其中用到的技术就是重定位。

    比较有意义的一点是,这样其实能够一定程度上保证了建图的质量。未魔改的ORB-SLAM为了保证足够的帧率,最后生成的一张稀疏的点云地图。但是实际应用时,我们在建图模块完全可以牺牲帧率,以运动足够慢为代价生成更为高级的稠密地图(实时版本的三维重建)或者语义地图,在这种高级地图上我们后续运动的精度将大幅提高。此时,重定位问题更注重环境适应性,长期性,动态变化改变等问题。但是实际上这块(基于地图的重定位)的文章真的没那么多,大家有兴趣的可以关注这块领域。

你可能感兴趣的:(SLAM,slam,定位,深度学习,slam和深度学习)