【深度学习系列】Voxnet论文学习阅读笔记 及代码相关

时间:2024-03-31 12:25:40


实验室研究的是点云相关,分给我的任务是激光点云的目标识别,所以之前也读了不少论文,这些阅读笔记都是之前写的,可以用来提炼重点,记录下重要的东西,那就先从Voxvet这一篇发吧。

论文相关

(这一部分中文本都是对论文原文或者对其的概括,括号内是我的批注)

1 Abstract & Introduction

现有的传统方法:基本都是通过手工设计的特征的提取和聚合,然后将其输入到分类器中。缺点:传统方法对3D点云信息利用很不充分,并且难以有效处理大量点云数据。Voxnet将点云表示为体积占用网格,然后用3D卷积神经网络来进行监督学习。所用数据包含LiDAR点云,RGBD点云和CAD模型。效果可以达到每秒标记数百个实例,准确性很好。

2 Approach

输入是通过分割算法或者“sliding box”获得的点云段(意味着提前需要做预处理?),最终希望能预测该段的对象类标签。
整个系统可以被分为两部分:1.Volumetric Occupancy Grid,用来表示对空间占用的估计;2. 3D CNN,用来预测类别。

2.1 Volumetric Occupancy Grid

占用网格能将环境状态表示为随机变量的3D网格,并根据传入的传感器数据和先验知识保持其占用率的概率估计。
使用占用网格的主要原因:1.它们使我们能够从距离测量中有效地估计空闲空间,占用空间和位置空间,比仅考虑占用与否得到的信息更加丰富,因为空闲与未知空间之间的区别可能也很有价值;2.可以通过简单有效的数据结构进行存储和操作。

2.1.1占用模型

考虑了三种不同占用网格模型来估计占用率:

  1. Binary occupancy grid 假定每个体素都处于二元状态,已占用或未占用。每个体素的占用率概率估计值采用对数概率进行计算。
  2. Density grid 在该模型中,假设每个体素具有连续的密度,对应于体素会阻挡传感器光束的概率。一般用这个模型作为网络的输入。
  3. Hit grid 该模型只考虑命中与否,忽略了空闲空间和未知空间的区别。(Binary occpancy grid不也是只考虑是否占用吗?难道不会忽略空闲空间和未知空间的区别?)但是在voxnet中,这个模型的表现很不错。此外,这个模型不需要光线追踪,它不需要光线跟踪,这在计算上受限制的情况下很有用。
    (论文里对如何将点云表示为被占用网格的体素的描述不多,有点模糊,我没太理解,看了些相关论文后还是有一些疑问,这一部分的代码也有很多没看懂的地方,之后用调试再看看吧)

2.1.2分辨率

对Lidar数据集,使用固定的空间分辨率为0.1×0.1×0.1的体素。(保持各种物体的相对比例)
对其他数据集,选择分辨率使目标对象占据24×24×24体素的子体积。(避免因目标大于网格丢失形状信息或目标较小而丢失细节)
在所有实验中,使用大小为32×32×32体素的固定占用栅格。

2.2 3D Convolutional Neural Networks

Voxnet中的卷积神经网络包含一个输入层,两个卷积层,一个池化层和两个全连接层。图1是我自己绘制的voxnet中的3D CNN结构图。

【深度学习系列】Voxnet论文学习阅读笔记 及代码相关
图1 voxnet中的3D CNN结构图

2.2.1 Layers

输入层:输入为32×32×32 体素的固定大小的网格,输入的值来源于之前提到的三种占用模型,按计算公式将输入调整为在(-1,1)范围内,之后无需进行进一步的预处理。
卷积层:输入是四维的,其中三维是lidar点云包含的空间信息,第四维包含feature maps(作为刚接触这个领域的初学者,最开始不太清楚feature maps是什么,直觉上感觉feature maps指的应该就是吴恩达深度学习课程里的number of channels ,这样比较说得通)。有两个卷积层,第一个卷积层是里的filter有32个,尺寸是5×5×5,步长为2,通道数和上层一致,第二层里filter也是32个,尺寸为3×3×3,步长为1,通道数和上层一致。两个卷积层使用的**函数相同,都是参数为0.1的Leaky ReLU。
池化层:采用Max pooling,filter设置为2×2×2的尺寸,步长为2.
全连接层:两个全连接层,第一个含有128个单元,第二个全连接层含有K个单元,K为需要区分的种类数量。

2.2.2结构

Voxnet中3D卷积神经网络的结构是从上百个CNN架构中随机搜索,经过比较而选择的,因为其参数与其他结构相比更少,形式也比较简洁。

代码相关

Voxnet的github上推荐第一次复现代码使用ModelNet 10 Dataset作为其数据集,下载ModelNet 10 Dataset,发现其中的数据以.mat格式存储,通过scripts目录下的convert_shapenet10.py将其转换为.npy文件及.tar文件,使python处理起来更简单高效。
config下的shapenet10.py将与训练相关的模型架构和超参数存储为Python代码。train.py动态加载此代码,编译Theano模型,并开始使用之前处理好的数据进行训练。训练开始后,weights.npz会定时保存训练得到的权重。
scripts下的train_reports.py可以在训练时直观地观察进度。test.py使用与train.py相同的模型,但仅用于对测试集中的实例进行分类,并且可以选择将预测保存在.npz文件中。augmentation.py是对数据进行旋转增强,max_pool_3d.py对池化层进行设置,layers.py是对CNN网络里其他各层的设置。