前段时间在做点云深度学习网络课题时,随手在博客“ModelNet40 中加入自己的数据集”中放了两串代码,目的是方便自己的存取(当时不会GIT的菜鸟)。结果成了所写博客中访问最多,提问最多的博文(瑟瑟发抖)。近段时间在恶补语言基础知识,索性换换脑,将这部分的知识进行一个相对完整的整理。希望对那些想快速入手点云深度学习,用来做课设、毕设的小朋友一点点帮助。以下都是个人的所学所思所想,不一定正确,仅做参考。也欢迎各路大神指出问题,将虚心改进。
一、组织架构
为了遵循博客简短干货原则,也为了更细致的描述及解决问题,我将该问题分成了3部分,分别如下:
-
点云深度学习之数据集处理(三)构建自己的点云数据集
二、需要考虑的三个问题
我们最终的目的是为了生成自己的小型数据集用于点云深度学习网络的训练。因此,要生成自己的数据,就要先了解标准的数据集。在我们通过深度传感器或者多视角立体匹配等方法得到一个物体的三维点云之后,实际上会去思考三个主要的问题:
1、点云的尺度不变性
如果我现在问你,上述的两架飞机点云是否一样。你的回答肯定是:一样的。对,单从形状上看,两架飞机一模一样,但实际上右侧飞机的每一个点的xyz值在左侧数据的基础上都扩大了十倍。这种感觉就好像图像中的房子在没有任何参考物的情况下,我们无法判断它的大小,它有可能是一个真实的,有可能只是一个模型。
如果使用过多视角立体匹配算法,就会非常注意得到的点云尺度总是不定的,往往这时,我们需要选择参考系计算尺度系数,再将得到的点云缩放到世界坐标系大小。因此,shapenet中的各种类型又有怎样的尺度?我们数据集又该怎样去规定尺度?
2、点云的旋转不变性
这个更容易理解,对于一个点云对其旋转一定角度之后,其每个点的xyz坐标都会发生改变,但是其形状保持不变(图略)。因此,shapenet中的数据角度又是怎样的分布?我们的数据集又该以什么角度摆放?
3、点云的排列不变性
不同于图片,每个像素都有相对固定的位置,至少局部区域的像素点位置是相对固定的,才能组成带有语义信息的图像内容。然而对于三维点云来说,打乱点的排列顺序与邻近关系,点表示的物体形状是不会发生改变。这也是点云深度学习相较于图像深度学习的难点所在。因此,shapenet中对点的排列顺序是否有要求?我们的数据集又该以什么样的方式排列?
因此,接下来我们将以上述三大问题为导向。先探究shapenet数据集的一些特性,然后再对构建我们自己的数据集得到一些方向性的结论。
二、ShapeNet数据集存在的特性
为了让我们的描述更具有说服力,本文对shapenet中的2048个shape进行了统计,每个shape有2048个点。
1、统计了2048个shape中所有的2048个点的xyz坐标的极值,结果如下:
X | Y | Z | |
---|---|---|---|
MAX | 0.999998 | 1.000000 | 0.998463 |
MIN | -0.999993 | -0.999998 | -0.999703 |
也就是说,shapenet的所有形状无论是飞机还是板凳,都被限定在了以原点为中心,边长为2的立方体范围内。那是否在立方体范围内,不同大小的物体例如飞机和板凳会有差别呢?因此做了第二件事:
2、统计了2048个shape中极值出现的频率,结果如下:
范围 | 0~0.1 | 0.1~0.2 | 0.2~0.3 | 0.3~0.4 | 0.4~0.5 | 0.5~0.6 | 0.6~0.7 | 0.7~0.8 | 0.8~0.9 | 0.9~1.0 |
---|---|---|---|---|---|---|---|---|---|---|
频次 | 0 | 0 | 0 | 0 | 0 | 1 | 82 | 424 | 506 | 1035 |
百分比 | 0 | 0 | 0 | 0 | 0 | 0.049% | 4.004% | 20.703% | 24.707% | 50.537% |
说明shapenet中相当大部分shape都是以最大尺寸占据边长为2的立方体范围内。因此我们可以认为,类别没有依据现实中的大小反映在数据集的尺度中。
3、可视化部分shape,结果如下:
图中,红线框为以原点为中心,边长为2的立方体,图中的坐标系代表X(红色),y(蓝色)和 z(绿色)方向。通过观察我们可以进一步得到以下几个结论:
- 形状的中心(重心)在原点处;
- 形状的摆放都很“正”,除了竖直方向,还体现在 x 方向,例如飞机中 x 轴(红色)就是沿着机身指向飞机头;
通过可视化,我们又进一步的认识到了shapenet的位置特性和旋转特性。目前为止,可以开始讨论最开始提出的三个问题了。
三、我们的数据集应该具有的特性
当然在得到任何结论之前必须要有条件,没有条件的结论往往是不成立的。因此这里我有必要再次强调下我们的目标数据集。
对于类似于斯坦福室内数据集(S3DIS)和激光点云室外数据集(KITTI)或者说大型的数据集,我们上述的讨论其实是没有意义的。对于大型数据集最好的办法就是保持其世界坐标系下的原始尺度,再用前面讨论过的方法进行裁剪和降采样。
这里讨论的是类似于CAD模型的小型数据集,例如我们现在想区分苹果,香蕉,菠萝,那就可以按照我们讨论的做。
1、对于尺度不变性
我们在生成我们自己的数据集时,应该首先进行平移和缩放。平移:就是将数据中心(重心)移动到原点,缩放:就是将数据限定在边长为2的立方体区域内,且尽可能大。
2、对于旋转不变性
我认为这一点对比于上一点不是特别重要。实际上在设计网络时,或多或少会去考虑到旋转不变性对网络的影响,甚至在进行数据训练的时候可能会有针对性的进行角度旋转扩充数据。但自己的数据集能够有方位标记,按照上述的想法固然更好。
题外话:实际上,在我阅读的点云深度学习论文和代码中,几乎没有看到有人将旋转,平移等数据增强手段放进网络的训练过程。我也没有做实验进行对比验证(有兴趣的小伙伴可以试试),我猜测分割精度有可能会下降。个人认为点在空间中的分布层次对于点云深度学习网络会有较大的影响。正如之前看到的一篇传统方法论文在不同高度对点云进行聚类实现了对复杂点云的分割。其次在一次偶然的对VKITT道路激光雷达点云分割结果进行分析时发现,某些被拦腰截断的房屋,容易被识别成为卡车,两者有很相似的高度分布。由于时间和科研进度等原因并没有再深入探究,说明现在的点云深度学习网络还有相当大的空间去进行提升。
3、对于旋转不变性
这一点对于上一点的必要性又降了很多,几乎可以不做考虑。因为我们在对网络进行训练的时候,对数据就是一种随机采样方式,而且排列顺序对特征的提取并没有影响,因为即使需要邻近点配合进行特征的抽取,也会选择L2距离等方式寻找邻近点。因此这一点可以放心省掉。
总结:分析了一通,也写了这么多,好像点云数据集的构建就只有两步必须(平移和缩放)加一步选择(旋转)。其实也就这回事,毕竟真正需要去考虑的如何利用好这些数据集为后面的任务或提升网络结构服务。
四、下篇预告
到目前为止,我们对小型数据集的构建方式似乎已经有所了解。主要是找到了相对清晰的目标。下一步就是如何利用代码批量实现上述的过程。因此在下一篇中,会介绍具体的测试用例和实现代码,最终实现构建自己点云数据集的目的。(本文中的相关代码和数据文件会随后在Github上发布,并在此更新)