Pointnet以及Pointnet++论文笔记

  Tips:写这篇Blog主要目的是在写的过程中加深对网络的理解,可能很多地方个人理解有偏差或者表述不明白。然后建议大家看了原论文再来看这个blog,这个Blog不是论文的翻译。有问题请留言或者qq交流:1981425845。大家一起讨论,共同进步。有做3D视觉的可以一起来讨论呀。

论文及代码链接

Pointnet部分

论文研究背景

  • 点云是3D物体的最自然的表现形式,具有最全面的物体的几何特征,然而点云具有无序性(irregular)。如果我们设可以直接处理点云的网络为 f f f,那么, f f f应该满足式子(1),也就是我们无论以什么顺序输入点云,输出应该是一样的。这就导致了以往的用于2D图片的网络结构无法直接用于处理点云数据,因为现有的2D处理网络要求输入数据是有序的,我们可以试想一下,如果我们把一个图片中的像素数据随机打乱之后再扔到网络中去处理,得到的结果肯定是不同的
    f ( x 1 , x 2 , x 3 , . . . ) = f ( x n , x n − 1 , x n − 2 , . . . ) = . . . ( 1 ) f(x_{1},x_{2},x_{3},...)=f(x_{n},x_{n-1},x_{n-2},...)=... (1) f(x1,x2,x3,...)=f(xn,xn1,xn2,...)=...(1)
  • 现有的3D物体的检测与分割方法存在各种各样的问题,主要表现有:voxel-based方法 采用体素化的方法,将3D空间化为一个一个的网格,根据该网格中是否具有点云数据来决定网格的值,我们可以把体素理解成3D像素。voxel-based方法的思想是通过牺牲分辨率来换取数据的有序性,从而采用3DCNN来进行数据处理。然而,由于点云数据往往具有稀疏性,这会导致如果体素化的分辨率过低,也就是每个体素网格比较大,会造成比较大的信息损失,而当体素化的分辨率过高,又会造成较大的内存开销与计算量增加。(内存开销与计算量增加与分辨率成立方关系)。multiview方法 :将3D点云从不同方向投影为2D图片,采用2D中的CNN进行处理,这已经破坏了3D数据的几何机构,对于分类任务或许可以,但是对于分割任务无能为力,这部分所需要的特征已经在投影过程中丢失。

Pointnet的主要工作

  Pointnet的目标是设计出一个网络,该网络可以不考虑输入的顺序,也就是不同的输入顺序情况下,网络的输出是一样的,这样就可以直接对点云数据进行处理了。

  • 处理点云无序性的问题 ——采用对称函数(Symmetry Function)
     对称函数是什么,其实我们很早就接触了,比如,加法这个函数就是对称函数,x1+x2=x2+x1,文章中,作者采用了max-pooling作为对称函数来聚合点云的特征,当然,我们也可以使用average-pooling等,只不过作者发现取max效果更好。同时,作者在文章中通过数学推导证明了Pointnet理论上可以逼近任何一个对称函数。(个人感觉没有必要手推一遍)
  • 针对于刚体的不变性
     点云是定义在欧式空间中的集合,其具有旋转不变性与平移不变性,平移不变性好解决,直接采用局部坐标就可以处理(注:文章中没有考虑平移不变性,应该是数据集中的点云数据空间位置都差不多,不需要考虑这个)。对于旋转不变性,本文采用了T-net,其直接与嵌入整个网络中,且使用最终的(分类或者分割)Loss更新参数,所以可以这么理解,T-net的作用就是让点云在进行处理之前,旋转到一个比较好的位置,这个位置有什么特点呢,就是相同的点云数据与网络参数,这个位置的Loss比其他位置的Loss低。后面的Feature对齐网络也可以这么理解,但是由于feature的维度太高,加入feature网络会引入很多参数,所以需要加入正则避免过拟合。(个人感觉T-net的作用不明显,在训练中加与不加差距不大,感觉就是加了几个全连接层)

网络结构分析

在这里插入图片描述
  我们先讲分类部分,上图中,蓝色部分为分类网络。先不考虑T-net,不考虑Batch_size,我们设输入点云数据 C C C的维度为的(n,3),首先,点云经过input-transforme层,里头主要是几个一维卷积层,一维卷积对点云进行point-wise操作,对点云的point-wise特征进行提取,依据x,y,z(不考虑法线的情况下)特征,生成新的特征表述。在本文中,input-transforme将(n,3)的点云数据变成了(n,64)的特征表述。在mlp层,通过全连接层对提取出来的特征进行进一步的处理,输出为(n,1024)。最后,在特征维度进行max-pooling,注意是在特征维度,也就是对特征的每一个channel取最大值,最后生成一个点云的全局特征描述,然后这个问题就转变成了一个多分类问题了。
  分割问题可以理解成每个点的分类问题,我们通过input-transforme已经得到了点的特征了,但是这个特征没有全局信息,Pointnet的方法是直接将分类网络中的全局特征直接复制到每个点上,得到(n,64+1024)的特征描述,最后在进行点的分类操作,也就是点云的分割操作。

Pointnet网络总结

  • 采用了对称函数来解决点云的无序性,所以可以直接将原始点云作为输入
  • 相对于voxel-based方法,其所占用显存空间较小
  • 网络中仅仅提取了点的特征与全局特征,没有利用局部特征,而局部特征对于点云处理而言,是十分重要的。 Pointnet++主要就是针对这个进行改进。

Pointnet++部分

