查看原文
其他

高翔:谈谈语义SLAM/地图

The following article is from 泡泡机器人SLAM Author 高翔

 点“计算机视觉life”关注,置顶更快接收消息!

作者:高翔

链接:https://zhuanlan.zhihu.com/p/58648284

本文已授权,感谢泡泡机器人整理


SLAM发展到今天,好些人认为这已经是个Solved Problem了。然而实际去考察,你会发现这个同时『定位』与『建图』,在『定位』这端做了很多工作,但『建图』这端是明显缺乏的。按照理想中的情况,一个SLAM程序的流程应该是这样:


  1. 对陌生环境进行一次扫描,建立地图;

  2. 保存地图;

  3. 以后运行时,打开这张地图进行定位。


这基本上是SLAM的最终目标了。但是当你打开一个SLAM程序,你会发现我们只能做完第1步,往往是建完地图之后,程序退出,所有你建起来的特征点也好,稠密点云也好,surfel也好,tsdf也好,好看是好看,基本没法存下来当作地图来继续使用(顶多做个3D模型打印一下)。所以如果要问『SLAM现在做到什么程度』,我觉得大致上可以这样回答:


  • 关于第1步,现在我们能做到比较好的实时追踪和建图。大部分研究集中在Tracking上面,不过这种方式在无闭环时必定有累计误差,我个人经验是在0.5%-1%这个数量级,也许个别方案在个别数据上看起来好一些,不过视觉肯定比激光要差一些,比仔细标定的轮速计也差一些,也比较容易受干扰,但好在是一个独立的系统,和别的能够互相补充。有回环可以消累积误差,前提是得回来,自动驾驶很多场景是车一直往前开,基本不回去。


  • 关于第2步和第3步,有一些可能的解决方案,但是都不完善。相比来说,激光SLAM在地图这边相对统一,通常都是用2D网格和3D点云来做,与激光数据可以直接比较。视觉地图就没那么直接。很多研究并不奔着『地图复用』的目的去,通常是做完第1步之后就完全不管了,导致我们现在没有特别好的视觉地图可以用。


所以现阶段我们还能难说『视觉SLAM已经解决』这样的话,除非能够拿出一张可以随时定位的视觉地图。这部分的缺失,我认为是语义SLAM的一个很重要的动机。我们不妨想想,现在有哪些可能用来作为视觉地图的东西:



  • 高精地图,点云加人工标。这个一般学校生产不出来,只有公司里有;

  • Grid map/Occupancy map,适合激光。有RGB-D的时候可以用,纯视觉困难;

  • 特征点地图,现在SLAM里主要形式,类似ORB-SLAM2的地图,容易受光照和场景影响。

  • 点云/带标记的点云,很难用,可能有部分带半稠密重建的方法可以和点云地图做ICP。

  • 物体地图,以物体实例作为路标的地图。

  • 拓扑地图,以路径点作为节点的拓扑图,可以端到端地训练图像到路径点的映射。


所以现在看来室内比较有希望的是后面几种,自动驾驶主要是高精地图。


什么是语义SLAM?


语义SLAM的概念很模糊。你会找到许多带着『Semantic』字眼,实际上完全不在说同一件事情的论文。比如从图像到Pose端到端的VO、从分割结果建标记点云、场景识别、CNN提特征、CNN做回环、带语义标记误差的BA,等等,都可以叫语义SLAM。


但是从实用层面考虑,我觉得最关键的一点是:


用神经网络帮助SLAM提路标


提路标这件事实际上是传统SLAM非常不擅长的事情。我们用角点和边缘,是因为现在只有角点和边缘可用。如果现在有个网络,对任意一张图片都能正确找到图片里的路标,一一对应,非常鲁棒,那么后续的SLAM就是件很简单的事情。比如现在人脸关键点能够做的非常准、非常鲁棒,对各种光照下的人脸我们都能找到那几十个点。



如果我们能在道路场景或室内场景也能做到这种程度,那SLAM就完全不一样。然而现在似乎并没有这种做法,至少还没流行开来。


那么就只能退而求其次,用现有的检测和分割来帮忙提路标。如果已经知道图像中某个物体属于一个既定的类别,然后再提角点,就会比针对全图提角点要好很多。当然,如果能直接提到点,那肯定是提点更好用,检测和分割都需要一些额外的后续处理。


