描述3D物理世界的几种方式
- 体素结构
可以看成一个一个的立方体格子搭建起来的3D世界,比如《我的世界》游戏中,所有的物体包括建筑物、树木、人物、锤子等都是由一个一个的小立方格子按照一定的方式组合起来的。与图像类似,4k的分辨率看起来会比2k的分辨率要清晰很多,如果这个最小的小立方格子太大,就会让人感觉画面非常粗糙,很多细节丢失。 - multi-view
- mesh
- pointcloud
单层级特征学习组件
pointNet++的特征学习由以下几个步骤组成:采样,分组,对每组利用pointNet网络提取特征。
采样
问题:假设由n个点,需要从这n个点中提出m个点,使得这m个点彼此之间相距尽可能远。
方法:
随机选择一个点作为初始点放入集合C中
while len(C) < m:
遍历所有点,找到离集合中所有点最远的一个点,加入集合中。
分组
问题:对于集合C中的每一个点,需要找到最近的K个点以便后面pointNet能学习到以这个点为中的周围局部的特征。
方法:
- KNN
使用欧式距离找到离这个点最近的K个点。 - 球体寻找
固定一个半径,得到一个以这个点为中心的球体,把球体内的所有的点视为这个点的近邻。这样得到的近邻数量会不一致。但是不影响其作为pointNet的输入。
PointNet提取特征
将每一个组(共m个)都输入到PointNet中去,得到m个特征(m个向量)。输入进PointNet之前,需要先将每个组的坐标做个小变换:将原点都变成采样步骤中得到的那个点。
小结
总而言之,经过这个部分的操作后,输入为n*d
的张量,输出为m*d'
的张量,其中,m<n,d'>d
。
在不同的点云的采样密度下进行鲁棒的特征学习
问题:我们的模型需要对不同密度的点云具有足够的泛化能力。由于采集设备的差异,我们得到的点云数据会具有不同的密度。比如,对同一个目标,64线的激光雷达采集到的点一定要比128线激光雷达采集到的点要稀疏。
方法:
- Multi-Scale grouping(MSG)
一个简单的方式是对于输入的点云中的每个点(实际上是部分点,比如95%的点,这样防止得到空的点集),都以一定的概率 t h e t a theta theta舍去。这样因 t h e t a theta theta的不同,就会得到不同密度的点云。对不同密度的点云都是用上面提及的单层级特征学习组件提取特征,再做concat,这样通过反向传播就可以学习对不同密度的点云具有鲁棒性的特征。
由于这种方式相当于是重复进行好几次特征提取操作,因此比较耗时。从后面的实验效果来看,这种方式比下一种准确率更好一些。 - Multi-resolution grouping(MRG)
对于输入为n*d
的点云,使用单层级特征学习组件提取特征得到m*d'
的张量1,对于这个张量1,再次使用特征学习组件提取特征,得到q*d_2
的张量2,其中n>m>q,d<d'<d_2
。张量1和张量2就分别代表不同密度的点云提取到的特征向量。然后将这两个向量concat起来,当然,由于尺度不一样,需要对张量2进行上采样,变成m*d_2
,再做concat。
点云分割
点云分割实际上就是给点云中的每一个点分配一个类别(一个向量,向量中最大值所对应的类别即为点的类别)。因此,类似二维图像中的FCN网络,这里插值操作进行上采样。这样,经过两次上采样操作和concat操作后,就会得到n*(d'+d_2)
的张量,再用一个1*1卷积得到n*K
的张量,这里K指类别。
总结
相比于pointnet,pointnet++的主要贡献可以分为两部分:
- 通过采样+分组+pointnet组合方式提取全局特征和局部特征,得到了更加鲁棒的特征表达。
- 考虑了不同密度的点云的分割,并设计了两种有效的解决方式MSG和MRG。