PointNet系列
第一章 【论文阅读】PointNet论文解读
第二章 【论文阅读】PointNet++论文解读以及代码分析(超全)
文章目录
前言
上一篇文章主要介绍了点云处理的经典之作PointNet的整体思想和框架,本篇文章将介绍其团队基于PointNet改进的PointNet++。文章核心的一点就是提出了多层次特征提取结构。具体而言就是在输入点集中利用farthest point sampling选择一些点作为中心点,然后围绕每个中心点选择周围的点组成一个区域,将每个区域作为PointNet的一个输入样本,这样就得到了一组该区域的特征。之后中心点不变,扩大区域,把上一步得到的那些特征作为输入再送入PointNet,循环反复,不断提取局部特征,扩大局部范围,最后得到一组全局的特征,然后进行分类或者分割。文章还提出了多尺度方法解决样本中点云密度不均匀的问题,增加模型的鲁棒性。
PointNet++代码
1. PointNet的不足与PointNet++的解决方法
1.1 PointNet存在的问题
PointNet存在的一个缺点就是无法获取局部特征。在PointNet中,要不就是对单个点进行 1 × 1 1×1 1×1卷积操作,要不就是对所有点进行最大池化获得全局特征,虽然每个点都映射到了高维空间中,但还是丢失了很多局部信息,如下图:
从很多实验结果可以看出,PointNet对于场景的分割效果十分一般,所以提取局部区域特征就成了改进的一个方向。为了解决这一问题,PointNet++提出了首先选取一些比较重要的点作为每个局部区域的中心点,然后再中心点的周围选取k个近邻点,再将k个近邻点作为一个局部点云丢入PointNet中提取特征。
1.2 PointNet++采用的解决方法
为了解决PointNet网络无法提取局部特征的问题,在PointNet++中,作者借鉴了CNN的多层感受野的思想。首先,在整个点云的局部采样并划分为具有重叠的局部区域,在局部区域中通过PointNet提取局部特征,然后扩大范围,在这些局部特征的基础行提取更高层次的特征,直到提取整个点云集的全局特征,整个过程和CNN网络提取特征的过程类似。
2. PointNet++网络结构详解
2.1 改进特征提取方法
PointNet++在PointNet的基础上加入了多层次结构,使得网络能够在越来越大的区域上提供更高级别的特征,每一次提取就称为set abstraction,主要包括3个部分:Sampling layer, Grouping layer and PointNet layer。
- Sample layer:使用最远点采样法(FPS)对输入点进行采样,选出若干个中心点。FPS算法是随机选取一个点,然后选择离这个点最远的点加入到结果集中,迭代这个过程,直到结果集中点的数量达到某个给定值。
- Grouping layer :在上一层提取出的中心点的某个范围内寻找最近的k近邻点组成一个group。
- PointNet layer:将k个区域通过小型PointNet网络得到的特征作为k个中心点的特征。
上图展示了set abstraction的过程。每一组set abstraction得到的中心点的特征向量集,会作为下一组set abstration的子集,随着层数加深,中心点的个数会越来越少,但是每一个中心点包含的信息会越来越多。在msg中,第一层set abstraction取中心点512个,半径分别为0.1、0.2、0.4,每个圈内的最大点数为16,32,128。
每一组SA的输入是 N × ( d × C ) N×(d×C) N×(d×C),其中 N N N是输入点数量, d d d是坐标维度, C C C是特征维度;输出是 N ′ × ( d × C ′ ) N^{'}×(d×C^{'}) N′×(d×C′),其中 N ′ N^{'} N′是输出点数量, d d d是坐标维度不变, C ′ C^{'} C