PointNet++理解

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. 解决密度变化对特征学习的影响

原文链接:PointNet、PointNet++原理解析

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学习笔记
在这里插入图片描述

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大田斗小木子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值