专栏名称: 泡泡机器人SLAM
SLAM的最新资讯,干货内容。
目录
相关文章推荐
51好读  ›  专栏  ›  泡泡机器人SLAM

【泡泡机器人原创专栏】Deep Learning 在 SLAM 中的应用之语义建图

泡泡机器人SLAM  · 公众号  · 机器人  · 2017-04-26 22:20

正文

            近些年来,随着 Deep Learning 技术的飞速发展, Deep Learning 技术在计算机视觉的各个领域都有着非常成功的应用。其中 semantic segmentation 是其中一个重要的方向。那么什么是 semantic segmentation 呢? semantic segmentic 的输入是一幅图像,输出是同样尺寸的图像,其中每个 pixel 代表的是该像素的类别(label),也就是输入图像的语义图(semantic map)。
        当我们有了整幅图像的 semantic map 后,身为做 SLAM 的我们就会想到,能不能把semantic map 与 SLAM 相结合,生成漂亮的 3D 的语义模型呢?答案是 yes。过去,类似的工作是由随机森林和 3D Reconstruction 完成的,近些年(2016 年开始)涌现了一些将 Deep Learning 与 SLAM 相结合的工作,并且有逐渐增多的趋势。
        进行语义建图的 pipline 很简单:
        1. 为了获得一个好的 3D 模型,一般语义建图都是采用 RGBD 相机的稠密建图。
        2. semantic segmentation 一般是直接作用于 2D 的 RGB 图像上,生成 2D 的 semantic
map
        3. 将 2D semantic map 反向投影到 3D 的模型上,得到语义模型。
        4. 因为图像分割的效果一般并不是很理想,所以我们会加一步后处理,在 3D 上做一下
Condition Random Field,来 refne 最后的结果
        条件随机场可以简单的理解为相似相邻,以 2D 图像举例:距离近的,差异小的 pixel 我们认为他们应该拥有相同的 label,所以对于距离近的,差异小的 pixel,如果他们的 label 相同,我们给予它一个小的 loss,如果 label 不同,我们给予他们一个大的 loss,最后我们最小化整个模型的 loss function,得到所有 pixel 的 label。

整个 pipline 流程见 Figure 2。
下面,我们先举一个过去采用随机森林进行语义建图的例子,之后再介绍几个最近的基于 Deep Learning 的语义建图的工作。


1. Incremental Dense Semantic Stereo Fusion[VML+15]


在这个工作里面,我们会详细的介绍语义建图里面的一些基本知识。后续几个工作只是
简单的提及自身的创新点,对于之前描述过的内容不再赘述。
整个系统的 pipline 见 Figure 3,最终的效果图见 Figure 4。


1.1 Semantic Segmentation
Semantic Segmentation 采用的是 Random Forest 方法,具体我也没有细看,就不细表了。


1.2 Mapping
在 Mapping 这块,与传统的 3D Reconstruction 技术并没有什么不同,只是采用 Stereo 估计深度。该工作使用了 Voxel Hashing 实现的 KinectFusion 系统进行建图,以保证 Large-scale的重建。



1.3 Semantic Fusion
        在这里我们点出了语义信息如何更好的帮助建图。此处利用语义信息来处理动态物体。
        我们知道,动态物体对于 tracking 和 fusion 都会有很大的影响。对于不同类物体,它是否是运动的概率是不一样的。比如车辆很可能是运动的,但是路面就肯定不是运动的。所以与传统的 KinectFusion 的 Fusion 方法不同, Semantic Fusion 利用语义信息根据 voxel 的 label给予每个 voxel 不同的 weight 进行 fusion。

在上面的更新方程中 是每个类时间对于 voxel的固定的 weight。


1.4 Label Fusion


我们在每一个 voxel 中存储对应 label 的概率,然后采用贝叶斯的方式用每次得到的 semantic map(在这里存储每个 pixel 对应 label 的概率)来更新每个 label 的概率。


1.5 3D Condition Random Field

        在这一节简单的介绍一下 3D Condition Random Field

        在这里我们把 Condition Random Field 定义在 voxel 上,所以从 2D Condition Random Field 扩展到了 3D Condition Random Field。
        loss function 由两部分组成:

        1. 对于每一个 voxel,我们定义一个 Unary potentials,也就是该 voxel 取得当前 label 所得到的 loss
2. 对于相邻 voxel,我们定义 Pairwise potentials 施加 label 的一致性约束,期望得到smoothing 的结果。在这里,对于相同的 label,我们定义 loss 为 0,对于不同的 label 我们定义 loss 为

        其中分别代表着 voxel 的位置, rgb 和法向的值。θ 代表的是不同量的权重。我们可以看到,差异越小, loss 越大。

        把上面两项加起来就得到了最终的 loss function,我们一般采用在 GPU 上并行的 meanfled 方法迭代求解出每个 voxel 的 label。

        注意,每次的优化只是针对于当前的 frustum。


 2. SemanticFusion[MHDL16]

        这里不同于上一方法,使用 ElasticFusion 进行 Reconstruction,方法与上类似,唯一两点值得注意的是:

        1. 采用 Surfl 表达而不是 Voxel 表达感觉上更省空间(Voxel 一下子存每个类的概率非常费资源)

        2. 采用 CNN 而不是 Random Forest 来做 Semantic Segmentation



3. DA-RNN[XF17]

这个工作最有启发性的是它提出了三种架构,我们直接上架构图。

此处采用 RNN 利用了视频流的帧间信息。在这里要特别强调为什么使用 RNN。举一个简单的例子,我们用相机从地面往墙上拍,当相机完全冲向墙,只根据当前帧我们完全无法判断出该场景是墙还是天花板,但是利用帧间信息我们就可以把过去的 label“传播”到当前帧从而得到准确的结果。



【版权声明】泡泡机器人SLAM的所有文章全部由泡泡机器人的成员花费大量心血制作而成的原创内容,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!

【注】商业转载请联系刘富强([email protected])进行授权。普通个人转载,请保留版权声明,并且在文章下方放上“泡泡机器人SLAM”微信公

众账号的二维码即可。