Pointnet和Pointnet++

原文链接:https://blog.csdn.net/m0_47294706/article/details/135895830

论文介绍地址(Paper,Code,Presentation video and Slides)
PointNet:https://web.stanford.edu/~rqi/pointnet/
PointNet++:https://web.stanford.edu/~rqi/pointnet2/
建议直接看b站的5分钟讲解。

【[5分钟点云学习] #01 最远点采样 FPS】 https://www.bilibili.com/video/BV1oT411x7TH/?share_source=copy_web&vd_source=bd967f0d540a64617b8b612bc0f0f9a3

一、PointNet & PointNet++:问题陈述(Problem Statement)

  1. 由于点云的无序性,直接操作点云比较困难 - PointNet解决(使用具有置换不变性的对称函数)

[视频链接:5分钟点云学习] #02 PointNet 开山之作

  1. 点云密度不均匀问题 - PointNet++解决

二、方法(Method)

2.1 PointNet:通用连续集函数逼近器(Universal Continuous Set Function Approximator)

方案1: 将输入排序为规范顺序
要求该图在维度减小时保持空间邻近性,一般难以实现,且效果不好

方案2: 将输入视为序列来训练 RNN,但通过各种排列来扩充训练数据
元素数量扩展到数千个输入元素(常规点云数量)难以确保鲁棒性

方案3: 使用对称函数
对于在xiRdx_i\in\mathbb{R}^d的无序点云数据$ {x_1,x_2,…,x_n}$,可以定义一组函数 f:XRf:\mathcal{X}\to\mathbb{R},将点云映射到向量上:上:
$ f\left(x_1, x_2, \ldots, x_n\right)=\gamma\left(\operatorname{MAX}_{i=1, \ldots, n}\left{h\left(x_i\right)\right}\right),$
其中 γ 和 h 通常是MLP网络。
这些函数称为对称函数,除了可以取最大值,取最小值、平均值的操作也可以看作对称函数。

假设处理的点不止五个,而是n个MLP从3维到64维再到1024维,则对于这个1024维使用max pooling得到全局特征,如果是分类任务则直接对点云物体分类。原版的pointnet在mlp之前使用了T-Net,增加了一个变换矩阵的学习,用来提升网络对点云刚性变换的泛化能力,但这个模块作用不大。需要对每个点进行预测,则像下图,对全局特征进行复制,在第一个MLP后的单个点特征拼接起来,再进行预测。

image-20241226095430777

2.2 分层点集特征学习(Hierarchical Point Set Feature Learning) - PointNet++

构建点的分层分组,并沿着层次结构逐步抽象出越来越大的局部区域网络结构。

由于每个点重要性并不相同,pointnet对局部特征,细粒度特征并不感冒。Pointnet++让网络更关心局部点云。

集合抽象层(set abstraction layer)

采样层(sampling):从输入点中选择一组局部区域质心点

分组层(grouping):通过查找质心周围的“相邻”点来构造 局部区域集(质心+“相邻”点)

PointNet层:使用mini-PointNet将局部区域模式编码为特征向量

数据维数的变化(不考虑BatchSize):
N × (d + C) -> 集合抽象层 -> N’ × (d +C’)

  • N:采样点的个数, 4096
  • d:坐标信息,xyz(xy去中心化,绕z轴随机旋转),故为 3
  • C:特征数量(xyz(xy去中心化,绕z轴随机旋转) + RGB(=/255, 0-1) + xyz(=/max, 0-1), 3+3+3 = 9)1
  • N’:子采样点的个数,由sample_and_group函数参数决定,1024
  • C’:总结局部上下文的新特征数,由MLP的输出通道数决定,64

采样层(sampling layer)
给定N = 4096个点 $ {x_{1},x_{2},…,x_{n}}$,使用迭代最远点采样(farthest point sampling, FPS)选出N’ = 1024个采样点(质心) {xi1,xi2,...,xim}\{x_{i_1},x_{i_2},...,x_{i_m}\},使得$x_{i_j} 是和其他点是和其他点{x_{i_1},x_{i_2},…,x_{i_{j-1}}}$距离最远的点。

