1. introduction
本文结合了MASK RCNN,说是语义SLAM,其实基本没用到语义信息,而是结合了物体检测结果,对每个物体进行三维重建,建立物体级的地图。并完善了基于这个地图的初始化、删除、更新、跟踪、重定位、图优化的工作。
存在的不足还是挺多的,默认场景是静态的,并且不追踪动态物体。MASK RCNN的阈值很高,这样漏检应该是比较严重的。MASK RCNN并非实时,30帧运行一次。
基于Kinect fusion,使用MASK RCNN分割每张图像上的实例级物体,建立每个物体的TSDF,利用其对每个物体进行重建、赋予3D前景mask,并且每个重建的物体都含有其语义信息和所有其他预测。
重建的物体以6自由度的位姿图的形式存储,每一帧以物体为单位,对其进行优化,并用于跟踪、重定位和闭环检测。在检测到闭环后,物体的位姿会被调整,但每个物体内部的结构不变,物体的语义信息也每一帧优化更新。
主要贡献有:
- 创建了一个物体朝向的SLAM系统,构造含有不同分辨率的3D实例级物体的地图。
- 每一帧的2D物体检测都使用体素前景(voxel foreground)融合,并记录其被检测到的次数比例。
- 实现了全局一致、闭环的地图,包含高质量的物体重建。
2. Method
系统流程是:
- 输入RGBD图像,初始化背景TSDF,用于local tracking和occlusion handling。
- 若位姿改变过大或跟踪丢失,进行重定位和图优化,并重置TSDF。
- 独立的检测线程使用MASK RCNN检测物体,检测结果经滤波与已存的物体级地图匹配。
- 若地图中无匹配上的物体,新建TSDF物体实例并加入地图。
- 关联的前景检测与物体的3D前景mask融合,并关联其语义信息和存在概率图。
2.1. TSDF Object Instances
地图是以重建的物体为单位组成的,每个物体由TSDF进行重建,记为 v o v_o vo。每个 v o v_o vo有一个相应的位姿属性 T w o T_{wo} Two,表示这个物体出现的一帧到世界坐标系所在参考帧的转换。每一个重建的物体实例都由一个正方体volume进行表示,相应的,这个volume包含一个中心点位置(坐标系为?),以三维点坐标表示,和一个size,以边长表示。
总结一下,这部分讲了地图的基本构成单位:instance。
- 它的表示方法:TSDF重建。
- 如何初始化和更新其位置和大小。
- 如何更新其形状和前景标记。
- 如何渲染。
- 如何记录更新其检测概率和语义概率。
- 如何判断其是否应该被新建或删除。
2.1.1. Initialisation and resizing
这步的目的是新建一个TSDF重建模型,初始化其参数。
当在当前帧检测到当前地图中不存在的物体时,要重建一个新的TSDF插入地图。重建一个新的TSDF,首先要确定它的size和position。
重建时,根据检测到物体的mask,将其投影到三维世界坐标系中。具体做法是对于每个mask中的坐标点,找到其对应深度图中的深度,将归一化坐标scale,再经内参矩阵和外参矩阵转换,得到世界坐标系下的三维坐标。这里,外参是当前相机位姿的估计。文中说,同时会将部分背景也重建,因此猜想,这里的mask是mask rcnn直接得到的bounding box,而非分割轮廓?
确定position
找到10%和90%的坐标点,计算其均值为中心坐标。
确定size
确定体积为 s o = m ∣ ∣ p 90 − p 10 ∣ ∣ ∞ s_o=m||p_{90}-p_{10}||_∞ so=m∣∣p90−p10∣∣∞,根据固定的分辨率 r o = 64 r_o=64 ro=64,计算每一个体素的大小 v o = s o r o v_o=\frac {s_o}{r_o} v