概述
首先,本文是基于点云,并且直接处理点云数据
的3D目标检测网络
本文可以看做是对PointNet的一个改进。PointNet我们之前也聊到了。他最初是提取点的特征,然后通过对称函数(max pool)将所有的点特征进行聚合,得到全局点云特征,这就完成了特征提取部分的功能。但是在这个过程中,没有考虑到某些点与周围点之间的关系,没有提取局部的特征,而这一点是很重要的(卷积在图像处理中大放异彩),也就限制了它的细粒度识别能力和泛化能力。
细节
网络结构
我们可以发现,最核心的特征提取部分是Hierarchical point set feature learning
,它重复堆叠了set abstraction
模块,借助该模块点云的数量不断减少,特征不断聚合。最终分类的时候,就是采用PointNet得到全局特征,经过两层全连接和softmax得到分类结果,而分割就是使用一种类似上采样的方式结合类似skip connection的方式得到最终的分割点云。
分层点集特征学习
特征提取的核心就是set abstraction
模块,它主要包含三个部分,分别是sampling、grouping以及pointnet。
sampling:
这部分做的工作就是从输入的点云集合中的N个点采样出来
N
1
N^1
N1个点,这
N
1
N^1
N1个点就是分区的质点。采样的方式不是往常的随机采样,而是farthest point sampling (FPS)算法,尽可能使得挑选出来的点是较为关键的点,它的算法流程如下:
- 随机选择一个点作为已选择采样点;
- 计算未选择采样点集中每个点与已选择采样点集之间的距离,将距离最大的那个点加入已选择采样点集;
- 更新距离;
- 迭代,直至获得了目标数量的采样点。
grouping:
对于上面sampling阶段采样到的每个点,都构建一个分区。(这步操作就像是得到CNN中卷积 窗口一样)作者使用了一个Ball query方式,也就是以这些点为球心,在半径范围画一个球,在球内寻找点,注意的是寻找的点上限是K
,也就是最多寻找到k
个点,如果没找到k
个点那就算了,找到几个算几个,这也就带来了一个问题,grouping阶段寻找到的点是数量不定的。注:
寻找点的方式其实也有别的,比如KNN,但出于模拟CNN中采样的过程的角度而言,还是Ball query的方式好一些,另外可能是Ball query实验做出来效果好一些。
PointNet:
对于grouping阶段得到的所有分区进行特征提取。这边的话,论文中提到了一个问题,就是点云中的点分布是不均匀的,所以在密集区域和稀疏区域得到的特征是存在巨大沟壑的。这个问题有点像之前在图像中的多尺度问题,也就是同一张图片中存在多个不同尺度的物体,我们如何获得一个更好的特征去表征所有尺度的物体。作者给出了两个解决方案,分别是Multi-scale grouping (MSG)以及Multi-resolution grouping (MRG)。
MSG:
这种方式是使用不同的尺度(半径)进行grouping操作,并且分别进行特征提取,接下来对这些特征进行堆叠。
MRG:
这种方式是分级进行grouping操作,最后再进行特征提取。
三个阶段的数据变化:
假设输入数据是
N
∗
(
d
+
c
)
N*(d+c)
N∗(d+c),N是点数,d是点的坐标数,c是额外提取到的特征。经过sampling就是从
N
N
N个点中得到
N
1
N^1
N1个点,经过grouping就变成了
N
1
∗
k
∗
(
d
+
c
)
N^1*k*(d+c)
N1∗k∗(d+c),而经过PointNet的特征提取就变为了
N
1
∗
(
d
+
c
)
N^1*(d+c)
N1∗(d+c)。