point_cloud_segmentation的发展过程

Brief

 入学第一个月的后半段除了帮老师翻译和跑了一些low_level的视觉程序,主要工作都在代码学习,detection系列,点云处理看了一些,但是并没有很深入。这篇blog主要是梳理一下前段时间看过的一些关于点云处理方面的深度学习的文章 。 肯定会有一些错误的理解和不足的地方,后面体会到了继续填这个坑。
 目前将3D数据引入深度学习领域的处理方法大概可以分成四类:

  • Multi-view,基于多视角的二维图进行学习
  • volumentric,体素,直接将二维的CNN引入三维
  • point cloud ,基于点云的处理方法。
  • 非欧式的处理方法,一些流型结构和graph等方法,三维点云表现为mesh结构。graph_learning。

 目前大致可以分成上诉的处理方法,就目前所读的论文几乎都是比较新的point_cloud方面的,因为17年的CVPR和NIPS上,Charles的pointnet和pointnet++可以直接应用于输入无序的点云数据集,不需要做预处理,且在语义分割上也达到了不错的效果。因此后续的研究很多都是基于他的工作。以下就按照四个部分进行梳理,不定期更新。

1 基于MV的3D

1.1 经历的过程

 先给出在3D数据的MV处理的文章和过程。首先是在ICCV15年的第一篇文章Multi-View Convolutional Neural Networks for 3D Shape Recognition;这里是其对应的paper Code;后面的内容我参照师兄的博客写。

1.2 《Multi-view Convolutional Neural Networks for 3D Shape Recognition》

 这是第一篇采用多视角来处理三维数据的paper,主要的创新点在于:
对3D数据的不用“视角”获得二维渲染图,再利用我们已经很成熟的二维的卷积训练渲染的不同视角的二维图,效果比当时直接采用3D数据的要好很多。当时直接处理3D数据需要很大的空间和算法复杂度,这么一采用视角就进一步的缩减了维度。整体架构如下图所示:
在这里插入图片描述

1.2.1 MVCNN贡献点

 文章中提到了通过多视角可以获得更多的特征信息,这就相当于在二维数据集训练前对数据做的’jittering’操作。**即对图像做的旋转,缩放,对称映射和平移等操作。**要如何结合这些多视角产生的特征数据呢?(后面解答)
 我们知道shapenet是第一个直接在3DCNN上处理点云的网络,在这之前不是用3D网路来提取特征,而是采用的"hand-designed"的方式人工设计的。其二在有监督的学习任务中,3D的数据很少,princeton大学Wu et al.建立的Modelnet只有150K包含40个类别的三维形状数据。其三,会存在维数灾难的问题。所以采用MV会带来的好处有:没有维数灾难,三维形状的渲染图可以直接与其他二维图像相比较。
 第二个可能考虑到的问题是,如何产生对应的视角渲染图。这里文章采用了两种视角初始化,

  • 其一是假设输入的3D形状是按照一个恒定的轴(Z-轴),这种情况下,我们每个3D形状产生了12张不同视角下的渲染图,也就是每30度,产生一个2D视角渲染图。如图1那样,相机“拍摄”时,是与水平面有30度的水平角(30 degrees from the ground plane)的,且径直指向3D网格数据的“中心”(centroid),这个中心的计算方法是,所有的网格面中心的权重加和,这个权重是各个网格面的面积。
  • 对于第二种视角初始化,此时就不假设3D形状沿着恒定的Z轴放置了。我们通过围绕3D形状生成20面体(icosahedron),将“相机”放在20面体的“vertices”上。每个相机在其“点位上”,有前后左右四个方向,也就是文章中所说的旋转0,90,180,270度方向再“拍摄”,每个“点位上”能够得到4个视角图。因此,最后共有80个视角图。
     这里我们来回答前面的坑:如何结合多视角的特征,这也是本文最重要的一个问题。文章提出了一种叫“view-pooling layer”的结构。如上图,对于每一个view我们都采用了一个CNN得到它的描述算子,最后通过一个叫做“view-pooling layer”的CNN架构去自动学习来结合多视角特征,得到一个单一的,简单的3D描述算子。在这里插入图片描述
    如上图所示,一个3D形状的 每一张视角图像 各自独立地经过第一段的CNN1卷积网络,在一个叫做View-pooling层进行“聚合”。之后,再送入剩下的CNN2卷积网络。 需要注意的几点是:
  • 文章第在对每一个的视角图像做CNN处理的CNN1参数是共享的。(表示使用的是同一个网络?)
  • 在这里的view-pooling层中采用的最大值操作,不是在hw面上,而是在通道层上做的,如师兄博客里面的这张图表示的含义:

