【3D视觉】PointNet论文阅读

PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation, CVPR, 2017

论文地址

摘要

点云是一种重要的几何数据结构。由于其格式不规则,大多数研究人员会将此类数据转换为规则的三维体素网格或图像集合。然而,这会导致数据量过大并引发问题。本文设计了一种新型神经网络,它直接处理点云数据,并很好地保留了输入点的置换不变性。PointNet 网络为对象分类、部件分割和场景语义解析等应用提供了统一的架构。PointNet 虽然简单,但却高效且有效。经验表明,它的性能与当前最佳技术相当甚至更好。从理论上讲,我们分析了该网络学到了什么,以及为什么它能够抵御输入扰动和损坏。

引言

在本文中,主要探索了能够推理点云或网格等三维几何数据的深度学习架构。典型的卷积架构需要高度规则的输入数据格式,例如图像网格或三维体素,以便执行权重共享和其他内核优化。由于点云或网格并非规则格式,大多数研究人员通常会将此类数据转换为规则的三维体素网格或图像集合,然后再将其输入到深度网络架构中。然而,这种数据表示转换会导致生成的数据不必要地庞大,同时还会引入量化伪影,从而掩盖数据的自然不变性。因此,我们专注于使用简单的点云来表示三维几何体,并将得到的深度网络命名为PointNet。

引出方法

PointNet 是一个统一的架构,它直接将点云作为输入,并输出整个输入的类标签或输入中每个点的点段/部分标签。因为在初始阶段,每个点都以相同且独立的方式进行处理,所以网络的基本架构简单。在基本设置中,每个点仅由其三个坐标(x, y, z) 表示。可以通过计算法线和其他局部或全局特征来添加其他维度。

我们方法的关键在于使用单个对称函数-最大池化。实际上,网络会学习一组优化函数/标准,用于从点云中选择有趣或信息丰富的点,并编码选择这些点的原因。网络的最终全连接层将这些学习到的最优值聚合到如上所述的整个形状的全局描述符中(形状分类),或者用于预测每个点的标签(形状分割)。

由于每个点都独立变换,我们的输入格式易于应用刚性变换或仿射变换。因此,我们可以添加一个数据相关的空间变换网络,在 PointNet 处理数据之前尝试对其进行规范化,从而进一步提升结果。

对我们的方法进行了理论分析和实验评估。结果表明,我们的网络可以逼近任何连续的集合函数。更有趣的是,我们的网络能够学习用一组稀疏的关键点来概括输入点云,根据可视化结果,这大致对应于物体的骨架。理论分析解释了为什么PointNet 对输入点的微小扰动以及点插入(异常值)或删除(缺失数据)造成的损坏具有高度的鲁棒性。

相关工作

点云特征:现有的点云特征大多是针对特定任务手工设计的。点特征通常编码点的某些统计属性,并被设计为对某些变换具有不变性。这些变换通常分为内在特征和外在特征。它们也可以分为局部特征和全局特征。对于特定任务,找到最优的特征组合并非易事。

3D 数据上的深度学习:3D 数据具有多种流行的表示形式,从而导致各种学习方法。

  • Volumetric CNNs: [25, 15, 16]是将 3D 卷积神经网络应用于体素形状的先驱。然而,由于数据稀疏性和3D卷积的计算成本,体积表示受到其分辨率的限制。FPNN 和Vote3D 提出了特殊的方法来处理稀疏性问题;然而,由于它们的操作仍然基于稀疏的体,处理非常大的点云对它们来说具有挑战性。
  • Multiview CNNs: [20, 16]尝试将 3D 点云或形状渲染为 2D 图像,然后应用 2D 卷积网络对其进行分类。凭借精心设计的图像 CNN,这类方法在形状分类和检索任务上取得了显著的性能提升。然而,将它们扩展到场景理解或其他 3D 任务(例如点分类和形状补全)并非易事。
  • Spectral CNNs: :一些最新的研究[4, 14]在网格上使用Spectral CNN。然而,这些方法目前受限于流形网格(例如有机物体),而且如何将其扩展到非等距形状(例如家具)尚不明确。
  • Feature-based DNNs: [6, 8] 首先通过提取传统的形状特征将 3D 数据转换为向量,然后使用全连接网络对形状进行分类。我们认为它们受限于所提取特征的表征能力。

无序集上的深度学习: 从数据结构的角度来看,点云是一组无序的向量。虽然深度学习的大部分工作都集中在常规输入表示上,如序列(在语音和语言处理中)、图像和体积(视频或 3D 数据),但在点集方面的深度学习工作并不多。Oriol Vinyals 等人[22]最近的一项研究探讨了这个问题。他们使用带有注意力机制的读写网络来处理无序输入集,并证明了他们的网络具有对数字进行排序的能力。然而,由于他们的工作侧重于通用集合和 NLP 应用,因此缺乏集合中的几何作用。

