[论文笔记] SemanticFusion: Dense 3D Semantic Mapping with Convolutional Neural Networks

本文详细介绍了SemanticFusion论文,该方法将深度学习与SLAM结合,构建3D语义地图。通过CNN进行语义分割,使用条件随机场优化结果,达到实时性与准确性的平衡。尽管存在CNN预测延迟等问题,但其闭环检测和地图优化机制保证了语义一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 主要内容

最近开始看语义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系的结合物体识别模型?

相关资料

二、实现方法

整体流程分为三部分:

  1. ElasticFusion模块:实时计算帧间位姿关系,构建surfels表示的全局地图。
  2. CNN模块:输入RGBD图像,输出每个像素的类别概率。
  3. 贝叶斯更新模块(Bayesian update scheme):根据CNN的输出和SLAM提供的2D-3D点关联关系,更新全局地图中每个surfel的类别概率。
  4. CRF模块(CRF regularisation scheme):利用全局地图的几何信息,调整语义分割结果。

整个系统的流程是:RGBD相机接受输入,SLAM系统构建3D地图。每隔固定帧CNN运行一次,给地图更新语义信息。每隔另一个固定帧,CRF运行一次,调整语义分割结果。同时整个系统作用期间都运行闭环检测,若检测到闭环,就更新地图,同时保持语义信息的不变。

1. SLAM Mapping

ElasticFusion 主要完成了:

  1. 使用ICP进行位姿估计得到 T W C T_{WC} TWC,对RGB图像进行帧间匹配(?)。
  2. 每新来一帧,都优化map中的surfels。
  3. 同时运行闭环检测,若检测到闭环,则优化整个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

卷积神经网络(Convolutional Neural Networks, CNN)是一种专门用于处理网格状数据(例如图像)的深层学习架构。它们由卷积层、池化层、激活函数和全连接层组成。由于篇幅限制,这里我会提供一个简化版的Python示例,使用Keras库构建基本的CNN。假设我们想在一个MNIST手写数字数据集上训练一个简单的CNN。 ```python # 导入必要的库 from tensorflow.keras import layers, models import tensorflow as tf # 创建一个Sequential模型 model = models.Sequential() # 添加卷积层 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # 输入图像大小为28x28,单通道灰度图 model.add(layers.MaxPooling2D((2, 2))) # 下采样操作 # 可能添加更多的卷积层和池化层... model.add(layers.Flatten()) # 展平卷积层的输出以便于全连接层处理 model.add(layers.Dense(64, activation='relu')) # 全连接层 model.add(layers.Dropout(0.5)) # 防止过拟合 model.add(layers.Dense(10, activation='softmax')) # 输出层,10个类别对应0到9的手写数字 # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 加载MNIST数据并训练模型 (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) test_images = test_images.reshape((10000, 28, 28, 1)) model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels)) ``` 这只是一个基础示例,实际使用时还需要预处理数据、调整超参数和进行更复杂的架构设计。如果你想查看完整的代码实现,可以参考Keras官方文档或GitHub上的开源项目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值