pointnet++学习记录
文章目录
- PointNet++需要解决两个关键的问题:
第一,如何将点集划分为不同的区域
第二,如何利用特征提取器获取不同区域的局部特征。 - 作者使用了PointNet作为特征提取器
- 使用邻域球来定义分区,每个区域可以通过中心坐标和半径来确定。中心坐标的选取
- 作者使用了最远点采样算法算法来实现(farthest point sampling (FPS) algorithm)。
一、PointNet++网络结构
最为核心的结构——分层次的点集抽象层(Hierarchical Set Abstraction)
所谓的分层,也就是使用多个 SA (Set Abstraction)模块进行特征提取,差别在于每一个 SA 模块的采样点数量(K)和采样半径(R)不一样。随着层次加深,K 和 R 会随之增大。
SA 模块是该论文最为核心的部分,它包含三个关键层:Sampling Layer,Grouping Layer,PointNet Layer。
1. Sample Layer
通过最远点采样算法(Furthest Point Sample,FPS),在输入点集中均匀采样固定数量的点,记为 C。具体选择多少个中心点,数量怎么确定,可以看做是超参数视数据规模来定。
FPS算法原理为:
从点云中选取第一个点A作为查询点,从剩余点中,选取一个距离最远的点B;
以取出来的点A,B作为查询点,从剩余点中,取距离最远的点C。此时,由于已经取出来的点的个数超过1,需要同时考虑所有查询点(A,B)。方法如下:
对于剩余点中的任意一个点P,计算该点P到已经选中的点集中所有点(A, B)的距离;取与点A和B的距离最小值作为该点到已选点集的距离d;
计算出每个剩余点到点集的距离后,选取距离最大的那个点,即为点C。 重复第2步,一直采样到N’个点为止。
原文链接:https://blog.csdn.net/cg129054036/article/details/105545895
2. Grouping Layer
这一层使用Ball query方法对sample layers采样的点生成N’个对应的局部区域。
这里使用到两个超参数 ,一个是每个区域中点的数量K,另一个是query的半径r。这里半径应该是占主导的,在某个半径的球内找点,点的数量上限是K。球的半径和每个区域中点的数量都是超参数。
以点集 C 中的点作为中心点,在一定半径 R 内,取出 K
个点,此时完成了对输入点集的单尺度局部邻域划分。那么输入点集就被划为为空间上很多个相互重叠的球邻域,每一个球邻域就是一个局部点集。输出的形状为
B × N × K × 3 ,其中 B 是输入的 batch,N 为中心点的数量,K 是每一个邻域球中点的数量,3表示x,y,z通道的坐标。
原文链接:https://blog.csdn.net/kxh123456/article/details/121105666
3. PointNet Layer
PointNet 用于提取局部邻域的点集特征,没有特别复杂的结构
在这一层,输入为 N ′ 个局部邻域点集,大小为N ′ × K × ( d + C ) 。每一个局部邻域的输出是被其中心和局部特征(编码了中心的局部邻域特征)抽象,输出大小为N ′ × ( d + C ′ )
在输入到网络之前,会把该区域中的点变成围绕中心点的相对坐标。
原文链接:https://blog.csdn.net/kxh123456/article/details/121105666
4. 解决密度变化对特征学习的影响
Multi-scale grouping (MSG):
每个尺度使用PointNet,然后将多尺度特征融合到一起。但是计算量比较大。
Multi-resolution grouping (MRG):
MRG特征由两个向量组成,左边的使用区域抽象层汇总每个子区域的特征,右边的使用PointNet直接处理所有原始点数据。当局部区域密度低时,左边的特征不如右边的可靠,因为它包含更加稀疏的点,并且更多收到了采样的影响。
另一方面,当时局部区域密度高时,左边的向量提供了更精细的细节信息,因为它具有在较低层次递归地检查更高分辨率的能力。
二、分割网络细节
原文链接:https://zhuanlan.zhihu.com/p/266324173
经过前半部分的encoder,我们得到的是global feature,或者是极少数点的表征(其实也就是global feature),而如果做分割,我们需要的是point-wise feature。
PointNet++设计了一种反向插值的方法来实现上采样的decoder结构,通过反向插值和skip connection来获得discriminative point-wise feature:
1. 反向插值具体做法
对于 P2 中的每个点 ,找在原始点云坐标空间下,P1 中与其最接近的k 个点x1,x2,…,xk
实际上就是将x1,…,xk的特征加权求和,得到x的特征。其中这个权重是与x和x1,…,xk的距离成反向相关的,意思就是距离越远的点,对x特征的贡献程度越小
2. skip connection具体做法
反向插值只得到了 C2 ,但是我们还需要提供local级别信息的C1 特征
skip connection其实就是将之前encoder对应层的表征直接拼接了过来
上图中encoder蓝色矩形点集的C1表征是来自于规模更大的绿色矩形点集的表征,这在一定程度上其实是实现了local级别的信息
我们通过反向插值和skip connection在decoder中逐级上采样得到local + global point-wise feature,得到了discriminative feature,应用于分割任务。
三、源码结构与功能展示
原文链接:pointne2学习笔记