在这里插入图片描述

1.3《Volumetric and multi-view cnns for object classification on 3D data》

这是一篇发布在CVPR2016上的文章,核心内容是在前人基于体素和多视角的研究上改进以提高网络对数据更高的识别度。
  这里是Paper Homepage
  这里是https://github.com/charlesq34/3dcnn.torch
本文依旧参考师兄的博客写笔记

1.3.1主要内容点

文章先是回顾了前人的一些工作,主要是在volumetric方面的3D-shapenets(后文会写到)和在Multi-views上(上面)的文章。

  • 文章提出了将2D引入3D时会出现的两个问题:一是additional computational complexity,而是点云数据具有的data-sparsity特性。
  • 文章一开始就对multi和3DCNN做了对比,分析了3DCNN为什么没有充分挖掘三维形状信息,后续是通过引入新的训练数据或则新的3DCNN结构来缩小和multi-view之间的差距。最后是测试了通过增加训练样本对multi-view的效果提升。
1.3.2 核心内容

 文章主要提出了两种volumentric CNN network architecture。这两种结构都在3D shape classfication中取得了很好的效果,缩小了和multi-view之间的差距。

  • 第一种方法是通过进一步解构出每个instance的细节特征,通过这些增加的更细节的数据来提高分类效果。
  • 第二种,采用的是long anisotropic kernels,即是各项异性核函数(直接理解成不是正方体的卷积核函数就好)

同样,作者也研究了对应的volume对结果的影响,发现因为 30 ∗ 30 ∗ 30 30*30*30 303030的分辨率太低了导致了CNN的表现不优秀。
下图显示了目前最新的3D CNNs: 3D ShapeNet在ModelNet40数据集上的分类精度,基于立体栅格的3D CNNs的结果比multi-view CNNs的结果低出7.3%。作者就猜想这两者之间的差距可能来源于两个因素:输入数据的分辨率(input resolution),以及网络架构的差异所以作者在差不多输入下做了multi-view在对由volume CNN输入的 30 ∗ 30 ∗ 30 30*30*30 303030的数据进行了采样,结果还是表示比multi-view要好很多,如下图。这就说明即使降低了分辨率,multi-view任然具有优势,因此说明volume CNN的架构有很大的改进空间。
在这里插入图片描述

改进内容

文章在下面三个方面对volume CNN进行了改进

  • 引入新的卷积网络结构
  • 训练数据增加
  • 特征池化

Network Architecture

  • 文章引入了两个网络,第一个是引入辅助训练任务来减小过拟合,这种辅助任务是使用部分数据来预测物体的类别。仅仅采用一部分来预测,可以避免过拟合。即使主任务过拟合了,由于辅助任务很难过拟合,因此,训练还可以继续。否则单一的主任务,一旦过拟合,训练就停止了。
    在这里插入图片描述
    如上图所示,这里先理解一下mlpconv结构,这个结构相当于是一次普通的卷积加上一个1 1 ∗ 1 1*1 11的卷积,如下图表示的形式;上图网络的头3层是mlpconv,相比较于标准的卷积层与池化层的组合,mlpconv层 有三层结构,如果在mlpconv层的中间有足够多的神经元的,它可以拟合几乎所有的函数。因此,mlpconv结构对于局部区域(local patch)特征的提取十分有效。还有,mlpconv结构比原来的convolution层加上pooling层有着更少的参数。在第四层,我们的网络结构分为两个分支。下面的分支输入进的是整个3D形状数据,来做经典的分类任务。 上面的分支是上述新加的辅助任务的分支,将 512 × 2 × 2 × 2 512×2×2×2 512×2×2×2这4D tensor切分成2×2×2=8个512维向量。切分的方法是,从每个方块的x,y,z坐标来看,坐标(x,y,z)=(1,1,1)的位置,共512个,这个组成一个vector; 同理有一个得到这样的8个vector。然后对每一个的vector都进行一个分类任务,每一个后面都接上一个40的神经元表示40个class,最后再用softmax计算分类的Loss。这样也就做到了局部预测分类,不容易收敛.这里可以反推回去每一个小的块(比如位置在(1,1,1))都是在原图中为 22 ∗ 22 ∗ 22 22*22*22 222222大小的区域。
    在这里插入图片描述
    带参数的mlopconv过程更加容易理解一些:
    在这里插入图片描述
  • 话说回来,第二个结构是模拟muti-view CNN的,这里是采用3D数据通过一个各向异性进行“探索”求得卷积,将3D数据投影到2D数据上,这种各向异性核函数能够把长距离的点编码在一起().之后一个2D图像的卷积网络用来对这些投影后的2D图像进行分类。注意到,投影模型、分类模型的训练是端到端的。 这里给一点直观的解释就是类似于2维的卷积操作,将3维信息直接压扁成2维的,但是这个2维是包含了三维图的特征结构的。采用各向异性核的原因是(减小参数,聚合长距离的关系,也就是通道间关系)。下面还是讲一下这个网络吧,就像是X-ray一样将3D到2D进行投影。如下图所示,我们的这个网络有两个模块,各向异性核探测模块,以及Network in Network模块。各向异性核探索模块包含3个被拉长的核的卷积层,每一个后面照例会有一个ReLU层。注意,每一层的输入输出都是3D tensor。在各向异性探索模块之后,我们用一个调整好的NIN网络来处理分类问题。