问题陈述

在深度学习框架中直接将无序点集作为输入。点云表示为一组三维点{Pi | i = 1, …, n},其中每个点Pi都是其(x, y, z) 坐标加上颜色、法线等额外特征通道的向量。

对于物体分类任务,输入点云要么直接从形状中采样,要么从场景点云中预分割。我们提出的深度网络为所有k 个候选类别输出k 个分数。对于语义分割,输入可以是单个物体(用于部分区域分割)或 3D 场景的子体积(用于物体区域分割)。我们的模型将为 n 个点和 m 个语义子类别分别输出 n × m 个分数。

点集深度学习

PointNet网络架构受到在这里插入图片描述
中点集的属性的启发。

  1. Rn中点集的性质
    我们的输入是来自欧几里得空间的点的子集。它具有三个主要属性:
  • 无序。与图像中的像素阵列或体积网格中的体素阵列不同,点云是一组没有特定顺序的点。换句话说,一个处理 N 个 3D 点集的网络需要对输入集按数据输入顺序的 N! 种排列保持不变。
  • 点之间的相互作用。这些点来自具有距离度量的空间。这意味着点不是孤立的,相邻的点构成一个有意义的子集。因此,模型需要能够捕捉邻近点的局部结构,以及局部结构之间的组合相互作用。
  • 变换下的不变性。作为几何对象,学习到的点集表示应该对某些变换具有不变性。例如,旋转和平移点不应该改变全局点云类别,也不应该改变点的分割。
  1. PointNet 架构
    PointNet 架构
    PointNet 架构如图所示。分类网络以 n 个点作为输入,应用输入和特征变换,然后通过最大池化聚合点特征。输出是 k 个类别的分类分数。分割网络是分类网络的扩展。它连接全局和局部特征,并输出每个点的分数。“mlp”代表多层感知器,括号中的数字表示层大小。所有带有 ReLU 的层均采用 Batchnorm。分类网络中的最后一个 mlp 使用 Dropout 层。

PointNet 架构有三个关键模块最大池化层作为对称函数,用于聚合来自所有点、局部和全局信息组合结构以及两个同时对齐输入点和点特征的联合对齐网络

  • 无序输入的对称函数:为了使模型对输入的排列具有不变性,存在三种策略:1)将输入按规范顺序排序;2)将输入视为序列来训练 RNN,但通过各种排列来扩充训练数据;3)使用一个简单的对称函数来聚合来自每个点的信息。这里,对称函数将 n 个向量作为输入,并输出一个对输入顺序不变的新向量。例如,+ 和运算符是对称二元函数。
    【排序听起来像是一个简单的解决方案,但在高维空间中,实际上并不存在一般意义上相对于点扰动稳定的排序;使用 RNN 的想法是将点集视为一个序列信号,并希望通过于随机排列的序列训练RNN。但是 RNN 对于较小长度(几十个)序列的输入顺序具有相对较好的鲁棒性,很难扩展到数千个输入元素,而这是点集的常见大小。我们还通过实证研究证明,基于 RNN 的模型性能不如我们提出的方法。】
    我们的想法是通过对集合中的变换元素应用对称函数来近似在点集上定义的一般函数:
    在这里插入图片描述
    用多层感知器网络来近似h ,用单变量函数和最大池化函数的组合来近似g 。通过一组h,我们可
    以学习到多个f来捕捉集合的不同属性。

  • 局部和全局信息聚合:上一节的输出形成一个向量[f1, …, fK],它是输入集的全局特征。我们可以轻松地基于形状全局特征训练 SVM 或多层感知器分类器进行分类。然而,点分割需要结合局部和全局知识。我们的解决方案如图中Segmentation Network所示。计算出全局点云特征向量后,我们将其反馈给每个点云特征,方法是将全局特征与每个点云特征连接起来。然后,我们基于组合后的点云特征提取新的点云特征。

  • 联合对齐网络:如果点云经历某些几何变换,则点云的语义标记必须是不变的。因此,我们期望通过点集学习到的表示对这些变换具有不变性。一种自然的解决方案是在特征提取之前将所有输入集对齐到规范空间。Jaderberg 等人提出了空间变换器的概念,通过采样和插值来对齐二维图像,这通过在 GPU 上实现一个专门定制的层来实现。我们的点云输入形式使我们能够以更简单的方式实现这一目标。无需创建任何新的层,也不会像图像情况那样引入混叠。

    通过一个微型网络(图中的 T 网络)预测仿射变换矩阵,并将该变换直接应用于输入点的坐标。微型网络本身与大型网络类似,由点独立特征提取、最大池化和全连接层等基本模块组成。这个想法也可以进一步扩展到特征空间的对齐。我们可以在点特征上插入另一个对齐网络,并预测一个特征变换矩阵,以对齐来自不同输入点云的特征。然而,特征空间中的变换矩阵比空间变换矩阵的维数高得多,这大大增加了优化的难度。因此,我们在softmax训练损失中添加了一个正则化项。我们将特征变换矩阵约束为接近正交矩阵:
    在这里插入图片描述
    其中A是由微型网络预测的特征对齐矩阵。正交变换不会丢失输入中的信息,因此优化变得更加稳定,我们的模型获得了更好的性能。

