论文笔记:DGCNN(EdgeConv)

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 X=x1,...,xnRF。最简单地情况下,F=3,即三维坐标。当然也可能包含额外的坐标,包含颜色、表面法线等等的信息。
  • 在一个深度神经网络中,后面的层都会接受前一层的输出,因此更一般的情况下,维度F也可以表示某一层的特征维度。
  • 假设给定一个有向图 G = ( ν , ϵ ) G = (\nu, \epsilon) G=(ν,ϵ),用来表示点云的局部结构,其中顶点为 ν = { 1 , . . . , n } \nu = \{1,...,n\} ν={1,...,n},而边则为 ϵ ∈ ν × ν \epsilon \in \nu \times \nu ϵν×ν。在最简单地情况下,我们建立一个KNN图G。假设距离点 x i x_i xi最近的点 x j i 1 x_{j_{i1}} xji1, …, x j i k x_{j_{ik}} xjik包含许多有向边缘 ( i , j i 1 ) , . . . , ( i , j i k ) (i, j_{i1}), ..., (i, j_{ik}) (i,ji1),...,(i,jik)
  • 我们定义边缘特征为: e i j = h Θ ( x i , x j ) e_{ij} = h_{\Theta}(x_i, x_j) eij=hΘ(xi,xj),其中 h Θ : R F × R F → R F ′ h_{\Theta}: \mathbb{R}^F \times \mathbb{R}^F \rightarrow \mathbb{R}^{F^{'}} hΘ:RF×RFRF,是一些使用一些可学习的参数 Θ \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) xi=j:(i,j)ϵhΘ(xi,xj)
  • 关于公式中的 h h h □ \square 有四种可能的选择:
    1. h Θ ( x i , x j ) = θ j x j h_{\Theta}(x_i, x_j) = \theta_j x_j hΘ(xi,xj)=θjxj,聚合操作采用求和操作: x i ′ = ∑ j : ( i , j ) ∈ ϵ θ j x j x_i^{'} = \sum_{j:(i, j)\in \epsilon} \theta_j x_j xi=j:(i,j)ϵθjxj
    2. h Θ ( x i , x j ) = h Θ ( x i ) h_{\Theta}(x_i, x_j) = h_{\Theta}(x_i) hΘ(xi,xj)=hΘ(xi),只提取全局形状信息,而忽视了局部领域结构。这类网络实际上就是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) hΘ(xi,xj)=hΘ(xjxi)。这种方式只对局部信息进行编码,在本质上就是将原始点云看做一系列小块的集合,丢失了原始的全局形状结构信息。
    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) hΘ(xi,xj)=hΘ(xi,xjxi),这样的结构同时结合了全局形状信息以及局部领域信息。
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} Xl={x1l,...,xnl}RFl,而 X 0 X^0 X0就是输入点云。
  • 实验表明,每次都重新计算每一层上的图中的点在特征空间中的最近邻点,是有用的。这也是动态图CNN与普通的图CNN的不同之处。
  • 因此,将包含了这样的图的网络命名为动态图CNN(Dynamic Graph CNN, DGCNN)。
    • 每一层都会得到一个不同的图 G l = ( ν l , ϵ l ) G^l = (\nu^l, \epsilon^l) Gl=(νl,ϵl)
    • 每一层的边缘特征为 ( i , j i 1 ) , . . . , ( i , j i k ) (i, j_{i1}), ..., (i, j_{ik}) (i,ji1),...,(i,jik),取决于点 x i l x_i^l xil k l k_l kl个最近邻的点 x j i 1 l x_{j_{i1}}^l xji1l, …, x j i k l x_{j_{ik}}^l xjikl
    • 更新公式: 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) xil+1=j:(i,j)ϵlhΘl(xil,xjl)
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) hl(xil,xjl)=h(xil,xjlxil),而这个函数是用一个多层感知机实现的,聚合操作 □ = m a x \square=max =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) h(xi,xj)=h(xi),仅仅考虑了全局几何信息而丢弃了局部信息。PointNet中的聚合操作 □ = m a x \square=max =max(或者 ∑ \sum ),其实就相当于全局最大池化(或平均池化)。
  • PointNet++试着通过在局部区域使用PointNet来提取点云的局部结构信息。PointNet++的边缘特征函数也是 h ( x i , x j ) = h ( x i ) h(x_i, x_j) = h(x_i) h(xi,xj)=h(xi),聚合操作也是最大池化。
  • 注:图神经网络这部分还不熟悉,先留个坑。
  • 下图显示了不同特征空间的距离,证实了在更深层上的距离也能在长距离范围内携带语义信息。

