论文笔记:DGCNN(EdgeConv)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongbin_xu/article/details/85258278

Dynamic Graph CNN for Learning on Point Clouds

DGCNN

1、四个问题

  1. 要解决什么问题?

    • 使用深度学习处理3D点云。

    • 设计一个可以直接使用点云作为输入的CNN架构,同时可以获取足够的局部信息,可适用于分类、分割等任务。

  2. 用了什么方法解决?

    • 提出了一个新的神经网络模块——EdgeConv。
    • EdgeConv是可微的,并能嵌入已有的网络架构中。
    • EdgeConv的优点:
      1. 包含了局部领域信息;
      2. 通过堆叠EdgeConv模块或循环使用,可以提取到全局形状信息;
      3. 在多层系统中,特征空间中的相对关系包含了语义特征。(注:点云中形状近似的部分,在特征空间中距离较小。)
  3. 效果如何?

    • 在标准数据集ModelNet40和S3DIS上取得了state-of-the-art的效果。
  4. 还存在什么问题?

    • EdgeConv考虑了点的坐标,与领域点的距离,忽视了相邻点之间的向量方向,最终还是损失了一部分局部几何信息。

2、论文概述

2.1、简介

在这里插入图片描述

  • 最近的算法倾向于搜索点云中的语义线索和一致性,而不是像角点和边缘点这样显著的几何特征。仅仅通过传统方法如计算或者微分这类的方法提取的几何信息显然不够用,所以现在更多地需要基于学习的方法(源自于通过对有标签或无标签的数据集的统计分析得到的相关信息)。
  • 文中主要考虑点云分类和分割任务。
  • 传统的解决办法是,提取handcrafted的特征来获取点云的几何信息。
  • 近来,深度学习在图像处理领域的大获成功,催化了使用数据驱动方法来从点云学习特征的研究。
  • 由于常规的深度网络的输入都是规则结构的数据,而点云则是不规则的数据:每个点在空间中都是连续分布的,并且任何点在顺序上的置换都不会改变空间分布。
  • 一类常用的方法是,将点云转换为volumetric representation(体表示),也就是3D网格,随后便可以采用3D的CNN网络来提取特征。
    • 然而,这种方法会造成quantization artifacts,和额外的内存占用,导致难以提取高分辨率或者细粒度特征。
  • 另一类方法,则是可以直接将不规则的点云作为输入的深度网络,即PointNet系的网络。
    • PointNet,通过独立地处理每个点,能实现置换不变性(permutation invariance)。随后使用一个对称函数(symmetric function)来聚合特征。
    • 之后,一些基于PointNet的改进网络会考虑点的局部特征,而不是分开处理。这样可以让网络提取到局部特征,提高模型的性能。
    • 然而这类算法,在处理局部区域的点的时候为了保证置换不变性,而导致过于独立。这样会忽视点之间的几何相关信息,导致丢失一部分局部特征信息。
  • 为了解决这个问题,就提出了EdgeConv,在保证置换不变性的同时捕获局部几何信息。
  • 贡献:
    1. 提出了一个新的操作,EdgeConv,可以直接在点云上操作。EdgeConv能在在保证置换不变性的同时捕获局部几何信息。
    2. DGCNN模型可以在动态更新图的同时,在语义上将点聚合起来。
    3. EdgeConv可以被集成,嵌入多个已有的点云处理框架中。
    4. 使用EdgeConv搭建的DGCNN网络,在多个基准数据集上取得了state-of-the-art的效果。

2.2、方法

2.2.1、Edge Convolution

