Pointnet++

PointNet++

为什么设计:
PointNet缺失局部特征,点与点之间的联系没有被学到,导致其在复杂场景中的应用:语义分割表现不是很好。

设计思路(写出要改善的点,和思路来源):
PointNet不会捕获由度量引起的局部结构。然而,利用局部结构已被证明是卷积架构成功的重要因素,所以想到通过底层空间距离度量将点集划分为重叠的局部区域,从cnn获得的灵感,和cnn类似,我们提取局部特征,从小邻域中获取精细的几何结构,这些局部特征被进一步分组为更大的单元,并被处理以更高层次的特征,这个过程不断重复,直到我们得到整个点集的特征。
问题是:
1.如何生成点集的划分
2.如何通过局部特征学习器抽象点集或局部特征

网络结构组成以及作用:
Multi-Scale point Net

作用是:通过在整个点云的局部采样并划一个范围,将里面的点作为局部特征,利用PointNet进行一次特征提取,通过多次这样的操作,原本点的个数变得越来越少,而每一个点都是通过PointNet提取出来的局部特征,就是每个点包含的信息变多了,这样的一个层称为Set Abstraction
##################################################################
Set Abstraction的组成:
Sampling:
利用FPS(最远点采样)随机采样,输入规模为BN(d+C),其中 B: batch size
N:表示点集中点的数量,d:表示点的坐标规模,C:点的其他特征(比如法向量等)维度,一般 d=3,c=0
输出规模为B * N’ * (d + C)
FPS算法原理:

输入点云有N个点,从点云中选取一个点P0作为起始点,得到采样点集合S={P0};
计算所有点到P0的距离,构成N维数组L,从中选择最大值对应的点作为P1,更新采样点集合S={P0,P1};
计算所有点到P1的距离,对于每一个点Pi,其距离P1的距离如果小于L[i],则更新L[i] = d(Pi, P1),因此,数组L中存储的一直是每一个点到采样点集合S的最近距离;
选取L中最大值对应的点作为P2,更新采样点集合S={P0,P1,P2};
重复2-4步,一直采样到N’个目标采样点为止。
有两个问题,一个是初始点选择,一个是采用的距离度量;

初始点选择:
随机选择一个点,每次结果不同;
选择距离点云重心的最远点,每次结果相同,一般位于局部极值点,具有刻画能力;
距离度量
欧氏距离:主要对于点云,在3D体空间均匀采样;
测地距离:主要对于三角网格,在三角网格面上进行均匀采样;
参考链接:https://blog.csdn.net/dsoftware/article/details/107184116

Grouping:
利用Ball Query划一个R为半径的圈,将每一个圈里面的点云作为一簇
这一步是以N’ 个点为中心,寻找固定规模(规模为K)的邻点,共同组成一个局部邻域,输出规模为N’ * K * (d + C)
注意:
1.找邻域的过程是在坐标空间进行(也就是以上代码输入输出维度都是d,没有C,C是在之后的代码拼接上的),不是特征空间
2.如果query ball的点的数量大于规模K,那么直接取前K个作为局部邻域;如果小于,那么直接对某个点采样,凑够规模K

PointNet:
对Sampling+Grouping以后的点云进行局部的全局特征提取
使用PointNet对以上结果进行表征,输入B * N’ * K * (d + C), 输出 B * N’ * (d + C’)
代码分为三部分:
1)point feature embedding
输入B * N’ * K * (d + C),类比为batch size 为B, 宽高为N’ * K,通道数为d+C,这样易于理解卷积。11的卷积,不改变feature map 的大小,只改变通道数,将通道数升高,实现所谓的embedding
这部分输出为B * N’ * K * C’
补充1
1卷积核作用:
1.降维(减少参数、计算量)
输入的feature map 是2828192 。11卷积通道为64,33卷积通道为128,55卷积通道为32。左图卷积核参数为 192(1164)+192*(33128)+192*(5532)=387072
右图对33和55卷积层前分别加入了通道数为96和16的11卷积层,这样卷积核参数就变为了:
192
(1164)+(1921196+9633128)+(1921116+165532)=157184

2.升维
3.跨通道信息交互(channal的变换):
比如通道数由64变为28,可以理解为跨通道线性组合变成了28channals,这就是通道间的信息交互,只在channel维度上做线性组合
4.增加非线性特性
其实这边是利用后接的非线性激活函数
2)pooling:
对每个局部邻域pooling
输出B * N’ * 1 * C’
3)针对池化后的结果做MLP:
简单的1*1卷积,在实际实验中PointNet++没有设置去做

针对低密度采样数据的点云局部邻域训练不能很好挖掘点云的局部结构,提出两种方案:
一、Multi-scale grouping(MSG)

如图所示,该区域特征由三个不同半径R的Ball Query提取的特征组成(缺点:由于要提取非常多的浅层特征,所以计算量非常昂贵)
二、Multi-resolution grouping(MRG)

左边一个向量是通过使用set abstraction level得到的(就是上文介绍的),右边的向量是直接通过对原始的点云数据直接使用PointNet得到的
##################################################################

Decoder(用于分割任务):

如图中的右上角部分所示,利用反向插值以及skip connection来获得discriminative point-wise feature:
红色矩形点集 P1:N1 * C ,蓝色点集 P2:N2 * C2
Decoder 为上采样过程,因此N2>N1
一、反向插值
对于P2中的每一个点x,找在原始点云坐标空间下,P1中与其最接近的k个点,将其特征加权求和,得到x的特征,x1···xk的权重与x的就成负相关,距离越远,权重越小。
二、skip connection 具体做法:
由于回传得到的point-wise feature 是从decoder的上一层得到的,因此算是global级别的信息,想要用这些来进行分割还不够,需要局部信息,所以见图中的虚线,有个skip connection 将之前encoder中点集的特征拼接过来。
优势:
学习到了局部特征

应用场景:
用于处理度量空间中采样的点集,有效的学习关于距离度量的层次特征。解决非均匀点采样问题。对于复杂场景点云一般采用PointNet++进行处理,而简单场景点云一般采用PointNet

缺陷不足;未来展望:
如何通过在每个局部区域共享更多的计算来提高该网络的推理速度,尤其是对MSG和MRG层的推理速度,是值得思考的问题

参考:
链接:https://blog.csdn.net/weixin_39373480/article/details/88878629
https://zhuanlan.zhihu.com/p/266324173

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

科研dog_java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值