在这里插入图片描述

2.4、实验验证

2.4.1、分类任务
  • 分类结果:

在这里插入图片描述

  • 模型复杂度:

在这里插入图片描述

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

在这里插入图片描述

  • 不同K近邻值的情况:

在这里插入图片描述

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

在这里插入图片描述

2.4.2、分割任务
  • 分割结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 可视化结果:

在这里插入图片描述

  • 分割结果比较:

在这里插入图片描述

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

在这里插入图片描述

  • 在ShapeNet上的实验结果:

在这里插入图片描述

2.4.3、室内场景分割
  • 实验结果:

在这里插入图片描述

  • 分割结果对比:

在这里插入图片描述

3、参考资料

  1. Dynamic Graph CNN for Learning on Point Clouds
  • 42
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: Spark SQL是Apache Spark中的一个模块,它提供了一种基于结构化数据的编程接口。Spark SQL可以让用户使用SQL语句来查询数据,也可以让用户使用DataFrame API来进行数据处理和分析。Spark SQL支持多种数据源,包括Hive、JSON、Parquet等。Spark SQL还提供了一些高级功能,如支持用户自定义函数、支持分布式机器学习算法等。Spark SQL的目标是让用户能够方便地使用Spark进行数据处理和分析,同时提供高性能和可扩展性。 ### 回答2: Spark SQL是一个基于Spark平台的关系型数据处理引擎,它支持使用SQL语句和数据框架操作数据,可以轻松处理结构化和半结构化的数据。它可以从多个数据源中读取数据,包括Hive、JSON、Parquet、ORC等。通过Spark SQL,用户可以方便地使用SQL查询语言来分析和处理数据,大大降低了开发和组织数据流的难度。 Spark SQL主要有两种执行模式:SQL查询和DataFrame操作。其中SQL查询基于Hive的SQL语法解析器,支持HiveQL中的大多数语言特性(如UDF、窗口函数等)。在执行计划生成时,Spark SQL采用了Spark的计算引擎,支持各种Spark算子的优化,以便最大程度地提高查询性能。 另一种操作模式是使用DataFrame API,它可以灵活地进行数据转换和处理,并提供了类似于SQL的语法。与SQL查询不同,DataFrame API通过静态检查和编译器优化来避免由SQL查询引起的语法错误和潜在性能问题。 除了这两种基本的操作模式外,Spark SQL还提供了一些高级特性,如嵌套查询、表和视图、共享变量等。这些特性扩展了Spark SQL的功能,使得它可以更加灵活地进行数据处理和查询。 Spark SQL是Spark的重要组成部分,它在数据存储和处理方面提供了很多便利。通过最大程度地利用Spark引擎的优势,Spark SQL能够处理海量数据,并将其转换为有用的信息。这使得Spark SQL成为实现数据分析、机器学习和人工智能的重要工具之一。 ### 回答3: Spark SQL是一种基于Spark平台的数据处理引擎,它提供了高度优化的查询引擎和优秀的支持SQL语句的API。它允许用户使用SQL语句查询来处理大规模数据集,同时仍然支持复杂数据类型和计算。Spark SQL支持数据源,包括Parquet,Avro,JSON等一系列结构化的和半结构化的数据源。 Spark SQL在历史上是一个单独的模块,在Spark 2.0之后,它已经成为Spark的核心组件之一,可以直接在Spark核心API中使用,包括作为一个RDD库或DataFrame/DataSet的API。 Spark SQL的优点如下: 1. 它可以向受过传统SQL培训的用户展示更高级别,更强大的API。 2. 它提供数据集和RDD的良好互操作性。Spark SQL可以通过未被优化的RDD/DataSet API访问同一数据。 3. 它支持Spark的执行引擎以加速查询处理。 使用Spark SQL的时候,可以根据需要选择编程语言,如Scala,Java,Python,SQL等。在Spark核心API中,Spark SQL提供了两种API来处理结构化数据: 1. DataFrame API:DataFrame是具有许多操纵数据的功能的分布式数据集,类似于数据库中的表。 2. Dataset API:Dataset是Scala和Java API,它是类型安全的,并且提供与RDD API相同的API,但比RDD具有更好的性能和可读性。 Spark SQL是Spark生态系统中重要的组成部分之一。在处理大规模数据时,使用Spark SQL可以方便地利用Spark的强大功能,提高处理效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值