举一些上面谈到的地图例子。


带标记的点云是研究最多的,从很早之前就有。它的思路是把分割的结果往RGBD点云里投,然后做一个融合,RGBD+室内的场景多一些,室外也有一部分。18年比如ETH有把Mask RCNN结果投到3D中进行Instance推断然后建图的,可以达到非常细致的结果。


再早一点比如牛津的Semantic Fusion,算是比较经典的工作:


自动驾驶里也有这种类型的高精地图,举例比如说Civil maps的演示视频,点云中有标记车道线和地面箭头。后面也有带物体instance的地图:


单纯的给点云上标记的事情其实并没有太多用途。给激光用,激光ICP通常不考虑标记信息;给视觉用,视觉也没法直接和点云去匹配。所以这种五颜六色的点云来说,物体级别的地图会更加有用:



这种图的好处在于物体实际充当了SLAM中的路标的功能,它们的提取和匹配会比传统的角点更加鲁棒。你可以期待不同天气下都能提到同一个红绿灯,但你不能期待对于各种天气下同样的建筑物能提到同样的角点。


细分下去,这种基于物体的地图也可以有不同做法。比如室内环境,你可以准备一个3D模型库,只检测模型库内的物体。这种做法在早期的SLAM++和现在的一些论文中都能看到,比如这个就是存了椅子模型的:



观看本视频(video4)请到文末获取链接


这个模型更多一些,除了椅子还有很多小物体,能用地图信息修正检测结果,并且他们用的是检测而不是分割:



观看本视频(video5)请到文末获取链接


所以『把物体建出来当地图路标』其实是一个不错的思路。剩下的就是看物体有多少类,能不能支持到大多数常见的物体。就自动驾驶来说,有了车道线,你至少就能知道自己在第几根车道线之间。有了车道线地图,就能知道自己在地图上哪两根车道线之间。类别再丰富一些,能用来定位的东西就更多,覆盖范围也就更宽。


这个算是语义SLAM和传统SLAM中最不同的地方了。

以上视频来自YouTube,论文题目在视频开头处,读者可自行搜索


video4:   

https://v.qq.com/x/page/u0848a98m7f.html?pcsharecode=CdrLQDmn&sf=uri

video5:   

https://v.qq.com/x/page/p0848kefne5.html?pcsharecode=GsG7cVSL&sf=uri


推荐阅读

从零开始一起学习SLAM | 为什么要学SLAM?
从零开始一起学习SLAM | 学习SLAM到底需要学什么?

从零开始一起学习SLAM | SLAM有什么用?

从零开始一起学习SLAM | C++新特性要不要学?

从零开始一起学习SLAM | 为什么要用齐次坐标?

从零开始一起学习SLAM | 三维空间刚体的旋转

从零开始一起学习SLAM | 为啥需要李群与李代数?

从零开始一起学习SLAM | 相机成像模型

从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?

从零开始一起学习SLAM | 神奇的单应矩阵

从零开始一起学习SLAM | 你好,点云

从零开始一起学习SLAM | 给点云加个滤网

从零开始一起学习SLAM | 点云平滑法线估计

从零开始一起学习SLAM | 点云到网格的进化

从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

从零开始一起学习SLAM | 掌握g2o顶点编程套路

从零开始一起学习SLAM | 掌握g2o边的代码套路

SLAM初识

SLAM技术框架

惯性导航系统简介

视觉里程计:起源、优势、对比、应用

视觉里程计:特征点法之全面梳理

SLAM领域牛人、牛实验室、牛研究成果梳理

我用MATLAB撸了一个2D LiDAR SLAM

可视化理解四元数,愿你不再掉头发

IMU标定 | 工业界和学术界有什么不同?

汇总 | VIO、激光SLAM相关论文分类集锦

最近一年语义SLAM有哪些代表性工作?

视觉SLAM技术综述

研究SLAM,对编程的要求有多高?

深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?

2018年SLAM、三维视觉方向求职经验分享

新型相机DVS/Event-based camera的发展及应用

最近三年开源「语义SLAM/分割/建模」方案介绍
超详细干货 | 三维语义分割概述及总结

关注:计算机视觉life,一起探索计算机视觉新世界~

觉得有用,给个好看啦~  

继续滑动看下一个

高翔:谈谈语义SLAM/地图

向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存