[论文笔记] MaskFusion: Real-Time Recognition, Tracking and Reconstruction of Multiple Moving Objects

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\} Mmm{0,...,N}

模型的存储方式是:

每一个instance的模型都存储了:

  • 它属于那个类别的标签(1,80)
  • 它是第几个object的标签(0,n)
  • 一堆属于它的surfel

对于每一个surfel M m s M_m^{s} Mms,存储了:

  • 位置(3*1)
  • 法向(3*1)
  • 颜色(3*1)
  • 权重(1*1)
  • 半径(1*1)
  • 时间戳(2*1)

此外,对于每隔时刻的instance(time instance),还存储了:

  • 是否是静态的指示变量
  • 旋转
  • 平移

(这个时刻instance,难道是指每一帧吗)

3.1. tracking

假设前一帧的估计是准确的,对于第t帧中,模型m的位姿估计,是通过当前帧和上一帧,其通过模型m关联的像素点,在深度图和强度图中的误差最小化而来的。其中,强度图是由彩色图转化而来的单通道图。

整体估计方法是通过高斯牛顿法优化非线性最小二乘问题,优化变量是t时刻的六自由度位姿。

误差项由几何误差和光度误差共同构成:

E m = m i n e m ( E m i c p + λ E m r g b ) E_m=min_{e_m}(E_m^{icp}+\lambda E_{m}^{rgb}) Em=minem(Emicp+λEmrgb)

E m i c p E_m^{icp} Emicp是几何误差项,为对应点的ICP误差。 E m r g b E_{m}^{rgb} Emrgb是光度误差项,为对应点的强度误差平方和。

3.2. Fusion

简单介绍了一下估计出位姿后,怎么根据当前帧完善模型,给模型添加新surfel的方法。没有细讲,只强调了一下每一个新建的surfel都仅属于一个已存在的model。此外,针对分割结果有缺陷的事实,引入了surfel的置信度惩罚机制。

5. Segmentation

使用Mask RCNN+几何方法共同进行语义分割。Mask RCNN是一个于tracking和fusion并行的线程。系统设置了一个缓冲队列,存放固定数量的帧,tracking从队头取帧,Mask RCNN处理队尾的帧。

由于Mask RCNN无法实时运行,因此只处理间隔数量的帧。在融合的时候,如果Mask RCNN检测到了新物体,则加入场景。如果这一帧Mask RCNN没处理,就只匹配地图中已存在的模型,并用这一帧去优化匹配到的模型。

5.1. semantic instance segmentation

介绍了一下Mask RCNN

5.2. geometric segmentation

假设:场景中的物体边缘总是凹的,且深度(与背景?)不连续。基于这个假设,根据邻域内顶点和法线,计算两个得分项。如果它们的加权和大于一定的阈值,则认为这个像素是边。

得到抽取边的map后,再将其转为不同的几何结构(类似于取连通区域?)。

但是,这个方法会过分割(太碎)。

5.3. merged segmentation

分割部分,几何方法逐帧运行,包括以下流程:

  • 计算深度距离
  • 计算凹边缘
  • 计算像素得分,与阈值比较,得到components
  • 与地图中的已有模型匹配

当进行Mask RCNN时,这一帧中,Mask RCNN和几何方法都运行,包括以下流程:

  • 将几何components与mask匹配
  • 移除islands
  • 与地图中的模型匹配

在这样的帧中:

mapping geometric labels to masks

对每个components计算它和mask相交的面积,大于一定阈值视为匹配。一个mask可以与多个component匹配,但一个component只能匹配一个mask。

如果匹配上了,则用对应的component区域代替原mask。

mapping masks to models

将地图中的model根据估计的位姿投影到当前帧,这里默认位姿估计准确。然后也是用相交面积判断,这个更新后的component,是否与model匹配,同时要确认类别标签是否一致。

剩下的那些没有和模型匹配上的component,直接匹配到地图中。(是对于新物体吗?

你可能感兴趣的:(SLAM,论文笔记)