听祁芮中台对PointNet和PointNet++以及基于2D视锥对3D点云进行识别的talk笔记 学习笔记20220222

1原视频链接:https://www.bilibili.com/video/BV1As411377S/?spm_id_from=333.788.videocard.1

2此外还有一个带有一些对未来展望的视频:https://www.bilibili.com/video/BV1wA411p7FZ?from=search&seid=4429824535810365372&spm_id_from=333.337.0.0

3PointNet++详解与代码辅助学习:https://blog.csdn.net/cg129054036/article/details/105545895

 视频1是我现在毕设迫切需要的信息,所以在这里主要记录视频1的内容;

 视频2讲的更加宏观,在博士生涯上显得更加重要,可以二刷,但是短期内暂时不需要了解太多。

 

PointNet

PointNet最大的贡献在于它开拓并成为了当下最优秀的3D点云的深度学习框架,解决了很多Challenge。

  3D世界的信息表示有很多种方式,比如点云,栅格,多角度的图片等,但是3D点云是其中最简单,也是在物理设备中最直接能够获取的信息格式,比如激光雷达就能直接获取点云,所以选择了点云。而选择点云做深度学习的任务,会有很多局限性,PointNet一步一步解决了这些局限性。

Challenge1:点云点的位置的不对称性

  点云是由很多个点组成的,每个点的位置坐标都不一样。但是对于一个目标来说,我们希望我们用任何顺序输入点云数据,最后得到的输出都是一样的,也就是所谓的对称性。换句话说,点云的输入顺序有N!种,那么对于这N!种输入,我们都要得到相同的输出才对。

  而神经网络,本质上就是一个函数,如何让这个函数具有对称性?那就让这个函数是一个对称函数就行了。

  什么是对称函数?

    举个例子,比如对于n个数字,我们用最大值函数输出n个数字的最大值,或者用平均值函数输出n个数字的平均值,这些函数都与数据的输入顺序无关,因此被称为对称函数。

 

 

   问题在于,如何把对称函数的特性应用在神经网络?

  如果按上面的example,那么我们用max得到的就是点云中最远的点,如果用avg得到的就是物体的重心,完全丢失了原来数据的几何信息。

  于是,祁芮中台他们想出了一个办法,升维。

  升维为什么会解决基本完全丢失这些信息?

      因为高维空间,比如1000维的空间中,表示3维的点云中的点的信息,那么这个信息一定是冗余的。而我们就是要利用高维具有大量冗余信息这个特点,进行max的池化操作,这样就能大大减少池化层对于原来的信息的丢失。

  于是,最原始的PointNet结构出来了:

  首先,对于每一个点,我们对其进行升维操作,随后进行max池化,通过这两步,不仅解决了网络没有对称性的问题,同时让加入对称性网络后的数据输出大大保留了原始特征,最后再直接进入MLP中进行常规的深度学习训练即可。

 

 Challenge2:对于不同角度目标的变换

   对于一辆车,我们从不同视角获取它的点云,点云是不同的,但是我们希望不管从什么视角获取这辆车的点云,我们都希望神经网络认为这是一辆车。

  这里就要用到STN了,但是这又是一篇新的论文,我大致看了看,还没有细读,这里有一篇复现的博客:https://blog.csdn.net/zhuiqiuk/article/details/87286713

  STN这个网络最重要的功能就是把数据固定在了一个方向,比如:

  

 

    综合说:

      如果网络能够对经过平移、旋转、缩放及裁剪等操作的图片得到与未经变换前相同的检测结果,我们就说这个网络具有空间变换不变性(将平移、旋转、缩放及裁剪不变性统称为空间不变性)。具有空间变换不变性的网络能够得到更精确地分类结果。传统CNN网络的池化层具有平移不变性(网络在平移小于池化矩阵的范围时具有平移不变性。所以只有平移小于这个范围,才能保证平移不变性。),但是CNN网络对于大尺度的空间变换并不具备不变性。Spatial Transformer Networks提出的空间网络变换层,具有平移不变性、旋转不变性及缩放不变性等强大的性能。这个网络可以加在现有的卷积网络中,提高分类的准确性。

  而PointNet就是用了这个思想,做了几何变换。但是相对来说,点云里的矩阵变换更加容易,就是一个线性的矩阵乘法变换。

  除此之外,这个思想不只能是用于输入,他也可以用在中间的输出内容上,来提高模型的能力。

 

