PVCNN

解决的问题

高效处理3D点云需要把硬件考虑进去。一个是读取大小的影响,一个是随机访问(random memory accesses)的影响,随机访问会产生bank conficts增加计算的开销。 因此一个高效的3d学习模型,必须要减少内存的使用和内存的随机访问。由此论文提出了 Point-Voxel 的方式来实现高效又轻量化的点云深度学习。

基于voxel的方法:

将点云转换为规则的存储方式之后,模型的设计相对会变得简单(通过每个voxel确定的中心点,不需要设计动态的卷积核),可以通过堆叠三维卷积来设计模型,然后抽取输入点云的特征。 但是存在的缺陷就是对于高分辨率的特性的点云数据很难处理,由于内存的开销和分辨率会成一个立方的比例增长,但是使用很小的分辨率,在栅格化的过程中,许多点就被合并在一起,无法区分开,从而造成输入信息的丢失。 image

不同分辨率下的可识别点数量和内存消耗(batch size大小为16的训练时)。在单个GPU(拥有12gb内存)上,最大的可承受分辨率是64,这将导致42%的信息丢失(即不可区分的点)。为了保留90%以上的信息,需要将分辨率翻倍到128,消耗7.2× GPU内存(82.6 GB)。虽然GPU内存随着分辨率的立方增长,可区分点的数量有递减的回报。因此,基于体素的解决方案是不可伸缩的。

基于point的方法:

选择直接处理三维点云,可以有效的存储来节省内存的开销。 缺陷:点云具有不规则性,卷积操作变得比较困难 通常采用的方法使通过某一个点,查找他的临近点,然后在这些临近点上进行卷积,但是他们在内存上不一定是连续的存放的,比如第一个点的临近点是一段数据的中间的某一个点或者最后一个点,所以这个时候找到某个点最近的几个临近点就会产生很大开销,会引入许多的随机访问,而且临近点相对于中心点的坐标也不是固定的,所以我们需要对每个临近点的相对坐标来动态生成卷积核权重,这同样会带来一笔开销。主流模型(pointnet、pointcnn、DGcnn)他们会使用80%的时间 用来处理数据的不规则性而不是在有用的计算(提取特征)。 image

基于点的方法会有不规则内存访问和动态内核开销。

Pvcnn:(point-voxel convloution)

基于上述观点,建立point-voxel的方法,以点的形式进行数据的存储,以减少内存占用,以体素化形式进行3d卷积,提取点云的局和特征,以及避免处理点云的不规则、稀疏性带来的数据访问耗时。 image

将点云数据的整体结构和细节分成两个模块进行捕捉,使得两个部分都变的有效。也就是说提取两种方法的优点 点云分支:在这个分支对每个单独的点进行独立的变换(通过MLP得到每个点的单个的特征)。不需要提取临近点的信息,使得这个分支比较高效的实现,可以看成在二维神经网络的1X1 的卷积操作,非常高效但是无法不做临近的信息。 Voxel分支:先将点云转换为分辨率、较低的voxel,然后对voxel使用三维卷积,结束运算之后将voxel转回点云,在与点云分支合并在一起,在这里之所以选择较低的分辨率是因为在点云分支里保存的完整的点云,所以这里不需要担心信息的丢失,由于分辨率较低,voxel的分支也会变得非常高效。

方法:

1.标准化,不同点云的尺度可能存在显著差异。因此,在将点云转换为体积域之前,论文中将坐标{pk}归一化。首先,再将所有点转换成以重心为原点的局部坐标系。将点归一化到单位球中,然后将点缩放并平移到[0,1]。注意点特性{fk}在归一化过程中保持不变。将标准化坐标表示为{ˆpk}。作用:使数据能够得到快速的收敛。

2.体素化。

image

其中r表示体素分辨率,II[·]是坐标ˆpk是否属于体素网格(u,v,w)的二进制指示符,fk,c表示ˆpk对应的cth通道特征,Nu,v,w是归一化因子(即落在体素网格中的点的数量)。在这个公式中,体素分辨率r并不需要很大,体素化表示不会引入非常大的内存占用。

3.3D卷积提取聚合特征(通过BN层和非线性激活函数层)。

4.将体素转换回点云(三线性插值)。

处理结果

image

其中暖色代表权重较大,冷色代表权重较小,可以观察到在voxel分支更加关心密集点(较大的连续的部分)的信息,point分支更加关注稀疏点的信息。

image

ShapeNet数据集上,比pointcnn模型快了2.7倍,减少了1.5倍的内存占用 在实际应用的场景中,通常要达到20帧每秒的速度,pvcnn可以在轻量级的设备上达到要求。

image

S3DIS数据集上的结果

结论

论文提出了用于快速有效的3D深度学习的Point-Voxel CNN (PVCNN)。将两种方法的精华结合在一起,减少内存占用和不规则的内存访问。使用稀疏、不规则的点表示高效地表示3D输入数据,并在密集、规则的体素表示中高效地执行卷积。在多个任务上的大量实验一致地证明了PVCNN的有效性和效率。

阅读论文遇到的问题以及解决

1、如何voxel化和反voxel化?

2、标准化的作用是什么 加速数据的收敛

3、pvconv中低分辨率的体素对于局部特征提取是否会出现丢失?

4、三维卷积之后为什么要通过BN层和非线性激活函数? 一般通过的顺序是卷积层-BN层-激活函数层(Relu) 在通过卷积层之前,会对数据进行标准化加速数据的收敛,然后通过卷积层,通过卷积层计算之后之后,数据就不满足之前的分布了。通过BN层:由于数据通过深度网络之后出来的数据可能不服从标准分布,通过这里在进行标准化之后再输入非线性激活函数,避免数据出现梯度消失,落入激活函数的饱和区。

5、mean IOU和Latency Mean iou:计算所有的iou之后求平均值 Latency:完全执行一个指令所需的时钟周期

6、在PVCNN中增加体素的分辨率为什么会只占用很少的内存?