一、 主要内容
最近开始看语义SLAM的内容(叹。
主要贡献
1.融合的state of the art的SLAM系统ElasticFusion
,使用CNN进行语义分割,加上条件随机场对分割结果的优化,设计了semantic mapping
的系统。
2.使用的摄像头为RGB-D,系统帧率达到25Hz,保证了实时性。
3.提出(?)了语义地图中,每个点类别概率的更新方法。
额外收获
1.结合视频连续帧间的信息,可以优化CNN对单张图片的分割效果。
2.能够同步运行闭环检测,并保留语义信息的一致性。
3.提出了一个把RGB图像训练得到的分割模型,迁移用在RGB-D输入上的方法。
存在的不足
1.大概也是所有语义SLAM系统都存在的问题。CNN的预测并不是实时的,这篇文章选择每隔10帧预测一次,2.在帧率和运行CNN的间隔数中做了trade-off。
3.条件随机场500帧做一次, 看起来没什么提升,是以后可以挖掘的点(有论文使用几何方法fine-tune边缘
4.仅做了语义mapping,没有把语义信息用于tracking。
5.用的语义分割模型来自Learning Deconvolution Network for Semantic Segmentation
,是基于FCN的,可以改进成deeplab系的高精度模型/shuffleNet系的高效率模型/MaskRCNN系的结合物体识别模型?
相关资料
- 主页
semantic fusion - 视频
YouTube-SemanticFusion: Dense 3D Semantic Mapping with Convolutional Neural Networks - 代码
full codes
二、实现方法
整体流程分为三部分:
- ElasticFusion模块:实时计算帧间位姿关系,构建
surfels
表示的全局地图。 - CNN模块:输入RGBD图像,输出每个像素的类别概率。
- 贝叶斯更新模块(Bayesian update scheme):根据CNN的输出和SLAM提供的2D-3D点关联关系,更新全局地图中每个surfel的类别概率。
- CRF模块(CRF regularisation scheme):利用全局地图的几何信息,调整语义分割结果。
整个系统的流程是:RGBD相机接受输入,SLAM系统构建3D地图。每隔固定帧CNN运行一次,给地图更新语义信息。每隔另一个固定帧,CRF运行一次,调整语义分割结果。同时整个系统作用期间都运行闭环检测,若检测到闭环,就更新地图,同时保持语义信息的不变。
1. SLAM Mapping
ElasticFusion 主要完成了:
- 使用ICP进行位姿估计得到 T W C T_{WC} TWC,对RGB图像进行帧间匹配(?)。
- 每新来一帧,都优化map中的surfels。
- 同时运行闭环检测,若检测到闭环,则优化整个map。
ElasticFusion里使用surfel来表示地图,surfel除了位置信息外,还包含了法向信息、颜色信息等。据说是比较适用于当前任务?对ElasticFusion不是很了解。
2. CNN Architecture
网络由caffe
实现,backbone是VGG-16
,原模型接受RGB的三通道输入。
为了能使用RGBD的输入,作者把它做了改进,把Input的channel由3变为4。但由于现有的RGBD数据集很少,不能把第四个通道和前三个等程度的初始化。于是作者想了一个初始化的办法。
前三个通道的weights已经由大规模的RGB数据集训练好,第四个通道的weights 初始化为前三个的均值,然后把灰度图[0,255]的range对应到深度图的[0,8]。这里不是很明白,不知道这个convert具体是指什么,可能得看一看代码才行。
然后是输入图像的预处理,获取到的深度图和彩色图分辨率应该是不同的,所以先用双线性插值把RGB图像缩放到224x224,然后用最近邻获取每个点的深度。又用数据集NYUv2
进行fine tune。NYUv2
是一个珍贵的深度视频数据集,用它调整第四个channel的参数和网络的类别数。
最终输出的是640x480的概率图。
3. Incremental Semantic Label Fusion
这步用于更新地图中surfels的类别概率。
概率初始化为均匀分布,类别数已知,无先验。
根据SLAM中得到的位姿 T W C T_{WC} TWC,能够获得2D图像中点与3D map中surfel的对应关系。然后使用贝叶斯公式更新地图中surfel的类别概率:
P ( l i ∣ I 1 , . . . , k ) = 1 Z P ( l i − 1 ∣ I 1 , . . . , k ) [ ( O u ( s , k ) = l i ∣ I k ) P(l_i|I_{1,...,k})= \frac{1}{Z} P(l_{i-1}|I_{1,...,k})[(O_{u(s,k)}=l_i|I_k) P