在这里插入图片描述

Data Augmentation and Multi-Orientation Pooling

  • 数剧增广,将数据从不同方向,不同高度旋转等操作

 由于从不同的方向获取不同的信息,我们的CNN网络对物体的方向是“sensitive”,敏感的。因此,我们增加一个方向池化阶段,将不同方向的信息进行pooling,以取得类似于方向不变性的性质。这和那个poinnet解决点云排列不变性很相似。
进行数据增光的原因有两点:

  • 在第一个辅助任务的网络中,不同的数据模型方向就对应了不同的subvolume;
  • 在第二个各向异性网络中,只有与各向异性核的长轴方向一致的voxels可以通过各向异性核进行长距离的特征的交互提取。

因此,将训练数据集从各个方向进行增广,从各个方向上提取特征,并通过多方向池化来结合就可以获得方向不变的特性。如下图所示,这个操作和mv-cnn很类似,从不同角度输入。再通过一个roi-pooling进行聚合.前面的CNN1是进行类似特征提取,后面的CNN2才是综合特征的高级学习阶段。这个网络称作MOVCNN,其权重由之前对比实验中的volumentric提供。一个常见的操作是,在提取多方向的高层特征后(就是在最后的线性分类层之前的特征),进行average或max或concatenate操作,然后用一个线性的SVM来训练这些多方向结合的特征,这只是MO-VCNN中的一个特例。
在这里插入图片描述

2 基于volume处理点云的文章

采用体素的方式类比二维视觉,但是这存在着至少三个问题:

  • 计算复杂度和储存压力大
  • 点云的稀疏性导致基于体素的方式可能不是很适用
  • 目前的数据集很少,基于体素的方法的网络结构也没有2D的丰富

 但是在15年第一篇直接采用体素表征3D数据的网络3DshapeNets问世,给3D视觉的研究给出了很大的方向。

2.1《3D ShapeNets: A Deep Representation for Volumetric Shapes》

2.2.1 Brief

原文在这里:3D ShapeNets: A Deep Representation for Volumetric Shapes
代码在这里:3D ShapeNets

2.2.2主要内容
  • 采用CAD数据作为训练数据,使用卷积DBN(深度信念网络)构建了3D ShapeNets,对深度相机获得的2.5D数据进行目标识别和3D复原

主要贡献点:

  • 种类识别。
  • 3D复原
  • 建立了modelNet 3D数据集

种类识别的网络结构:
在这里插入图片描述
前三层是卷积RBM,第四层是标准的具有1200节点的全连接RBM,最后一层的输入是标记和Bernoulli特征变量。训练模型的过程包括最大似然学习联合概率p(x,y),包括逐层预训练过程和全网络微调过程。预训练使用标准Contrastive Divergence 训练低四层RBM,Fast Persistent Contrastive Divergence训练最高层。微调时,使用wake-sleep算法。

2.5D识别与重建:
使用3D形状训练,对2.5D点云识别,先将2.5D深度图转换为volumetric表示,使用Gibbs 采样拟合后验概率p(y|x_o),如下图:
在这里插入图片描述
后面还有一个最佳的观测视角预测,采用的是最大化降低的熵是 y y y和新观测到点 x n i x_{n}^i xni的相互信息。效果如下:
在这里插入图片描述

