1. introduction
目前的SLAM系统存在两个待完善的地方:
- 默认场景是静态的,把动态的物体当作外点,没能追踪场景的动态物体。
- 仅构造几何地图,或地图只有像素级的语义信息,没有物体级的信息。
contribution:
- 构造了实例级的三维地图
- 结合MASK RCNN的目标检测和几何的物体边缘检测方法,细化实例边缘
- 能够追踪场景中的刚体动态物体,而非把它们当作外点排除,只排除动态的非刚体。
- 对于动态物体,不用像slam++一样对其预先建模
系统使用mask rcnn识别物体,得到的检测结果,与几何分割得到的结果匹配,最终使用匹配的几何分割的区域,更新model。
不太懂的地方是:
- 全篇默认位姿估计准确,但物体移动了之后,如何保证估计是准确的,从而准确的追踪动态物体呢?
- 就算追踪到了动态物体,物体动后,是如何更新地图的?更新这个物体的所有surfel的位姿吗?(每帧重新渲染?
- 物体模型是怎么初始化的?好像没看到哪里是判断是否加入或删除新物体,从而更新地图的。
2. system overview
2.1. tracking
对于场景中的静态和动态物体采用不同的方法。
对于动态物体:
存储表示这个物体的surfel的set,估计其六自由度的位姿。位姿的估计是通过ICP最小化光度误差,光度误差是根据上一帧位姿,得到的当前帧像素点于地图点匹配对计算出来的。(那么,像素点和地图点怎么计算photometric cost based on brightness constancy?)
对于静态物体:
和背景一样,一起看作一个整体跟踪。
判断是否动态:
两种方法:
- 根据运动一致性(使用的是Co-Fusion的方法)
- 根据是否有人接触
2.2. segmentation
语义分割结合了深度网络和几何方法两种。系统实时运行几何边缘分割,仅匹配当前地图中已存在的model,并优化它们。同时间隔一定帧数运行Mask RCNN。这样几何提取边缘的方法,就能逐渐优化Mask RCNN的实例分割结果。
深度网络
使用Mask RCNN提供目标检测结果和粗略的实例分割边界。但Mask RCNN不能实时运行,且语义边界粗糙(leak into background)。
几何方法
通过深度不连续性和表面法向量,得到精准的语义边界。可以实时运行,但会over segment
2.3. fusion
每一个物体几何结构的融合,采用的方法于elastic fusion相同,是基于其类别标签,把同类的surfel关联到正确的模型上。
3. MULTI-OBJECT SLAM
地图存储了一系列的instance model,包括N个instance和1一个背景:
M m ∀ m ∈ { 0 , . . . , N } M_m \forall m \in \{0,...,N\} Mm