基于深度学习的3D点云分类和分割 PointNet系列丨【百变AI秀】

网友投稿 979 2022-05-30

前言

PointNet是直接对点云进行处理的,它对输入点云中的每一个点,学习其对应的空间编码,之后再利用所有点的特征得到一个全局的点云特征。Pointnet提取的全局特征能够很好地完成分类任务,但局部特征提取能力较差,这使得它很难对复杂场景进行分析。

PointNet++核心是提出了多层次特征提取结构,有效提取局部特征提取,和全局特征。

一、PointNet

PointNet是直接对点云进行处理的,它对输入点云中的每一个点,学习其对应的空间编码,之后再利用所有点的特征得到一个全局的点云特征。

论文地址:PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

开源代码-原论文实现:https://github.com/charlesq34/pointnet

开源代码-Pytorch实现:https://github.com/fxia22/pointnet.pytorch

1.1 PointNet思路流程

基于深度学习的3D点云分类和分割 PointNet系列丨【百变AI秀】

1)输入为一帧的全部点云数据的集合,表示为一个nx3的2d tensor,其中n代表点云数量,3对应xyz坐标。

2)输入数据先通过和一个T-Net学习到的转换矩阵相乘来对齐,保证了模型的对特定空间转换的不变性。

3)通过多次mlp对各点云数据进行特征提取后,再用一个T-Net对特征进行对齐。

4)在特征的各个维度上执行maxpooling操作来得到最终的全局特征。

5)对分类任务,将全局特征通过mlp来预测最后的分类分数;对分割任务,将全局特征和之前学习到的各点云的局部特征进行串联,再通过mlp得到每个数据点的分类结果。

1.2 PointNet网络结构

它提取的“全局特征”能够很好地完成分类任务。下面看一下PointNet的框架结构:

下面解释一个网络中各个部件的作用。

1)transform:

第一次,T-Net 3x3 ,对输入点云进行对齐:位姿改变,使改变后的位姿更适合分类/分割。

第二次,T-Net 64x64 ,对64维特征进行对齐。

2)mlp:多层感知机,用于提取点云的特征,这里使用共享权重的卷积。

3)max pooling:汇总所有点云的信息,进行最大池化,得到点云的全局信息。

4)分割部分:局部和全局信息组合结构(concate,语义分割)

5)分类loss:交叉熵,分割loss:分类+分割+L2(transform,原图的正交变换)

1.3 T-Net网络结构

将输入的点云数据作为nx3x1单通道图像,接三次卷积和一次池化后,再reshape为1024个节点,然后接两层全连接,网络除最后一层外都使用了ReLU激活函数和批标准化。

1.4 模型效果

ModelNet40 上的分类结果:

ShapeNet部分数据集上的分割结果:

不足:缺乏在不同尺度上提取局部信息的能力

二、PointNet++

Pointnet提取的全局特征能够很好地完成分类任务,由于模型基本上都是单点采样,代码底层用的是2Dconv,只有maxpooling整合了整体特征,所以局部特征提取能力较差,这使得它很难对复杂场景进行分析。

PointNet++核心是提出了多层次特征提取结构,有效提取局部特征提取,和全局特征。

论文地址:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

开源代码地址:GitHub - charlesq34/pointnet2: PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

2.1 思路流程

先在输入点集中选择一些点作为中心点,然后围绕每个中心点选择周围的点组成一个区域,之后每个区域作为PointNet的一个输入样本,得到一组特征,这个特征就是这个区域的特征。

之后中心点不变,扩大区域,把上一步得到的那些特征作为输入送入PointNet,以此类推,这个过程就是不断的提取局部特征,然后扩大局部范围,最后得到一组全局的特征,然后进行分类。

2.2 整体网络结构

PointNet++ 在不同尺度提取局部特征,通过多层网络结构得到深层特征。PointNet++按照任务也分为 classification (分类网络)和 segmentation (分割网络)两种,输入和输出分别与PointNet中的两个网络一致。