实验

  1. PointNets 可应用于多种 3D 识别任务
    • 3D目标分类:在 ModelNet40形状上评估模型分类基准。共有 12,311 个 CAD 模型来自 40 个人造物体类别,其中训练集包含 9,843 个、测试集包含 2468 个。
      在这里插入图片描述
    • 3D目标部分分割:部分分割是一种具有挑战性的细粒度 3D 识别任务。给定一个 3D扫描或网格模型,任务是分配零件类别为每个点或面贴上标签(例如椅子腿、杯子把手)。对ShapeNet 部分数据集进行了评估,包含 16 个类别的 16,881 个形状,并带有注释共 50 个部分。大多数对象类别都标有两到五个部分。我们将部位分割定义为逐点分类问题。评估指标是点的最小交并比 (mIoU)。
      在这里插入图片描述
    • 场景中的实例分割:我们的网络部分分割可以轻松扩展到语义场景分割,其中点标签成为语义对象类别而不是对象部分标签。在Stanford 3D semantic parsing dataset上进行实验,该数据集包含来自 Matterport 的 3D 扫描6个区域共计271个房间的扫描仪。每个点扫描结果使用 13 个语义标签中的一个进行注释类别(椅子、桌子、地板、墙壁等以及杂物)。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  2. 架构设计分析
  • 与其他顺序不变方法的比较: 处理无序集合输入至少有三种方案。我们使用 ModelNet40 形状分类问题作为测试平台来比较这些方案,接下来的两个控制实验也将使用此任务。

    在这里插入图片描述
    我们比较的基线(如图所示)包括未分类和排序的多层感知器点为n×3数组、将输入点视为序列的RNN模型、基于对称函数的模型。

  • 输入和特征变换的有效性
    在这里插入图片描述

  • 鲁棒性测试
    在这里插入图片描述

  1. 可视化分析
    在这里插入图片描述
  2. 时间和空间复杂度分析
    在这里插入图片描述

结论

在这项工作中,我们提出了一种新颖的深度神经网络直接使用点云的 PointNet。我们的网络为多种 3D 识别提供统一的方法,包括对象分类、部分分割和语义分割,同时与标准基准相比,获得同等或更好的结果。

### 关于PointNet论文及其解读 PointNet 是一种用于处理无序点云数据的深度学习模型,它能够直接对三维点云进行操作并完成分类和分割任务。以下是有关 PointNet 的一些重要信息: #### 1. **PointNet 论文下载** PointNet 原始论文由 Charles R. Qi 等人在 2017 年发布,题目为《PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》[^1]。该论文可以在以下平台找到: - arXiv (https://arxiv.org/) - IEEE Xplore (如果需要正式出版版本) 可以通过搜索引擎输入关键词 “PointNet paper PDF” 找到免费资源。 #### 2. **PointNet 论文解读** 对于希望快速理解 PointNet 工作原理的人群来说,可以参考以下几篇高质量的博客文章或教程: - 第一篇解读涵盖了 PointNet 的核心思想以及其实现细节,特别是如何通过对称函数实现点集不变性[^2]。 - 另外一篇文章提供了更深入的技术剖析,并附带代码示例以便读者更好地理解和实践[^3]。 下面是一个简单的 Python 实现片段展示如何构建基本的 PointNet 架构来执行分类任务: ```python import torch.nn as nn import torch class TNet(nn.Module): def __init__(self, k=3): super(TNet, self).__init__() # 定义T-net结构... def forward(self, x): pass class PointNetCls(nn.Module): def __init__(self, num_classes=16): super(PointNetCls, self).__init__() self.transform_net = TNet(k=3) # 更多层定义... def forward(self, points): transformed_points = self.transform_net(points) # 继续前向传播过程... return output_logits model = PointNetCls(num_classes=40).cuda() print(model) ``` 此代码仅为框架示意,实际应用需补充完整逻辑与参数设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值