在这里插入图片描述

  • 假设一个F维点云有n个点,定义为: X = x 1 , . . . , x n R F X={x_1, ..., x_n} \in R^F 。最简单地情况下,F=3,即三维坐标。当然也可能包含额外的坐标,包含颜色、表面法线等等的信息。
  • 在一个深度神经网络中,后面的层都会接受前一层的输出,因此更一般的情况下,维度F也可以表示某一层的特征维度。
  • 假设给定一个有向图 G = ( ν , ϵ ) G = (\nu, \epsilon) ,用来表示点云的局部结构,其中顶点为 ν = { 1 , . . . , n } \nu = \{1,...,n\} ,而边则为 ϵ ν × ν \epsilon \in \nu \times \nu 。在最简单地情况下,我们建立一个KNN图G。假设距离点 x i x_i 最近的点 x j i 1 x_{j_{i1}} , …, x j i k x_{j_{ik}} 包含许多有向边缘 ( i , j i 1 ) , . . . , ( i , j i k ) (i, j_{i1}), ..., (i, j_{ik})
  • 我们定义边缘特征为: e i j = h Θ ( x i , x j ) e_{ij} = h_{\Theta}(x_i, x_j) ,其中 h Θ : R F × R F R F h_{\Theta}: \mathbb{R}^F \times \mathbb{R}^F \rightarrow \mathbb{R}^{F^{'}} ,是一些使用一些可学习的参数 Θ \Theta 构成的非线性函数。
  • 最后在EdgeConv操作上添加一个通道级的对称聚合操作 \square ,完整公式为: x i = j : ( i , j ) ϵ h Θ ( x i , x j ) x_i^{'} = \square_{j:(i, j)\in \epsilon} h_{\Theta} (x_i, x_j)
  • 关于公式中的 h h \square 有四种可能的选择:
    1. h Θ ( x i , x j ) = θ j x j h_{\Theta}(x_i, x_j) = \theta_j x_j ,聚合操作采用求和操作: x i = j : ( i , j ) ϵ θ j x j x_i^{'} = \sum_{j:(i, j)\in \epsilon} \theta_j x_j
    2. h Θ ( x i , x j ) = h Θ ( x i ) h_{\Theta}(x_i, x_j) = h_{\Theta}(x_i) ,只提取全局形状信息,而忽视了局部领域结构。这类网络实际上就是PointNet,因此PointNet中可以说使用了特殊的EdgeConv模块。
    3. h Θ ( x i , x j ) = h Θ ( x j x i ) h_{\Theta}(x_i, x_j) = h_{\Theta}(x_j - x_i) 。这种方式只对局部信息进行编码,在本质上就是将原始点云看做一系列小块的集合,丢失了原始的全局形状结构信息。
    4. 第四种,也是文中采用的, h Θ ( x i , x j ) = h Θ ( x i , x j x i ) h_{\Theta}(x_i, x_j) = h_{\Theta}(x_i, x_j - x_i) ,这样的结构同时结合了全局形状信息以及局部领域信息。

2.2.2、动态图CNN

  • 假设第l层的输出为 X l = { x 1 l , . . . , x n l } R F l X^l = \{ x_1^l, ..., x_n^l \} \subseteq \mathbb{R}^{F_l} ,而 X 0 X^0 就是输入点云。
  • 实验表明,每次都重新计算每一层上的图中的点在特征空间中的最近邻点,是有用的。这也是动态图CNN与普通的图CNN的不同之处。
  • 因此,将包含了这样的图的网络命名为动态图CNN(Dynamic Graph CNN, DGCNN)。
    • 每一层都会得到一个不同的图 G l = ( ν l , ϵ l ) G^l = (\nu^l, \epsilon^l)
    • 每一层的边缘特征为 ( i , j i 1 ) , . . . , ( i , j i k ) (i, j_{i1}), ..., (i, j_{ik}) ,取决于点 x i l x_i^l k l k_l 个最近邻的点 x j i 1 l x_{j_{i1}}^l , …, x j i k l x_{j_{ik}}^l
    • 更新公式: x i l + 1 = j : ( i , j ) ϵ l h Θ l ( x i l , x j l ) x_i^{l+1} = \square_{j:(i, j)\in \epsilon^l} h_{\Theta}^l (x_i^l, x_j^l)

2.2.3、实现细节

  • 网络结构见下图:

在这里插入图片描述

  • 整体的网络结构与PointNet的很类似,都使用了一个空间变换单元,最后计算了一个全局信息。
  • 分类网络中包含了两个EdgeConv层,后面接上了一个池化操作和3个全连接层,然后得到分类结果。
  • 分割网络使用了三个EdgeConv层,后面接上了三个全连接层,最后每个点都会输出一个预测分数。
  • 对于每个EdgeConv模块,我们都是用共享边缘函数: h l ( x i l , x j l ) = h ( x i l , x j l x i l ) h^l(x_i^l, x_j^l) = h(x_i^l, x_j^l-x_i^l) ,而这个函数是用一个多层感知机实现的,聚合操作 = m a x \square=max 即为最大池化。
  • KNN图中的K值是一个超参,分类网络中K=20,而在分割网络中K=30。

2.3、与其他方法比较

  • 主要跟两类方法做对比:一个是PointNet系列,一个是图CNN系列。
  • PointNet是我们的网络的一种特殊情况,即取KNN图的K=1,即图中的边都为空。PointNet中的边缘特征函数为 h ( x i , x j ) = h ( x i ) h(x_i, x_j) = h(x_i) ,仅仅考虑了全局几何信息而丢弃了局部信息。PointNet中的聚合操作 = m a x \square=max (或者 \sum ),其实就相当于全局最大池化(或平均池化)。
  • PointNet++试着通过在局部区域使用PointNet来提取点云的局部结构信息。PointNet++的边缘特征函数也是 h ( x i , x j ) = h ( x i ) h(x_i, x_j) = h(x_i) ,聚合操作也是最大池化。
  • 注:图神经网络这部分还不熟悉,先留个坑。
  • 下图显示了不同特征空间的距离,证实了在更深层上的距离也能在长距离范围内携带语义信息。

在这里插入图片描述

2.4、实验验证

2.4.1、分类任务

  • 分类结果:

在这里插入图片描述

  • 模型复杂度:

在这里插入图片描述

  • 网络中不同组件的有效性:

在这里插入图片描述

  • 不同K近邻值的情况:

在这里插入图片描述

  • 不同点数下模型的性能:

在这里插入图片描述

2.4.2、分割任务

  • 分割结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 可视化结果:

在这里插入图片描述

  • 分割结果比较:

在这里插入图片描述

  • 验证时随机丢弃一些点的分割结果:

在这里插入图片描述

  • 在ShapeNet上的实验结果:

在这里插入图片描述

2.4.3、室内场景分割

  • 实验结果:

在这里插入图片描述

  • 分割结果对比:

在这里插入图片描述

3、参考资料

  1. Dynamic Graph CNN for Learning on Point Clouds

猜你喜欢

转载自blog.csdn.net/hongbin_xu/article/details/85258278