3D点云认知和PointNet算法解读

【唐宇迪】3D点云应用领域分析

【唐宇迪】3D点云pointnet算法解读

点云文件格式举例:modelnet40_normal_resampled:其中txt文件中,一行有六个点:前三个点代表的是x,y,z。后三个点代表的是Nx,Ny,Nz,法向量

点云任务:

分类任务;部件分割;场景分割等。

点云的特点:

  • 无序性:只是点而已,排列顺序不影响结果。

  • 近密远疏的特性:扫描与视角不同导致。
  • 非结构化数据直接CNN有点难。
  • 要解决的任务就是如何对点云数据进行特征提取

能不能省掉那些预处理操作而直接利用点云呢?

  • 当下深度学习的核心思想就是一条龙服务(End2End)

PointNet基本出发点:

1、由于点的无序性导致,需要模型具有置换不变性

f(x_{1},x_{2},x_{3},x_{4},x_{5},...,x_{n})\equiv f(x_{\pi _{1}},x_{\pi _{2}},x_{\pi _{3}},x_{\pi _{4}},..., x_{\pi _{n}});

比如:加法运算,乘法运算,求最大最小值。

f(x_{1},x_{2},x_{3},x_{4},x_{5},...,x_{n})=max\left \{ x_{1},x_{2},x_{3},x_{4},x_{5},...,x_{n}\right \}

2、直接利用Max函数(简单粗暴):

 

信息压缩过多,浓缩太多,丢失太多特征信息。

3、先给每个样本点升维,然后再做Max操作(其实就是神经网络的隐藏层(升维))

PointNet的基本公式:

f(x_{1},x_{2},x_{3},...,x_{n})=\gamma \circ g(h(x_{1}),h(x_{2}),h(x_{3}),...,h(x_{n}))

h代表升维函数,g就是max函数;

神经网络的本质就是一个特征提取器。

整体网络架构:

分类就是得到整体特征再输出;

分割就是各个点特征输出结果

分类网络:求整体特征。

输入的每个样本有n个点,每个点有x,y,z三个维度。所以n×3。(也可以是6个维度的输入。n一般会指定,比如通过采样固定输入2048个点。)。经过mlp升维后,每个点3维变成了64维度。64维度再变成128维度,128维变成1024维度。最后输入变成了n×1024维。每个样本点都是1024维的特征。然后经过maxPool,即置换不变性函数-Max函数。

MaxPool函数操作:是从n×1024矩阵中,将n个样本中,每个特征维度的最大值取出,也就是说。n个样本,每个样本有1024个特征维度,每个特征维度取这n个样本在这个维度上的最大值。而不是每个样本点取最大值。每个维度的n个值取最大值。生成一个长为1024的向量。这个1024的向量类似于一张32×32的图像输入到三个全连接层,这三个全连接层分别有512,256,k个神经元。(K取决于我们做k分类。)(2017年提出的网络。)

分割网络:每个点做分类。

把每个点的特征信息和全局的特性信息做拼接。但是点有n个,全局特征只有一个1024长的向量。如何拼接:将1024长的全局特征信息,复制n份,拼接到每个点的特征信息中。那么每个点的特征信息长度为64+1024=1088。所以变成了n×1088。

每个样本点,既有自己的特征又有全局的特征。

然后将拼接之后的特征信息经过三层mlp,特征维度从1088变为512,从512变成256,再变成128。然后再经过最后的分类网络将每个点的类别输出。n个点,m个类别。每个点有m中类别,所以最后的输出就是n×m。 




使用深度学习的三维点云分类的介绍

PointNet:

分别在每个点上训练了一个MLP(在点之间分享权重)。每个点被“投影”到一个1024维空间。然后,他们用点对称函数(max-pool)解决了点云顺序问题。这为每个点云提供了一个1 x 1024的全局特征,这些特征点被送入非线性分类器。利用他们称为T-net的“迷你网络”解决了旋转问题。它学习了点(3 x 3)和中级特征(64 x 64)上的变换矩阵。称之为“迷你”有点让人误解,因为它实际上与主网络的大小有关。另外,由于参数数量的大量增加,引入了一个损失项来约束64×64矩阵接近正交。也使用类似的网络进行零件分割。也做了场景语义分割。做得好!我强烈推荐阅读(或者您也可以观看演示视频)。本文对ModelNet40数据集的准确率高达89.2%。

Princeton’s Modelnet40 dataset。 它包含约40个对象类别(如飞机,表格,植物等),用三角形网格表示的12311个CAD模型。 数据分为9843个培训模式和2468个测试模式,如下图

PointNet++:

本质上是PointNet的分层版本。每个图层都有三个子阶段采样,分组和PointNeting。在第一阶段,选择质心,在第二阶段,把他们周围的邻近点(在给定的半径内)创建多个子点云。然后他们将它们给到一个PointNet网络,并获得这些子点云的更高维表示。然后,他们重复这个过程(样本质心,找到他们的邻居和Pointnet的更高阶的表示,以获得更高维表示)。使用这些网络层中的3个。还测试了不同层级的一些不同聚合方法,以克服采样密度的差异(近密远疏性:对于大多数传感器来说这是一个大问题,当物体接近时密集样本,远处时稀疏)。他们在原型PointNet上进行了改进,在ModelNet40上的准确率达到了90.7%。




深度学习算法的点云分割-PointNet(三)

