CV_4 PointNet++算法的简单理解(入门级别)
一. 填坑指南
?2021年年中的时候,博主曾经写过一篇介绍有关点云的深度学习 - PointNet算法的文章:链接在此。因为各种原因没有继续更新其进阶版 - PointNet++算法,2022年春节假期的最后一天把坑填上。
二. PointNet++弥补了PointNet的哪些缺点?
?上回书说到PointNet有以下两大缺点:
- 与当前的主流网络不符,没有局部特征的融合,要不是自己一个点,要不就是整体一群点。
- 没有关系的概念,局部样本点之间是一定存在关系的,但是在PointNet中却没有考虑到。
?为此PointNet的作者借鉴了深度学习图像卷积的理念,在PointNet网络中加入了采样、分组、卷积的灵魂,从而衍生出了PointNet++这一进化版本。
三. PointNet++算法的核心
(1)如何将一个个单独的点变成一堆堆的簇?
?这里就要用到画圆圈点这个古老的数学方法了,但是怎么去画圆?圆的圆心该在哪?圆的半径又该如何定义呢? ?对于选圆心,作者在这里提出了一个解决办法,那就是:“最远点采样法”。 ?例如输入的数据有1024个点,要选择128个中心点(簇),该如何采样呢?这时候就用到了一种方法 - - - 最远点采样法:简单的来说就是当你在选择每一个采样点的时候都要保证你选择的这个点是距离和已经选取好的所有点的距离是最远的。那么新的采样点与已经采样点之间的距离就是:当前采样点与已采样点之间距离的最小值。(最远点采样的目的其实就是让我们的采样可以尽可能的覆盖全局,从而让我们得到的特征能更有意义) ?如上图所示,假设你已经选定了“已采样点1”和“已采样2”,那么当你要选出第三个点到底是“篮1”还是“篮2”的时候,你就要去比较“篮1”和“篮2”谁到已知采样点:“已采样点1”和“已采样2”的距离更远,而至于“篮1”到已知采样点的距离,根据上述可知是“d1”,“篮2”到已知采样点的距离则是“d4”,可以明显看到 d4 > d1,因此在第三个采样点的选择上我们将会选择 - - “篮2”。 ?选完圆心之后就是定义半径了,其实在半径的设置上就会变得比较随性了,但在设置一个半径的同时,我们还需要同时设置好一个圈里要圈出多少个点。但难免的我们也会遇到圈内点不够,或者是圈内点过多的情况,在这个时候,我们就需要分别应对了。当圈内点的数量不够的情况下,对离圆心最近的点进行复制,少几个复制几次。当点的数量超出的时候,根据各个点距离圆心的距离,将离得最远地点删去,多几个删几个。 ?跟随以上的步骤就完成了点 => 点簇的转变了,也就是完成了局部性的考量。
(2)如何提取出一堆堆簇的特征?
?在这里,作者就继承了PointNet算法中的“SUM函数”理念,也就是逐位比较圈内的各个点的坐标,选出其中的最大值,从而得到唯一的能够代表这个簇的坐标(也就是所谓的特征了)。 ?最后,就有了如下图所示的局部特征提取流程图了: 但是你以为这就完事了?其实这只是PointNet++的九牛一毛!
预知后事如何,请看下回分解。
|