如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (特征提取部分)?

CV_4 PointNet++算法的简单理解(特征提取部分 - 入门级别)


一. 填坑指南

 2021年年中的时候,博主曾经写过一篇介绍有关点云的深度学习 - PointNet算法的文章:链接在此。因为各种原因没有继续更新其进阶版 - PointNet++算法,2022年春节假期的最后一天把坑填上。

二. PointNet++弥补了PointNet的哪些缺点?

 上回书说到PointNet有以下两大缺点:

  1. 与当前的主流网络不符,没有局部特征的融合,要不是自己一个点,要不就是整体一群点。
  2. 没有关系的概念,局部样本点之间是一定存在关系的,但是在PointNet中却没有考虑到。

 为此PointNet的作者借鉴了深度学习图像卷积的理念,在PointNet网络中加入了采样、分组、卷积的灵魂,从而衍生出了PointNet++这一进化版本。

三. PointNet++算法的核心

(1)如何将一个个单独的点变成一堆堆的簇?

 这里就要用到画圆圈点这个古老的数学方法了,但是怎么去画圆?圆的圆心该在哪?圆的半径又该如何定义呢?
 对于选圆心,作者在这里提出了一个解决办法,那就是:“最远点采样法”
 例如输入的数据有1024个点,要选择128个中心点(簇),该如何采样呢?这时候就用到了一种方法 - - - 最远点采样法:简单的来说就是当你在选择每一个采样点的时候都要保证你选择的这个点是距离和已经选取好的所有点的距离是最远的。那么新的采样点与已经采样点之间的距离就是:当前采样点与已采样点之间距离的最小值。(最远点采样的目的其实就是让我们的采样可以尽可能的覆盖全局,从而让我们得到的特征能更有意义)

如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (特征提取部分)?_第1张图片
 如上图所示,假设你已经选定了“已采样点1”和“已采样点2”,那么当你要选出第三个点到底是“篮1”还是“篮2”的时候,你就要去比较“篮1”和“篮2”谁到已知采样点:“已采样点1”和“已采样点2”的距离更远,而至于“篮1”到已知采样点的距离,根据上述可知是“d1”,“篮2”到已知采样点的距离则是“d4”,可以明显看到 d4 > d1,因此在第三个采样点的选择上我们将会选择 - - “篮2”。
 选完圆心之后就是定义半径了,其实在半径的设置上就会变得比较随性了,但在设置一个半径的同时,我们还需要同时设置好一个圈里要圈出多少个点。但难免的我们也会遇到圈内点不够,或者是圈内点过多的情况,在这个时候,我们就需要分别应对了。当圈内点的数量不够的情况下,对离圆心最近的点进行复制,少几个复制几次。当点的数量超出的时候,根据各个点距离圆心的距离,将离得最远地点删去,多几个删几个
 跟随以上的步骤就完成了点 => 点簇的转变了,也就是完成了局部性的考量。
 

(2)如何提取出一堆堆簇的特征?

 在这里,作者就继承了PointNet算法中的“SUM函数”理念,也就是逐位比较圈内的各个点的坐标,选出其中的MAX(最大值),从而得到唯一的能够代表这个簇的坐标(也就是所谓的特征了)。
 最后,就有了如下图所示的局部特征提取流程图了:
如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (特征提取部分)?_第2张图片
但是你以为这就完事了?其实这只是PointNet++的九牛一毛!
 

(3)不断更换半径,进行多次采样和特征提取

 在完成了一次上述的第(1)、(2)步之后,你会不会觉得好像被提取出的特征的数量好像并不是很多呢?这一小撮数据能够完全的代表这一堆点么?为了解决这一疑惑,作者通过不断更改画的圆的半径,进行相同圆心、不同半径的多次采样,从而获取到更加丰富的特征提取的结果。简易流程图如图所示。
如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (特征提取部分)?_第3张图片注:图中所表示的仅仅是更改了两次半径,进行重新的采样和特征提取,在实际的应用中,作者们是经历了三次的。
 

(4)将相同圆心、不同半径获取的特征提取结果拼接起来

 在完成了三次的相同圆心、不同半径的采样和特征提取后,我们会得到三组不同的特征提取结果,在提取完这三组结果之后,我们就得到了更加丰富的特征结果,由于这三组结果本身是由相同的圆心所得到的,那么我们不妨将这三组结果进行拼接,从而代表这一整层的提取结果,也就是:
bydemo 

(5)改变圆心,重复上述修改半径、特征提取的步骤

 在结束了上述的(1)~(4)的步骤之后,其实就相当于我们完成了一次对点云的特征提取,但这好像还是不够,我们还需要再从点云中提取出更多的特征信息。在这一步中,作者们采用了更加聪明的办法,那就是把上一步选样完的圆心,重新作为下一步的初始点云,然后再从这些圆心中,再进行重新的选圆心、画圆圈的操作,从此以往执行三次,最终得到最后的特征提取结果。简要步骤如下图所示:
bydemo
 
以上便完成了所谓的 “局部特征” 的提取。
 
但是你以为这就完事了?其实这只是PointNet++的九牛三毛!

 那么究竟我们还缺什么?其实缺的就是深度学习图像算法中的 “卷积处理” ,那么在PointNet++中是如何进行卷积的呢?其实很简单,卷积这个操作,其实在PointNet算法里就有所体现了,那就是所谓的 “升维操作” ,那么PointNet++的升维过程又是怎么样的呢?不妨我们看看下图:
如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (特征提取部分)?_第4张图片
 
换句话说,其实就是将原本每个点携带6个特征(x, y, z, nx, ny, nz)的1024个点云,最终用128个每个携带着1024个特征的点给表示出来了。

 
 这便是PointNet++在点云特征提取上的全部步骤,是不是感觉有了那么一丝丝深度学习图像算法的局部特征提取和卷积的感觉了呢?完成了特征的提取之后,就能进行PointNet++的之后的分类、分割等操作啦!让我们静候博主对分类、分割功能的详细介绍吧 ~

 

分类分割任务详解:如何轻松理解对点云的深度学习算法 - PointNet的进化版 - PointNet++ 算法 (点云分类、分割部分)?


如有问题,敬请指正。欢迎转载,但请注明出处。

你可能感兴趣的:(计算机视觉CV,算法,深度学习,计算机视觉,LiDAR,人工智能)