体素化就是将点云分成在空间上均匀的体素格,然后生成3D点和它们对应的体素之间多对一的映射。
一、硬体素化
在VoxelNet中,体素化分为两个阶段,第一个阶段叫grouping——分组,第二个阶段叫sampling——采样。比如,给定一个点云,共N个点,将这N个点分配到一个K×T×F的缓冲区中,其中K是体素最大数量,T是每个体素中点的最大数量,F是每个点的特征维度。
在grouping分组阶段,每个点基于其空间坐标都会被分配到对应的体素中。由于会有许多点分配到一个体素中,超过了允许的固定的点容量T,那么就需要sampling采样阶段在每个体素中下采样T个点。
类似地,如果点云产生的体素个数超过了固定的体素容量K,体素也会被下采样。
如果体素数量和体素中点的数量都没有超过固定的容量,缓冲区中未使用的部分就用0填充。
硬体素化HV有三个限制:
- 由于点和体素数超过了容量后会被丢弃,硬体素化HV迫使模型丢掉可能对检测有用的信息;
- 随即丢弃的点和体素可能也会导致不确定的体素嵌入,结果是导致检测结果的不稳定和抖动;
- 填充的体素会消耗不必要的计算,阻碍运行时间的性能。
硬体素化在点/体素覆盖和高效的内存使用之间达到平衡是很有挑战的。
硬编码的简单体素特征提取,即将一个体素中的所有点简单地进行求取平均值的操作,得到的结果作为这一个体素的特征向量。这是最简单的体素特征编码器。
二、动态体素化
动态体素化DV克服了硬体素化HV的一些缺点。动态体素化DV保留了分组grouping阶段,相反,它没有采样固定的点数或体素容量,它保留了点和体素之间的完全映射。因此,体素数和每个体素中的点数都是动态的,依赖于具体的映射函数。这消除了对固定大小缓冲区的需求,也消除了对随机点和体素的丢弃过程。
因为所有原始点和体素信息都被保留了,动态体素化DV没有引入信息丢失,并产生了确定的体素嵌入,使得检测结果更稳定。
另外,动态体素化建立了每一个点和体素对之间的双向关系,为从不同视图融合点级上下文特征提供了自然基础。
动态体素化DV动态高效分配资源来管理所有体素和点。
简单的动态体素特征编码,也是简单地对体素中所有点的特征向量进行平均值运算作为整个体素的特征,只不过每个体素中的点个数是动态的,每个体素都不同。
在体素化完成后,就可以将激光雷达点通过特征编码方法转换到高维度空间。