PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
1. 做了啥?
- 设计了一个新的深度网络架构,适用于无序的三维点集
- 展示了这个网络在形状部分分割和语义理解任务中该如何训练
- 对网络的稳定性和效率性做了分析
- 说选定的神经元在网络中计算出的三维特征,并对其性能进行直观的解释
2. 怎么做的?
-
设计了一个深度学网络,这个网络直接使用三维点云(点集:n x 3, n个点每个点有三个属性x, y, z,表示空间座标)作为输入
-
对于分类任务:可以从三维模型中采样一个点云作为输入,也可以在实际场景中提前分割出来的点云;对于k个类别,网络会输出k个相对应的分数。
-
对于分割任务:输入:可以是单个对象,也可以是实际场景的子空间;输出:n x m的分数矩阵,表示每个点在m个类上的得分
-
对于每一个N×3的点云输入,网络先通过一个T-Net将其在空间上对齐(旋转到正面),再通过MLP将其映射到64维的空间上,再进行对齐,最后映射到1024维的空间上。这时对于每一个点,都有一个1024维的向量表征,而这样的向量表征对于一个3维的点云明显是冗余的,因此这个时候引入最大池化操作,将1024维所有通道上都只保留最大的那一个,这样得到的1×1024的向量就是N个点云的全局特征。
-
如果做的是分类的问题,直接将这个全局特征再进过MLP去输出每一类的概率即可;
-
但如果是分割问题,由于需要输出的是逐点的类别,因此其将全局特征拼接在了点云64维的逐点特征上,最后通过MLP,输出逐点的分类概率。
三维点云介绍:三维点云指欧氏空间中的点集,表示一种几何形状,主要有一下三个特性
- 无序性。与图像中的像素阵列不同的是,点云不需要点用特定顺序组成,这些点直接存储顺序是任意的
- 点之间的相互作用。这些来自与欧氏空间,点与点之间有距离关系,相邻的局部点组合成一个有意义的子集,表示三维模型的局部结构。故网络也需要能够捕获局部结构,以及局部结构之间的相互作用。
- 变换不变性。例如在旋转、平移下不应该改变点云形状
- T-Net对齐解决旋转平移不变性;升维后用对称函数解决无序性3维->64维->1024维;
- 遗留了一个问题:点与点之间的关系没有学到,所以在场景分割任务中效果一般。
pointnet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
1. 改进特征提取方法
pointnet++使用了分层抽取特征的思想,把每一次叫做set abstraction。分为三部分:采样层、分组层、特征提取层。首先来看采样层,为了从稠密的点云中抽取出一些相对较为重要的中心点,采用FPS(farthest point sampling)最远点采样法,这些点并不一定具有语义信息。当然也可以随机采样;然后是分组层,在上一层提取出的中心点的某个范围内寻找最近个k近邻点组成patch;特征提取层是将这k个点通过小型pointnet网络进行卷积和pooling得到的特征作为此中心点的特征,再送入下一个分层继续。这样每一层得到的中心点都是上一层中心点的子集,并且随着层数加深,中心点的个数越来越少,但是每一个中心点包含的信息越来越多。
2. 解决点云密度不同问题
由于采集时会出现采样密度不均的问题,所以通过固定范围选取的固定个数的近邻点是不合适的。pointnet++提出了两个解决方案。
- 如上图左所示,在每一个分组层都通过多个尺度(设置多个半径值) 来确定每一个组,并经过 pointnet提取特征之后将多个特征 concat 起来,得到新特征。
- 如上图右所示。左边特征向量是通过2个set abstraction后得到的,每次set abstraction的半径不一样。右边特征向量是直接对当前层中所有点进行pointnet卷积得到。并且,当点云密度不均时,可以通过判断当前patch的密度对左右两个特征向量给予不同权重。例如,当patch中密度很小,左边向量得到的信息就没有对所有patch中点提取的特征可信度更高,于是将右特征向量的权重提高。以此达到减少计算量的同时解决密度问题。
3.对采样密度的鲁棒性
可以发现,加上dropout(DP),本来他的作用是防止过拟合,但是如右图的结果显示DP对各个密度的数据都有更好的鲁棒性。