PointNet与PointNet++:基于深度学习的3D点云分类和分割模型

0 / 843

PointNet由斯坦福大学的Charles R. Qi等人在PointNet:Deep Learning on Point Sets for 3D Classification and Segmentation一文中提出。之后提出了2.0版本 PointNet++

github地址:

https://github.com/charlesq34/pointnet
https://github.com/charlesq34/pointnet2

这两个为tensorflow版本。

有第三方修改后的pytorch版本如下:

https://github.com/yanx27/Pointnet_Pointnet2_pytorch

点云具有三个特征:无序性、稀疏性、信息量有限
PointNet网络结构的灵感来自于欧式空间里的点云的特点。对于一个欧式空间里的点云,有三个主要特征:
无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果。
点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的结构和局部之间的交互。
变换不变性:比如点云整体的旋转和平移不应该影响它的分类或者分割

以往学者用深度学习方法在处理点云时,往往将其转换为特定视角下的深度图像或者体素(Voxel)等更为规整的格式以便于定义权重共享的卷积操作等。PointNet则允许我们直接输入点云进行处理。

输入输出

输入为三通道点云数据(x_i,y_i,z_i),也可以有额外的通道比如颜色、法向量等,输出整体的类别/每个点所处的部分/每个点的类别。对于目标分类任务,输出为k个分数,分别对应k个可能的类别。对于语义分割任务,输出n\times m个分数,分别对应n个点相对于m各类别的分数。

网络结构

网络结构

如图所示,分类网络对于输入的点云进行输入变换(input transform)和特征变换(feature transform),随后通过最大池化将特征整合在一起。分割网络则是分类网络的延伸,其将整体和局部特征连接在一起出入每个点的分数。图片中"mpl"代表"multi-layer perceptron"(多层感知机)。
其中,mlp是通过共享权重的卷积实现的,第一层卷积核大小是1x3(因为每个点的维度是xyz),之后的每一层卷积核大小都是1x1。即特征提取层只是把每个点连接起来而已。经过两个空间变换网络和两个mlp之后,对每一个点提取1024维特征,经过maxpool变成1x1024的全局特征。再经过一个mlp(代码中运用全连接)得到k个score。分类网络最后接的loss是softmax。

网络特点

针对无序输入的对称函数
为了让模型具有输入排列不变性(结果不受输入排列顺序的影响),一种思路是利用所有可能的排列顺序训练一个RNN。作者在这里采用的思路是使用一个对称函数,将n个向量变为一个新的、与输入顺序无关的向量。(例如,+\times是能处理两个输入的对称函数)。
将点云排序是一个可能的对称函数,不过作者在这里采用一个微型网络(T-Net)学习一个获得![3\times 3](http://aiqianji.oss-cn-shenzhen.aliyuncs.com/images/2021/06/17/4674117