第一个直接基于原始点云数据进行分割、分类的模型,之前都是基于多视图或者体素的方式。
- 论文:
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation - 代码:
TensorFlow版
Pytorch版
基本模型架构:
分别对每个点进行特征提取(卷积或者全连接),再MAX得到全局特征进行输出
基于以下Properties of Point Sets in Rn(Rn中点集特性)
-
无序(Unordered):换句话说,一个处理N个3D点集的网络需要对N!个输入集数据馈送顺序的排列(permutations)保持不变
-
点之间的相互作用(Interaction among points)。 这些点来自具有距离度量(distance metric)的空间。这意味着点不是孤立的,并且相邻点形成一个有意义的子集。因此,模型需要能够从附近的点捕捉局部结构,以及局部结构之间的组合相互作用。
-
变换下的不变性(Invariance under transformations)。作为一个几何对象,点集的学习表示应该对某些变换是不变的。例如,旋转和平移点都不应该修改全局点云类别,也不应该修改点的分割。
PointNet Architecture
其中分类网络和分割网络共享大部分结构
网络具有三个关键模块:
-
最大池化层作为一个对称函数来聚合来自所有点的信息
-
一个局部和全局信息组合结构
-
两个对齐输入点和点特征的联合对齐网络(joint alignment networks)
T-Net
PointNet采用了两次STN(Spatial Transformer Network)
- 第一次input transform是对空间中点云进行调整,直观上理解是旋转出一个更有利于分类或分割的角度,比如把物体转到正面
- 第二次feature transform是对提取出的64维特征进行对齐,即在特征层面对点云进行变换
应用:
- 对象分类(obejct classification)
- 部分分割(part segmentation)
- 场景语义解析(scene semantic parsing)
总结(个人理解)
- 本文最大的贡献使用max pool对称函数解决了点云的无序性问题,也就是针对以上提到的点集特性第一点,创建了第一个直接基于原始点云的分类、分割模型。
- 本文中的两次T-Net 从理解上是用于调整点云和特征姿态,针对点集特性第三点,但是效果好像不太明显。
- 本文的点云语义分割只是聚合了单个点的特征和整个点云的全局特征,其实并没有利用到局部特征,也就是点集特性第二点,不过紧接着作者又提出了PointNet++来针对此点进行改进。