论文研究背景

  • 如上所述,Pointnet无法获取点云的局部特征,只能得到每个点的特征与全局特征,而从我们的直觉来看,局部特征是点云数据中的一个十分重要的特征。
  • 真实采样的点云,其采样密度往往有区别,甚至同一个点云的不同部分,采样密度也是不一样的。要保证算法的有效性,就需要保证算法在不同采样密度下的鲁棒性。

Pointnet++的主要工作

  • Poinetnet无法提取局部特征——把点云分割成多个区域,递归地使用Pointnet来聚合局部特征
  • 通过Dropout与MSG(或者MRG,代码中使用的是MSG,其实MRG操作起来更简单)来提高算法对点云采样密度的鲁棒性。
  • 通过基于距离的上采样与跨层连接来实现点云的点特征的生成,这个点特征包含了局部特征与全局特征,具有的信息量比Poinetnet生成的点特征多。
      下面,具体介绍一下这三个部分:
    聚合局部特征: 这一部分的主要思想就是把点云分成很多个小部分,每个小部分采用Pointnet提取特征,这其实就是把这个区域的局部特征提取出来赋予到区域中心点上(注意不是几何中心,后头会说明)。可以看作对点云进行了“降采样”,点的数量变少了。然后我们重复如上步骤,就可以一步一步提取更大范围的局部特征。(是不是感觉和2DCNN有点类似,通过递归一步一步扩大了“降采样”后点云中的每个点的感受野),我们可以看一下下图以便更好理解。
    在这里插入图片描述
      Poinetnet网络前面我们已经介绍过了,那么这一部分我们需要解决的问题就是怎么Sampling与Grouping,也就是怎么确定每个区域的中心点与每个区域的大小。Sampling我们采用(最远点采样)FPS来解决,FPS就是每次选取与集合中剩下所有点距离最远的点作为采样点。使用FPS的好处是可以使采样点均匀地遍布于整个点云。对于Grouping,我们可以使用K近邻搜索(KNN)与半径邻域搜索,代码中采用的是半径邻域搜索,文章说这个方法效果更好。
    解决点云采样密度不均匀
      文章提供了两个相互独立地途径去解决这个问题:
    1、在训练的时候,对点云进行降采样,模拟采样密度不均匀的情况,这个比较好理解。
    2、进行多尺度的局部特征提取,具体如下图所示:
    在这里插入图片描述
      上图分别展示了MSG与MRG(注意我红色框出来的部分,不同框颜色是不一样的,表示了不同尺度的特征,我刚开始看没注意到这个给我看懵了),MRG是图b,很好理解,前面也说了,通过递归,剩余点云中的点的感受野是不断增大的,所以需要得到当前递归层点的多尺度的特征,我们只需要将当前递归层点的特征与**上一层递归层的对应的点们**的特征进行concat(连接)就行了,都不需要在进行多余的计算了。MSG的话就是改变前面Grouping的大小,比如改变搜索的半径,然后将不同的半径进行concat就行,会增加一点额外的计算量。代码中使用的是MSG。
    通过上采样的特征传递
      为什么要进行上采样,因为我们要进行点云分割,我们需要知道每个点的特征。我们当然不能用最初始的点特征来做分类。一个比较好的思路从最后一个Pointnet递归层开始,通过将特征传递到周围点,然后与上一层的特征相加。也就是说除了最后一层外,每一层的点的特征有两个部分组成:1、递归使用Pointnet生成的点特征。2、下一层递归层通过上采样得到的特征。第一个我们已经知道了,最主要的是第二个怎么计算。
      本文中上采样的话是通过基于距离的K近邻特征传递来实现的(原文是inverse distance weighted average based on k nearest neighbors,我是按我的理解意译的),具体公式如下:
    在这里插入图片描述  需要说明一下这个K近邻具体是谁的近邻。如果我们需要从第K个Pointnet递归层上采样生成第K-1层的点特征,那么我们寻找的是第K-1层点的近邻,而这个点的近邻点应该是在K层中的点云中寻找。(注意,无论怎么递归使用Pointnet递归,我们一直保留着点的坐标信息,而且都是在同一个坐标系下的(和下采样差不多)。给一张图应该会好理解一点,图中K设置为3。)
    在这里插入图片描述

网络结构分析

在这里插入图片描述
  总体来说就是先递归地通过Pointnet提取局部特征。最后分类的话就是再通过一个Pointnet提取全局特征然后做分类,分割的话就是通过逐层上采样得到信息量最大的点特征然后做分割,具体的话大家可以自己琢磨一下,有利于整体理解整个网络。

Pointnet++网络总结

  • 通过递归的使用Pointnet,把整体点云分成很多个小点云,提取局部空间特征
  • 通过Dropout与多尺度特征聚合来解决采样率不均匀的问题
  • 个人的一些思考:Pointnet虽然相比于voxel-based方法所占用内存更少,但是Pointnet在数据处理上有点浪费时间,包括FPS,近邻搜索等,每进行一次Pointnet计算就需要计算一次近邻搜索,不想voxel-based方法是规则存储的,进行卷积的时候不需要再去通过计算来寻找近邻。所以后面有一篇论文结合了Point-based与voxel-based的特点,叫PVConv,大家可以去看看。Pointnet++通过FPS方法进行Sampling,这容易受野点的影响。总而言之,Pointnet系列作为直接对点云进行处理的开山之作,其重要性还是不言而喻的。Pointnet系列也成了很多其他算法用来提取特征的常用的Backbone。
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值