PointNet是对点云数据直接进行学习的开山之作, 这里结合PointNet-Pytorch代码,对PointNet网络结构与其思想进行阐述和分析。
点云数据的特性:
点云数据不同于图像数据,他有三个重要的特征,也正是基于这些特征,才有PointNet网络的一系列的设计。
1)点云的无序性
这个要对比图像数据来理解,一团点云数据中有很多个点数据,这些点在点云文件里无论以什么顺序出现,它们指代的信息并不改变。相反,一张图片里的点在图像里已经按照固有的顺序排列好了。论文里利用了maxpooling这个对称函数来提取点云的数据特征。
2)点与点之间的空间关系
每个点都包含了空间坐标信息,这些信息之间构成一定的集合空间关系,为了利用这种关系,论文作者提出了将局部特征和全局特征进行串联的方式来聚合信息。
3)不变性
这样理解,一团点云数据进行旋转和平移,它代表的目标不会发生改变。论文在进行特征提取之前,先对点云数据进行对齐来保证不变性。 通过训练一个小型的网络得到一个旋转矩阵,用这个矩阵与点云数据相乘来实现对齐操作。
数据集
以论文里用到的数据集是shapenet, 包含了16类样本,以其中的一类Airplane的文件夹来说明,里面有很多.pts格式的文件,这就是不同飞机的点云格式,里面放的就是一个个坐标点,坐标经过了归一化处理。
在读取数据的dataloader里,对每个数据进行了中心化和随机增强,而且在输入网络前对样本进行了特定数量的重采样,这样保证了输入到网络里的样本的点数是一样的。
网络结构及其实现
1)对于一维卷积conv1d
假设对所有的样本进行了2500个点的重采样,样本的尺寸为2500*3,由于pytorch卷积的要求,输入前进行转置,变成3*2500,假定batch_size = 1, 输入尺寸就是1*3*2500,
假设做的第一步卷积操作是conv1 = torch.nn.Conv1d(3, 64, 1),即输入通道=3,输出通道=64,卷积核大的大小为1(在tensorflow里为1x3, 用conv2d实现,本质上是一样的),卷积核第二个维度是由in_channels来决定的,所以实际上卷积大小为in_channels*kerner_size,这里为3*1。
进一步理解一下,在第一个卷积层中,使用conv1对x进行卷积的时候,实际上是使用64个3*1的卷积核进行卷积,输出尺寸应该是1*64*2500,其中1还是batch size。
画了个草图来解释这个卷积过程
在了解了一维卷积之后,网络就变得很简单了。对于分类问题,如果把batch size记为n,样本在网络中的变化就是n*3*2500 ——> n*64*2500 ——> n*128*2500 ——> n*1024*2500 ——> n*1024*1(max pooling后) ——> n*512*1 ——> n*256*1 ——> n*16*1 (本次实验样本共有16类)
再来看网络结构:
mlp是通过共享权重的卷积实现的,第一层卷积核大小是1x3(因为每个点的维度是xyz),之后的每一层卷积核大小都是1x1。特征提取层只是把每个点连接起来而已。经过两个空间变换网络和两个mlp之后,对每一个点提取1024维特征,经过maxpool变成1x1024的全局特征。再经过一个mlp(代码中运用全连接)得到k个score。分类网络最后接的loss是softmax。
本文的两个亮点:
1.空间变换网络解决旋转问题:
三维的STN可以通过学习点云本身的位姿信息学习到一个最有利于网络进行分类或分割的DxD旋转矩阵(D代表特征维度,pointnet中D采用3和64)。其中的原理为,通过控制最后的loss来对变换矩阵进行调整,pointnet并不关心最后真正做了什么变换,只要有利于最后的结果都可以。
pointnet采用了两次STN,第一次input transform是对空间中点云进行调整,直观上理解是旋转出一个更有利于分类或分割的角度,比如把物体转到正面;第二次feature transform是对提取出的64维特征进行对齐,即在特征层面对点云进行变换。
2.maxpooling解决无序性问题:
当一个N×D在N的维度上随意的打乱之后,其表述的其实是同一个物体。因此针对点云的置换不变性(无序性),其设计的网络必须是一个对称的函数:
我们经常看到的SUM和MAX等函数其实都是对称函数
因此我们可以利用max函数设计一个很简单的点云网络,如下:
那么为什么要最后变换到1024维后再做MAX操作呢,这是因为在3维上,输出的全局特征仅仅继承了三个坐标轴上最大的那个特征,每个点损失的特征太多了,因此我们不妨先将点云上的每一个点映射到一个高维的空间(例如1024维),目的是使得再次做MAX操作,损失的信息不会那么多。
分割网络:
对于点云分割任务,我们需要将局部很全局信息结合起来。
这里,作者将经过特征变换后的信息称作局部信息,它们是与每一个点紧密相关的;我们将局部信息和全局信息简单地连接起来,就得到用于分割的全部信息。