PointNet \ PointNet++ \ PointConv 架构分析

PointNet

PointNet \ PointNet++ \ PointConv 架构分析_第1张图片
1、网络基本组成:
(1)T-Net:先将不同旋转平移的原始点云进行规范化;再对点云特征进行规范化。
(2)MLP多层感知机:n个共享权重的MLP用于处理n个点/特征。
(3)Max pooling:融合多个特征并得到全局的1024维的特征。
(4)根据任务的不同,利用一个MLP实现分类;结合局部信息利用多个MLP实现分割。

2、T-Net
-通过学习出变化矩阵来对输入的点运货特征进行规范化处理。
-点云输入 B x N x 3 增加一维度变成 B x N x 3 x1 的4D张量(channel为1)
构建T-Net模型,分别为64、128、1024,即最后输出channel为1024:B x N x 3 x 1 经过13卷积变成B x N -x 1 x 64,在经过两个11变成B x N x 1 x 1024
-max-pooling操作将B x N x 1 x 1024 转换成 B x 1 x 1 x 1024
-reshape操作将B x 1 x 1 x 1024变成B x 1024
-全连接层将B x 1024 转换成B x 512 进而转换成 B x 256维度
-通过定义权重[W(256,3K), bais(3K)],将上面的256维特征转变为33的旋转矩阵输出。
-同样对于特征层的规范化处理,其输入为n
64的特征输出为6464的旋转矩阵,网络结构与上面完全相同,只是在输入输出的维度需要变化。同样在得到256维的特征后利用weight(256KK), bais(KK)来计算出K*K的特征旋转矩阵,其中K为64,为默认输出特征数量。

3、MLP处理点云、特征
-mlp(64,64)(13和11)输入旋转后的点云,扩展维度,通过两层64\64大小的感知机将B x N x 3 x1 转换成B x N x 1 x 64
-mlp(64,128,1024)(11卷积)输入校正后的特征,通过三层64\128\1024的感知机输出n1024维的特征矩阵

4、Max pooling 作为对称函数得到全局特征
-每个输入点从3维变成了1024维,此时需要对n个点所描述的点云进行融合处理以得到全局特征,即最大池化,二维的池化函数对点云中点的数目这个维度进行池化,n–>1。
-输出为全局特征[num_point,1]表示将每一个点云的n个点最大池化为1个特征,这个特征的长度为1024。此时通过了两次mpl的处理(?)将一个点云的特征逐点进行描述,并合并到了1024维的全局特征上来。

5、分类
-根据上面得到的1024维的特征,利用一个三层感知机MPL(512-256-40)来对特征进行学习,最终实现了对于40类的分类,K=40。
-这一感知机由全连接层组成,其中包含了两个dropout=0.7防止过拟合。最终就可以根据输出K个分类值分数的大小来确定输入点云的分类了。

6、分割
-需要加入局部信息,故输入为1024维的全局信息和n64的从点云直接学习出的局部信息,通过将全局信息附在每一个局部点描述的后面,形成了1024+64=1088维的向量,再通过两个感知机(11卷积)进行分割。
-由于点云的分割问题可以看做是对于每一个点的分类问题,需要对每一个点的分类进行预测。在通过对全局+局部特征学习后,最后将每一个点分类到50类中,并输出n*50的输出。

PointNet++

PointNet \ PointNet++ \ PointConv 架构分析_第2张图片
1、特征提取
特征提取即set abstraction layers,未使用T-Net网络(怎么实现刚性不变性的?),直接对点云进行处理,由三个pointnet_sa_module模块组成。

(1)pointnet_sa_module模块
①Sample and Grouping layer:输入的点云进行采样和分组。使用最远点采样,寻找npoint个最远点;采用knn或Ball方法进行分区,找到距离中心点附近的k个最近点组成局部区域。
②Point Feature Embedding layer:提取特征的卷积层
③Pooling in Local Regions:对每个group的feature进行pooling,得到每个中心点的local points feature