[视频链接:5分钟点云学习] #01 最远点采样 FPS

分组层(grouping layer)

输入:

  • 点集:N × (d +C) 和质心集坐标:N’ × d

输出:

  • 点集组:N’ × K × (d + C) ,其中“K”为质心点邻域中的点数

有两种分组策略:

kNN:取每个质心点最近的K个点
球查询(ball query):在给定半径范围内取K个点(按序号从小到大排前K个),其局部邻域保证了固定的区域尺度,从而使局部区域特征在空间上更具泛化性
论文中主要使用了
基于半径的球查询
。在这里,作者还实验了基于kNN的邻域搜索,并使用不同的搜索半径和k。在这个实验中,所有的训练和测试都是在具有均匀采样密度的ModelNet40分类任务数据集上进行的。使用1024个点。

PointNet层(PointNet layer)

输入:

  • 采样分组后的点集组:N’ × K × (d + C)

输出:

  • 经过PointNet层提取特征后的点集组:N’ × (d + C’)
  1. 先将局部区域中的点的坐标转换为相对于质心点的局部坐标系(即采样分组后的点集组减去质心坐标)
1
grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C)
  1. 经过多层MLP
1
2
3
for i, conv in enumerate(self.mlp_convs):
bn = self.mlp_bns[i]
new_points = F.relu(bn(conv(new_points)))
  1. 对特征进行最大池化
1
new_points = torch.max(new_points, 2)[0]

用于集合分割的点特征传播(Point Feature Propagation for Set Segmentation)

Pointnet在对于分割时候需要恢复所有点的特征。全部采样会花很多时间。

文中提出使用点特征传播(Point Feature Propagation)的方式,基于距离的插值跨级跳跃链接的分层传播策略。

如要将点特征从Nl×(d+CN_{l}\times(d+C点传播到 Nl1N_{l-1} 点,其中 $ N_{l-1}$和 NlN_l(其中$ N_{l}\leq N_{l-1}$通过在 Nl1N_{l-1} 点的坐标处插值 NlN_l 点的特征值 f 来实现特征传播:

其中,f 为特征值, p = 2,k = 3。

如此基于距离的倒数对特征进行加权拟合,恢复出未被采样到点的特征。层层恢复回去,最终得到每个点的特征以及语义信息。

连接的特征通过单位点网(unit pointnet),类似于 CNN 中的1x1卷积。应用一些共享的全连接层和 ReLU 层来更新每个点的特征向量。重复该过程,直到将特征传播到原始点集。

image-20241226101722052

多尺度分组和多分辨率分组(MSG & MRG)

点集在不同区域的密度不均匀是很常见的。这种不均匀性给点集特征学习带来了重大挑战。在密集数据中学习的特征可能无法推广到稀疏采样区域。因此,针对稀疏点云训练的模型可能无法识别细粒度的局部结构。
为解决这一问题,文章提出了密度自适应 PointNet 层。

  • 多尺度分组(Multi-scale grouping, MSG)
    在每个质心点的大规模邻域中运行本地 PointNet,时间成本高
  • 多分辨率分组(Multi-resolution grouping, MRG)
    在计算上更加高效,因为避免了在最低级别的大规模邻域中进行特征提取

网络结构

结论

PointNet不仅提供了一种点云特征提取的方法,还提供了一种点云分析的框架。

  • 点云下采样
  • 局部领域查询
  • 编码模块
  • 上采样插值
  • 解码模块

这五个部分构建出有效的点云分析框架,且改进空间巨大。后续改进工作如下:

PointWeb

将局部领域内的点集显式地建模为一个稠密的图结构,提取一种afa的模块。来提取图结构中的蕴含的点特征。

RandLA-Net

将最远点采样替换为随机采样,大大加快了运行速度,并且提出了一种更加复杂的局部特征编码模块,来弥补随机采样过程中损失的几何细节。

RepSurf

使用了一种散装的曲面弥合方法,将法向量和曲率加入到PointNet++网络模型的输入,也可提高点云特征提取的能力。