CVPR 2020 论文阅读笔记(三维点云/三维重建)

2020/10/15:PF-Net: Point Fractal Network for 3D Point Cloud Completion

论文地址:https://arxiv.org/abs/2003.00410
前置文章:10/16、10/17、10/18

本文提出了Point Fractal Network(PF-Net),旨在从不完整的点云数据中恢复点云,克服了之前方法修改现有数据点、引入噪声和产生几何损失的缺点。

由前置文章可知,之前的点云修复方法是输入不完整的点云,输出完整的点云,但这样会导致原有信息的缺失。这篇文章提出PF-Net,主要特点有三个:

  1. 输入不完整的点云,输出缺失部分,避免信息丢失。
  2. 通过多分辨率的编码器来提取不同分辨率的特征。
  3. 使用点金字塔解码器,输出由粗到精的修复结果。
  4. 同时使用完整性损失和对抗损失来减少物体的畸变问题。

网络的整体结构如下:


网络详细推理步骤如下:

  1. 使用PointNet++中提到的IFPS方法将点云进行下采样,得到不同分辨率的点云(分别以黄、红、蓝表示)。
  2. 对每种分辨率的点云,使用提出的CMLP来提取特征。作者提到在L-GAN和PointNet中,模型的结果过于依赖max pooling之后的特征维度。这是由于MLP不能很好地学习到低层次和中层次的特征。作者提出的CMLP,首先将每个点坐标编码成[64-128-256-512-1024]维,然后提取后面四个维度的特征做max pooling,最后将得到的特征拼接起来,得到1920维的特征,这样就可以同时利用多个层次的特征。
  3. 将三种分辨率的点云的特征拼接起来,得到1930×3的特征,然后再经过MLP,得到1920×1的特征。
  4. 将特征通过PPD得到三种分辨率的点云修复结果,其中PPD的具体结构如下图所示:


损失函数使用完整性损失和对抗损失的加权平均,完整性损失使用L-GAN中提出的CD距离:




对抗损失使用GAN中常见的损失函数


感觉这篇文章对多尺度的运用非常极致,在编码器、解码器和CMLP中都应用了这种思想,最后的效果也非常不错,很值得借鉴。

2020/10/16:PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

论文地址:https://arxiv.org/abs/1612.00593

PointNet提出一种基础的网络结构,可以用于点云分类、部分分割和语义分割等多种任务。在这篇文章之前,点云数据的处理方式是将点云数据转换为多个二维的视图或三维的体素形式,然后应用2D/3D CNN进行处理,但这样引入了多余的体积,效率不高。本文是第一个直接使用点云数据的神经网络。(其实可以这样类比,在二维图像处理中,假设图像是二值化的,传统方法是将这个图像直接丢到CNN里面,但如果背景特别多会比较浪费资源。直接使用点云数据相当于直接将前景像素的坐标输入到神经网络里面,对稀疏数据会有比较好的性能,但因为以下三个问题导致直接使用坐标信息比较困难)
由于点云的排列是无序的(可以想象,点云中任意一点排在前面对点云的表达都是相同的)、点云之间是有相互作用的(相邻的点云才能构成形状)、点云在某些变换下具有不变性(比如旋转不会改变点云的类别)这些特性,要求神经网络既能处理无序的数据,又能捕捉全局的结构特征,同时对刚性变换不敏感。基于这些条件,作者提出了如下的网络结构:



可以简要分析一下网络的工作流程,以点云分类问题为例:

  1. 输入数据,维度为n*3。(每个点有x,y,z三个坐标)
  2. 将输入通过一个T-Net,得到一个变换矩阵,将原始数据与变换矩阵相乘,即可得到变换后的数据。这一步的目的是为了使网络对刚性变换不敏感。比如一个任意旋转过的椅子,可以给他规定一个正确的方向,然后训练一个神经网络得到一个变换矩阵,将椅子旋转到正确的方向,这样网络每次输入的数据就相当于没有变换过的数据。T-Net的设计思路和大网络相似。
  3. 对每个点数据经过全连接层提取特征,这里的全连接层在所有点上共享。
  4. 在feature维度上再进行一次2中的变换,再通过全连接提取特征。
  5. 在n的维度上做最大池化,这里是为了整合所有点的信息,同时也满足了无序性,因为点的输入顺序对最大池化来说是没有影响的。
  6. 全连接,得到k个类别的评分。

感觉网络的结构虽然简单,但是却很好地满足了点云数据自身特性对神经网络的要求。而且我觉得在图像处理中,也有时候必须用到坐标信息或者一些标量特征,这篇文章的方法对于怎样将这些特征融合进CNN里面也有一定的启发意义。

2020/10/17:Learning Representations and Generative Models for 3D Point Clouds

论文地址:http://proceedings.mlr.press/v80/achlioptas18a.html