2.2 《VoxNet: A 3D Convolutional Neural Network for Real-Time Object Recognition》

这也是一篇发在15年的文章,在IEEE/RSJ,机器人方面顶会IROS。
这里是 paper
这里是 code
我打算好好读一下这篇文章,因此看这里

3 基于点云的3D视觉

 基于点云结构文章就直接从17年的cvpr上的pointnet开始了直接处理点云,在之后的17年的NIPS上该组进一步工作解决了Pointnet无法结合局部结构的问题,提出了更加有效的PointNet++。之后很多文章都是在这个基础网络上进行的。

3.1 PointNet

这里是 paper
这里是 code
对原文的解读,知乎和博客都很多,这一篇知乎上的很好。

3.2 Pointnet++

这里是 Paper
这里是 code
其实Pointnet++就是在pointnet基础上进一步延伸,采用pointnet的结构对局部特征进行提取,文章主要有两个亮点,其一是采用最远点采样后的不均匀样本的多尺度结合,其二就是有局部特征。翻译博客,简单的理解可以看这里

3.3Frustum-PointNet

还是该组的一篇进一步的研究,发布在CVPR2018上:
这里是 paper
这里是 code
主要内容:

3.4 SGPN

3.5 RsNet

3.6 FCPN

4 基于mesh结构的3D视觉

这个报错通常是因为编译器找不到 pcl/point_cloud.h 头文件。解决方法如下: 1. 确认 PCL 已经正确安装并配置好了环境变量。如果你是在 Linux 系统上使用 PCL,可以执行以下命令确认 PCL 是否已经安装: ``` dpkg -l | grep libpcl ``` 如果已经安装了 PCL,会输出类似以下信息: ``` ii libpcl-all x.x-1 amd64 Point Cloud Library - metapackage depending on all libraries ii libpcl-apps x.x-1 amd64 Point Cloud Library - tools and applications ii libpcl-common x.x-1 all Point Cloud Library - common files ii libpcl-dev x.x-1 amd64 Point Cloud Library - development files ii libpcl-doc x.x-1 all Point Cloud Library - documentation ii libpcl-features1.7 x.x-1 amd64 Point Cloud Library - feature estimation library ii libpcl-filters1.7 x.x-1 amd64 Point Cloud Library - filtering library ii libpcl-io1.7 x.x-1 amd64 Point Cloud Library - I/O library ii libpcl-kdtree1.7 x.x-1 amd64 Point Cloud Library - kd-tree library ii libpcl-keypoints1.7 x.x-1 amd64 Point Cloud Library - keypoint detection library ii libpcl-ml1.7 x.x-1 amd64 Point Cloud Library - machine learning library ii libpcl-octree1.7 x.x-1 amd64 Point Cloud Library - octree library ii libpcl-outofcore1.7 x.x-1 amd64 Point Cloud Library - outofcore library ii libpcl-people1.7 x.x-1 amd64 Point Cloud Library - people library ii libpcl-recognition1.7 x.x-1 amd64 Point Cloud Library - object recognition library ii libpcl-registration1.7 x.x-1 amd64 Point Cloud Library - registration library ii libpcl-sample-consensus1.7 x.x-1 amd64 Point Cloud Library - sample consensus library ii libpcl-search1.7 x.x-1 amd64 Point Cloud Library - search library ii libpcl-segmentation1.7 x.x-1 amd64 Point Cloud Library - segmentation library ii libpcl-stereo1.7 x.x-1 amd64 Point Cloud Library - stereo library ii libpcl-surface1.7 x.x-1 amd64 Point Cloud Library - surface library ii libpcl-tracking1.7 x.x-1 amd64 Point Cloud Library - tracking library ii libpcl-visualization1.7 x.x-1 amd64 Point Cloud Library - visualization library ``` 2. 确认编译器的 include 路径中包含了 PCL 的头文件路径。在 Linux 系统上,可以执行以下命令查看 include 路径: ``` echo | gcc -E -Wp,-v - ``` 会输出编译器的 include 路径,确认其中是否包含了 PCL 的头文件路径。 3. 确认代码中正确包含了 pcl/point_cloud.h 头文件。在代码中应该使用以下语句来包含该头文件: ``` #include <pcl/point_cloud.h> ``` 如果以上步骤都已经确认无误,但仍然出现找不到头文件的报错,可能是其他问题导致的,可以尝试重新安装 PCL 或者检查代码中是否有其他错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值