2、分割
(1)Set Abstraction layers:下采样,输入是(N,D)表示N个D维特征的points,输出是(N’,D’)表示N’个下采样之后的点,每个点采用最远点采样寻找N’个中心点,通过pointnet计算得到N’维度的特征。
(2)Feature Propagation layers:用FP网络进行上采样。采用反距离加权插值(把距离的倒数作为weight)。这种插值输入(N, D),输出(N’, D),保证输入的特征维度不变。
(3)FC layers

FP:输入sa2、sa3的坐标和特征;输出特征
-对sa2中的每个点,寻找sa3中的3个最近点
-对这三个最近点,记录id,并计算距离,然后通过距离的倒数计算权重
-使用这个3个最近点的特征进行加权平均求取sa2点的feature
-得到的feature与sa2的特征进行concatenate操作
-通过MLP和MaxPooling得到FP1的输出,feature。sa2中的每个点对应一个feature,从而完成了Upsampling

PointConv

贡献:
(1)提出PointNet:用密度函数来加权卷积,弥补不均匀采样带来的影响。(个人理解是,通过S的加权使得点云均匀,进而可视为是对3D连续卷积函数的近似)
(2)通过改变原始的PointNet网络的求和顺序,即把权重计算分为两部分(MLP最后一层的输入M和权重H)来减少计算量,降低内存占有率,提升网络运行效率。
(3)插值-skip connection-PointConv组成PointDeConv。

1、网络架构
PointNet \ PointNet++ \ PointConv 架构分析_第3张图片
(1)分类
网络架构相当于PointNet++,只是用PointConv替换PointNet层。
PointConvDensitySetAbstraction()层-全连接层。

(2)分割
网络架构如上图4所示。
通过四层编码-解码层-全连接层-1×1卷积层组成。

2、PointConv实现过程:

PointNet \ PointNet++ \ PointConv 架构分析_第4张图片
F 是每个点的特征,理解的是这里初始是把点云坐标xyz作为输入,也就是说,Cin是3。
S 是每个点代表的逆密度,可以理解为密度的相反数,一个点周围的密度越大,权重越小,因为有冗余。首先使用核密度估计求出每个点云区域的密度,然后使用一个MLP做一个非线性变换,使其变成逆密度
【假设一共有8000个点,使用核密度估计求每个点的密度,得到(8000,1)的密度特征,对这个密度进行非线性处理(输入一个mlp中),让这个特征变得可学习。然后把这个密度求逆,作为权重。就是上面公式里的S。】
W 就是卷积核,这个卷积核是用过MLP来近似的,输入是点云坐标,输出是一个卷积核,这个卷积核的大小是K×(Cin×Cout),也就是说,如果这个区域有50个点,Cin=3,Cout=32,那么这个输出的卷积核的大小就是50×96。
(个人理解,MLP中的1 × 1卷积层相当于全连接层,对输出特征维度进行控制调整;并且通过后接激活函数加入非线性特性,提升网络的表达能力;最重要的是我觉得他比全连接层计算量要小。)

PointNet \ PointNet++ \ PointConv 架构分析_第5张图片

假设Fin是50×3,经过MLP输出的逆密度50×1,即每个点对应一个密度,然后扩展成50×3,和F进行逐元素相乘,得到经过密度加权后的特征。下面就是使用位置对特征进行加权了,卷积核W是50*96,上一步得到的F是50×3,为了尺寸匹配,把F扩展成50×96,也就是50×3×32。其实可以发现,这个50×96的卷积核,实际上是32个权重不同的50×3的卷积核,用他们对特征进行卷积,每个卷积核输出一个值,得到1×32的特征。

在卷积神经网络中,卷积核是通过Conv2d函数直接指定的,包括尺寸,个数。它的权重值是通过BP反向传播学习的,但在3维的过程中,卷积核是根据输入点坐标,经过一个MLP,间接得到的,也就是每个样本都会有不同的卷积核,但在2D的问题中,一旦学习完成,卷积核权重就不变了。这个不同实际上是由点云的无序性导致的。

你可能感兴趣的:(PointNet \ PointNet++ \ PointConv 架构分析)