这篇文章的主要工作是:

  1. 提出一种点云的自动编码器表示,将点云数据表示到低维的空间中去。
  2. 提出了针对点云的生成模型。
  3. 提出并了衡量两个点云相似程度的指标。

首先来看衡量两个点云相似程度的指标部分,作者首先给出了两个距离,EMD和CD:


在计算上,CD更为简便,而且EMD是不可导的。

基于这两种距离,作者引入了三种衡量两个点云相似程度的指标:JSD、Coverage和MMD:


定义了指标后,就可以实现自动编码器和生成模型了。作者提到了四种结构,分别是:

  1. 自动编码器(AE):其分为编码器和解码器,编码器将点云数据转化为低维表示,解码器将低维表示转化回点云数据,通过MMD-CD或MMD-EMD训练自动编码器。
  2. 原始GAN(R-GAN):利用原始点云数据训练的GAN,生成器采用和1中解码器类似的结构,接受一个随机向量,输出一个点云数据的表示,然后和真实的点云数据一起训练判别器。
  3. 隐空间GAN(L-GAN):生成器不直接生成点云数据,而是生成点云数据经过AE的隐空间低维表示,然后再利用解码器解码成点云数据。作者实验验证L-GAN的效果要好于R-GAN。
  4. 高斯混合模型(GMM):通过高斯混合模型学习AE的隐空间低维表示,然后从这个GMM中采样得到新的低维表示,再经过解码器即可得到生成的点云数据。作者实验验证这种方法的效果甚至优于GAN,证明传统方法的效果不一定比神经网络差。

作者同时验证了AE的一些其他功能,比如如果给AE的编码器输入不完整的点云数据,即可训练得到点云复原的模型。使用SVM对低维表示进行分类,即可进行点云分类的任务,证明AE在点云数据形式中的潜在应用较为广泛。

2020/10/18:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

论文地址:http://papers.nips.cc/paper/7095-pointnet-deep-hierarchical-feature-learning-on-point-se

PointNet++针对PointNet提取局部信息能力不强的弊端,提出了一种层次神经网络,可以更好地提取局部信息。其中心思想是将整个点云分割成若干个小部分来提取信息,然后将每个小部分整合成较大的部分,提取更高层次的信息。类似于CNN中卷积和下采样的思想。首先来看网络结构图:



网络大概可以分为两个部分,左边是层次的点云特征提取网络,右边是针对不同任务的解码网络。
特征提取分为若干个set abstraction模块,每个模块又分为采样层、分组层和特征提取层。

  1. 采样层:这一层从点云数据中提取一个点集作为小区域的中心点,这里使用的是PF-Net中也用到的FPS算法,具体算法步骤为:
    假设一共有n个点,整个点集为N = {f1, f2,…,fn}, 目标是选取n1个起始点做为下一步的中心点:
    随机选取一个点fi为起始点,并写入起始点集 B = {fi};
    选取剩余n-1个点计算和fi点的距离,选择最远点fj写入起始点集B={fi,fj};
    选取剩余n-2个点计算和点集B中每个点的距离, 将最短的那个距离作为该点到点集的距离, 这样得到n-2个到点集的距离,选取最远的那个点写入起始点B = {fi, fj ,fk},同时剩下n-3个点, 如果n1=3 则到此选择完毕;
    如果n1 > 3则重复上面步骤直到选取n1个起始点为止。
    (该部分为转载,转载地址)
  2. 分组层:对每个中心点,选取一个半径R,将与该点距离小于R的点分为一组,使用PointNet提取组内特征,作为下一层该中心点的输入特征。但作者提到,因为点云各部分密度不同,这种固定半径的做法可能导致信息不完整,所以提出了两种改进策略:MSG和MRG,如图所示:



    MSG直接选取不同的半径提取特征,然后将特征拼接。
    MRG先将大区域分成几个小区域,将小区域的特征直接相加作为最终特征的第一部分。然后将大区域的特征全部通过PointNet作为最终特征的第二部分。
    MSG思想简单但计算量较大,MRG的计算量较小,比较合适。

  3. 特征提取层:使用PointNet对分组过后的点云数据进行特征提取。

得到了较高层次的特征后,对不同的任务需要不同的解码网络。对分类网络来说比较简单,使用全连接即可。对分割网络来说,由于对每个点都需要输出数值,则需要类似上采样的操作。具体的实现作者使用了插值的方法,将较少的点插值到较多的点上去。首先找到插值的目标坐标,然后寻找K个距离最近的已知点,以距离的倒数作为权重,将K个点的特征做加权平均,作为这个点的特征。然后使用之前特征提取中得到的该点的特征与当前特征做一个拼接,即可得到最终特征(类似U-Net的skip connection)。公式如下:


感觉这篇文章和PF-Net的思想差不多,都是希望提取多尺度的特征。但是思路不一样,都值得借鉴。

你可能感兴趣的:(CVPR 2020 论文阅读笔记(三维点云/三维重建))