解决了以上两个Challenge,最传统的Pointnet架构就出来了,如下是解决点云物体的分类任务的架构:

 

 此外,PointNet当然可以用于分割:

 

 实际上类似分类。

所谓的分割,其实就是将全局的特征点找出来,让之前的所有点在分类后的全局特征中进行一下检索,看看单个点在全局特征中处于什么位置,那么它就属于哪一个类。最后对每一个连接起来的点进行MLP变换,最后就能实现场景的语义分割。

 

PointNet++

Pointnet的局限性在于,它不能提取局部特征,这也就决定了它不能进行比较复杂的3维场景的分析,而这也就是Pointnet++所要解决的问题。  

PointNet++主要对PointNet做了两个优化,一个是加入了提取局部特征的能力,使网络具有平移不变性;另一个是能够自适应密度提取。

Refinement1:提取局部特征

   用二维世界来举例:对于图中这个字母A,我们对其进行特征提取,选取一块区域进行特征提取,把一个区域的特征精炼到一个点,也就是X,Y,F,XY代表了这个精炼后的点的坐标,F则代表点的特征,也就是以前一组点的特征。XY在Euclidean space,而F在high-dim feature space中。而精炼的每一个点,都是用的一次pointnet的结果。

  

 

  之后,我们就会得到一组新的点,这组点往往少于源数据,但是它每一个点都代表了原来点周围的几何形状,这个过程被称为sample&group。

 

 

   这便是Pointnet++的主要思想,也因此可以构建出这个网络的架构:

 

   这里其实有点像卷积,只不过这个过程发生在三维。

  在卷积中,卷积核kernel越小,效果越好,比如在VGG中,大量应用了3x3的点。那么在pointnet++中是不是也有这个规律?

  并没有,这就涉及到另一个问题:点云的强不均匀问题。

Refinement2:自适应密度提取

   密度对于pointnet++来说非常重要,有个实验例子如下:

  可以看到,传统的Pointnet对密度的依赖一般,但是pointnet++对密度的依赖非常大,所以我们必须解决采样不均匀带来的问题。

  对于一个设备提取的点云,常常是近处密集,远处稀疏。那么用大核,近处不合适,因特征太多学不过来;用小核,远程不合适,因为极端情况可能只能采集到一个点,根本学不到点与点之间的几何信息,所以Pointnet++采用了自适应的学习方法。

  

 

   我们还是用二维例子来说明情况,二维例子确定一个区域需要圆心和半径,三维则是球心和半径。

  可以看到,当我们确定的区域中点集稀疏的时候,我们就选用更大的区域;而当我们确定的区域中点集密集的时候,我们就选择更小的区域,这样做到自适应密度的采样。

  有两种方案,MSG和MRG

  多尺度分组MSG:在处理输入的点集时,对于同一个中心,我们用不同尺度的网络,学习不同尺度下的特征,最后将它们联合起来,就是这一块区域的特征,大尺度小尺度都有。也就是说MSG实际上相当于并联了多个hierarchical structure,每个结构中心点不变,但是区域范围不同。

  多分辨率分组MRG:MSG很明显会影响降低运算速度,所以提出了MRG,这种方法应该是对不同level的grouping做了一个concat,但是由于尺度不同,对于low level的先放入一个pointnet进行处理再和high level的进行concat。

  采用了这个方案,大大提高了我们网络的鲁棒性,甚至丢失75%的点,我们仍然能保持很强的学习能力。

 

 Q&A:

1、所谓的点云中的关键点,也就是在特征提取中提供大部分特征的那些点,主要是能够描述物体骨架和轮廓的那些点。但是,这些点不是人为选取的,而是网络选取的,我们之所以能看到这些关键点是网络选取之后人为可视化出来的东西。

2、部件分割用的数据集是shapNet Part数据集;场景分割用的是S3Dis,ScanNet。

3、T-Net不是单独训练的网络,它是与后面的网络一起优化的。

4、PointNet++对T-Net不在依赖,因为PointNet++已经学习了局部特征,对于旋转这种事情不太敏感。

5、未来一个很重要的工作,如何把3D和2D信息整合在一起(数据孪生问题)。

posted @   爱和九九  阅读(897)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示