点云常用数据集:
- ModelNet40:可以用来训练分类(classification)。训练集有9843个点云、测试集有2468个点云。有40个类。
- ShapeNet:可以用来训练零件分割(part segmentation)。训练集有14007个点云,测试集有2874个点云。
- RueMonge2014:可以用来训练室外场景的语义分割(semantic segmentation)。里面包含7个类:window, wall, balcony, door, roof, sky, shop。
- ScanNet:可以用来训练室内场景的语义分割(semantic segmentation)。训练集有1513个训练场景,100个测试场景。
- S3DIS:Stanford large-scale 3D Indoor Spaces dataset。可以用来训练语义分割(semantic segmentation)。其中分为6个area,每个area内有若干个场景。
点云中的个数:
downsample
如果下载的数据集里面,每个点云有固定的数量(例如:1024、2048),基本可以满足要求了。如果点云比较大,用十万、百万个点,一般要进行一些采样操作。一般采用VoxelGrid来采样。Matlab中对应的是gridaverage pcdownsample:
ptCloudOut
里面的逻辑大概为:将三维空间按照指定步长 (gridStep),划分为一个三维网格(grid),每个grid内的点,最后取均值,得出一个点。需要注意的是:有些grid内可能没有点,所以,downsample后,点的个数,一般小于grid的个数。
例如:S3DIS数据集,一般会用pcdownsample来采样。
选子区域
下采样后,点云如果还是很大,可以进一步在xy坐标系下,按照一定的规则,将一个点云分割为若干个小的点云。每个子区域,一般会再额外扩大一点,扩大的空间范围内包含的点,作为context points参与训练,但是context points不参与计算loss。
统一点数
作为模型的输入,一般是希望每个点云中点的数量是相同的。采样、选子区域后,不能保证每个点的数量完全一样。假设希望最后每个点云有NUM_POINT=2048个点,当前点云中的点数为num,
当采样后点数小于2048时,可以使用:
np
当采样后点数大于2048时,可以使用:
np.random.choice(num, NUM_POINT, replace=False)
3. 如何划分train/val/test ?
目前,基本只划分为train、test两个集合。具体划分方式,一般参考“惯例”来划分,即:前面的一些经典论文怎么划分,跟它采用一样的方式即可。
例如,对于S3DIS数据集,里面有6个area,选其中一个area包含的所有点云作为test集,其它5个area作为train集。这样,可以得到6组train、test数据集。实际上,一般选第5个area作为test集,其它5个area作为train集。
如何归一化?
xyz坐标:
- 在3d空间中找一个能包含所有点的最小的立方体,立方体的三条边与xyz轴平行。找到这个立方体的下表面的中心点,以这个点作为归一化的参考点。所有点的坐标,减去参考点的坐标。
- 可以进一步将x、y、z归一化到[-1, 1]之间。
第1步一般是必须的,效果会很明显。第2步是否有效果,需要通过实验来验证。
颜色值:
一般归一化到[-1, 1]之间。
5. 如何shuffle?
有以下两种方式:
- 一个batch内,点云的顺序,shuffle
- 一个点云内,点的顺序,shuffle
6. 数据增强(augmentation)
Data augmentation可以增强模型的范化能力。一般的方式有:
- 一个batch内,选一定比例的点云,绕z轴随机旋转(0 - 360)度
- 一个batch内,选一定比例的点云,分别绕x、y、z随机旋转一个小的角度,比如20度左右
- 一个batch内,所有点进行随机抖动(jitter)