PointNet++会先对点云进行采样(sampling)和划分区域(grouping),在各个小区域内用基础的PointNet网络进行特征提取(MSG、MRG),不断迭代。

对于分类问题,直接用PointNet提取全局特征,采用全连接得到每个类别评分。对于分割问题,将高维的点反距离插值得到与低维相同的点数,再特征融合,再使用PointNet提取特征 。

比较PointNet++两个任务网络的区别:

在得到最高层的 feature 之后,分类网络使用了一个小型的 PointNet + FCN 网络提取得到最后的分类 score;

分割网络通过“跳跃连接” 操作不断与底层 “低层特征图”信息融合,最终得到逐点分分类语义分割结果。(“跳跃连接”对应上图的 skip link connection;低层特征图 具有分辨率较大,保留较丰富的信息,虽然整体语义信息较弱。)

2.3 网络结构组件

1)采样层(sampling)

2)组合层(grouping)

为了提取一个点的局部特征,首先需要定义这个点的“局部”是什么。一个图片像素点的局部是其周围一定曼哈顿距离下的像素点,通常由卷积层的卷积核大小确定。同理,点云数据中的一个点的局部由其周围给定半径划出的球形空间内的其他点构成。组合层的作用就是找出通过采样层后的每一个点的所有构成其局部的点,以方便后续对每个局部提取特征。

3)特征提取层(feature learning)

因为PointNet给出了一个基于点云数据的特征提取网络,因此可以用PointNet对组合层给出的各个局部进行特征提取来得到局部特征。值得注意的是,虽然组合层给出的各个局部可能由不同数量的点构成,但是通过PointNet后都能得到维度一致的特征(由上述K值决定)。

2.4 不均匀点云组合grouping方法:

1)多尺度组合MSG:对于选取的一个中心点设置多个半径进行成组,并将经过PointNet对每个区域抽取后的特征进行拼接(concat)来当做该中心点的特征,这种做法会产生很多特征重叠,结果会可以保留和突出(边际叠加)更多局部关键的特征,但是这种方式不同范围内计算的权值却很难共享,计算量会变大很多。

2)多分辨率组合MRG:MRG避免了大量的计算,但仍然保留了根据点的分布特性自适应地聚合信息的能力。对不同特征层上(分辨率)提取的特征再进行concat,以b图为例,最后的concat包含左右两个部分特征,分别来自底层和高层的特征抽取,对于low level点云成组后经过一个pointnet和high level的进行concat,思想是特征的抽取中的跳层连接。

当局部点云区域较稀疏时,上层提取到的特征可靠性可能比底层更差,因此考虑对底层特征提升权重。当然,点云密度较高时能够提取到的特征也会更多。这种方法优化了直接在稀疏点云上进行特征抽取产生的问题,且相对于MSG的效率也较高。

选择哪一种:

当局部区域的密度低时,第一矢量可能不如第二矢量可靠,因为计算第一矢量的子区域包含更稀疏的点并且更多地受到采样不足的影响。在这种情况下,第二个矢量应该加权更高。

另一方面,当局部区域的密度高时,第一矢量提供更精细细节的信息,因为它具有以较低水平递归地表达较高分辨率检查的能力。

2.5 模型效果

分类对比:

分割对比:

小结

复杂场景点云一般采用PointNet++进行处理,而简单场景点云则采用PointNet。

如果只从点云分类和分割两个任务角度分析,分类任务只需要max pooling操作之后的特征信息就可完成,而分割任务则需要更加详细的local context信息。

参考文献

[1] PointNet++ 论文及代码解读 - 知乎

[2] 3D点云 | 基于深度学习处理点云数据入门经典:PointNet、PointNet++ - 云+社区 - 腾讯云

[3] https://arxiv.org/pdf/1612.00593.pdf

[4] https://arxiv.org/pdf/1706.02413.pdf

【百变AI秀】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/296704

本文只供大家参考和学习,谢谢。

AI 深度学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:九大云原生产品之华为云CCE云容器引擎
下一篇:Kylin快速入门系列(4) | Cube构建优化
相关文章