PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
本人菜鸟一枚,之前看过不少有关点云目标检测的论文,最近准备重读一下,并且做好笔记,方便后续复习,也给大家的学习提供一个参考,共同学习!
基于激光点云目标检测的论文主要有基于点的PointNet,基于体素的VoxelNet和基于柱的PointPillars等。今天准备阅读PointNet,这也是第一个能够直接处理点云的深度学习模型。
其实总结下来,深度学习的任务也就是提取特征,然后利用特征做分类、检测或者分割。其中提取特征又是重中之重。
这篇文章把点云看做是无序点的集合,而不是有序的体素或柱,基于点云已知的特征利用shared-MLP进行扩充升维,然后再进行Maxpool实现特征汇聚,这样就能获取较多维度的特征来表示整个点云,进而进行后续的工作。下面是具体介绍,主要是对提取特征的过程的理解。
上面图中从input points一直到global feature是核心。但细看发现也就两次transform和MLP穿插,最后来一次maxpool。
其中,transform模块的作用是对点云的坐标和特征向量进行变换,使得点云在不同的方向、比例和位置等因素下都能被准确识别和分类,以提高模型的鲁棒性和泛化能力。
所谓的shared MLP呢实际上就是相同权重的多层感知机,也可以理解成全连接网络,就是一个Linear串BN串ReLu,把已有的特征通过非线性变换映射到更高的维度,起到了对原始维度扩充升维的作用。只不过以相同的权重对所有的点都做一遍,所以叫shared MLP,所有点share同一个weight。对于这个模块我的理解是特征增强,原始的特征维度太低,描述信息太少,提取之后很难做后续的任务,而扩充维度之后相当于增加了描述信息,提高模型的表达能力和分类精度。
经过上述步骤之后,现在每一个点都有1024维度的特征,从所有点里横向选出1024维特征,这组特征就可以用来表示全局的整体特征。也就是global feature。
其实总结以上说的内容,也就是因为对原始点云提取特征太少了,于是扩充维度,然后利用池化来汇聚特征,把提取的特征用于表征全局。实际上细心地同学从这里也可以看出pointnet的缺点了,只提取了全局的特征,似乎没有局部特征,正是这一问题,才有了后续的PointNet++。
也就是这么一个原理,被广泛应用于各个点云目标检测算法中,包括大家熟知的VoxelNet和PointPillars。Voxel实际上就是在一个voxel中用PointNet提取出全局特征,这里的全局实际上是一个体素的局部,然后把这个特征堆(stack)在每个点的特征后面,共同组成体素的特征。然后以体素为单位做三维卷积
而PointPillars是在一个柱子里用PointNet,把提取的特征用于表征该柱子的特征。然后每个柱子看做一个像素,特征维度看做通道数,就把点云变成图像了,后面就可以用二维卷积了。