下面半部分文章内容。

一、PointNet存在的问题

PointNet只是简单的将所有点连接起来,只考虑了全局特征,但丢失了每个点的局部信息,如下图(以点云分割为例):

所以继pointnet之后,很多人的着重点都在提取局部区域特征方面。为了解决这个问题,pointnet++的整体思想就是:首先选取一些比较重要的点作为每一个局部区域的中心点,然后在这些中心点的周围选取k个近邻点(欧式距离的近邻)。再将k个近邻点作为一个局部点云采用pointnet网络来提取特征

三步: 采样中心点, 找邻点建局部区域, 提取局部区域特征

(鼓励一部分人先富起来,然后带动周边区域富起来,然后整个区域共同富裕起来。)

二、pointnet++网络结构详解

网络的两个亮点:

    1.改进特征提取方法:pointnet++使用了分层抽取特征的思想,把每一次叫做set abstraction。分为三部分:采样层、分组层、特征提取层。

  • 首先来看采样层,为了从稠密的点云中抽取出一些相对较为重要的中心点,采用FPS(farthest point sampling)最远点采样法,这些点并不一定具有语义信息。当然也可以随机采样
  • 然后是分组层,在上一层提取出的中心点的某个范围内寻找最近个k近邻点组成patch
  • 特征提取层是将这k个点通过小型pointnet网络进行卷积和pooling得到的特征作为此中心点的特征,再送入下一个分层继续。这样每一层得到的中心点都是上一层中心点的子集,并且随着层数加深,中心点的个数越来越少,但是每一个中心点包含的信息越来越多。

    2.解决点云密度不同问题:由于采集时会出现采样密度不均的问题,所以通过固定范围选取的固定个数的近邻点是不合适的。pointnet++提出了两个解决方案。

    方案一:多尺度分组

        如上图左所示,比较直观的思想是,在每一个分组层都通过多个尺度来确定每一个中心点的邻域范围,并经过pointnet提取特征之后将多个特征联合起来,得到一个多尺度的新特征。

    方案二:多分辨率分组

        很明显,通过上述做法,对于每一个中心点都需要多个patch的选取与卷积,计算开销很大,所以pointnet++提出了多分辨率分组法解决这个问题。如上图右所示,类似的,新特征通过两部分连接起来。左边特征向量是通过一个set abstraction后得到的,右边特征向量是直接对当前patch中所有点进行pointnet卷积得到。并且,当点云密度不均时,可以通过判断当前patch的密度对左右两个特征向量给予不同权重。例如,当patch中密度很小,左边向量得到的信息就没有对所有patch中点提取的特征可信度更高,于是将右特征向量的权重提高。以此达到减少计算量的同时解决密度问题。



深度学习算法的点云分割-PointNet(四)

文中对比了PointNet和PointCNN。代码还原讲解。

深度学习算法的点云分割-PointNet(五)




3D目标检测算法详解_pointnet, pointnet++,frustum-pointnets,VoteNet

三步: 采样中心点, 找邻点建局部区域, 提取局部区域特征
 1. sampling layer: 该层的输入是原始点集N*(d+C), d为xyz坐标数据,C是点特征数据. 使用FPS算法从数据集中选出中心点集

FPS算法: 随机选取一个点加入中心点集合, 之后选择离中心点集合里的点最远的点加入中心点集合中, 迭代选取中心点(后面选取的点需要和之前中心点集合中所有的点做距离计算metric distance),直到中心点集中点的个数达到阈值.

2. grouping layer: 该层的输入是原始点集N*(d+C)和sampling出的中心点集N'*d(N'是中心点个数,中心点只需要d坐标信息,不需要特征信息). 该层的输出是点集(point sets)的groups, 每个点集的shape是N'*K*(d+C), 每个group对应一个局部区域, 共有N'个局部区域, K是中心点周围的点的个数. 不同的group的K的值不一样. 虽然每个group含有的点的数量可能不同,但是使用pointnet结构提取出来的特征是维度一致的(每层特征图使用了全局max pooling)

Ball query: 使用KNN选取中心点周围的点集也没有考虑到密度不均匀的问题. 文章使用了一种Ball query的方法,就是在中心点周围取一定半径里的所有点.

3. PointNet layer: 使用pointnet的网络提取局部区域的特征, 输入是grouping出的groups, 每个group的shape是N'*K*(d+C), 输出是N'*(d+C'), 邻点的坐标减去中心点的坐标,作为他们的新坐标. 点特征shape C被embedding成shape C', K个邻点被抽象成一个特征.
 

针对密度不均匀的问题,提出密度适应的特征学习方法: PointNet++ layer 替代PointNet layer

点云数据有密度不均匀的问题, 近多远少, 对于密度不均匀的数据使用相同尺寸的特征提取是不合适的(如卷积的感受野对远处的点集应该更大),文章使用了两种特征提取方法:

1. MSG(multi-scale grouping多尺度组合) 对每个group都用不同尺度大小的网络来提取特征,再叠加在一起

2. MRG (multi-resolution grouping多分辨率组合)每层对某个局部区域的特征提取由两部分组成: 基于上一层输出的特征提取到的特征+该区域对应的原始点集提取出的特征. 前者经过了两层特征提取,感受野更大, 适用于比较稀疏的点集. 而后者只做了一次适用于比较稠密的点集.
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值