PointNet 论文学习以及pytorch代码解读

论文部分


Abstract

以前的方法大多数将数据转换到3D体素格栅当中,但是这种方法会产生大量的不必要的数据,因此我们设计一种直接对点云进行处理的方法,这种方法最大程度上尊重了点云的不变性。

Introduction

因为点云数据是没有常规的结构,因此大部分研究者会将其转化到3D 体素格栅或者图中,但这样会产生大量冗余数据。

PointNet,需要尊重一个事实那就是点云只是一个点的集合,因此需要在计算时确保对称性来保证在改变其成员时不发生变化。同时刚体运动的进一步不变性也需要进行考虑

PointNet 的输入是点云,输出是整个点云的label或者是输入的每一个点的部分标签。其中网络的基本结构十分的简单,对于最初始的阶段每一个点都单独进行处理。在基础的设置中每一个点只通过一个简单的三维特征 ( x , y , z ) (x,y,z) (x,y,z)进行表示,可以通过计算法线和其他局部或全局特征来增加额外的维度。

模型的关键的地方是用了一个对称的max pooling。

可以在PointNet处理数据之前添加一个依赖数据的空间转换网络将数据规范化,这样可以有一个更好的结果

Problem Statement

3D点的表示格式为 { P i ∣ i = 1... n } \{P_i|i=1...n\} {Pii=1...n}其中 P i P_i Pi的表示格式为 ( x , y , z ) (x,y,z) (x,y,z),这只是最基础的坐标,可以在其基础上加上颜色、法线等参数。本文只使用最简单的 ( x , y , z ) (x,y,z) (x,y,z)

对于object classification 任务,输入点云要么是直接从物体形状中采样,要么是从场景点云中预分出来的。我们的网络输出 k k k个候选的物体的得分。对于semantic segmentation ,输入可以是一个单一的物体,用于分割其中的区域;或者是一个三维场景中的子体积,用于分割出物体区域。这个任务的输出是一个 n × m n\times m n×m的score 矩阵对应 n n n个点在 m m m个候选类上的概率

Deep Learning on Point Sets

PointNet 论文学习以及pytorch代码解读_第1张图片

Properties of Point Sets in R n R^n Rn

  • Unordered:不像点在图像或者几何格栅中那样,点云中的点是无序的。因此网络在对 N N N个点进行处理的时候有 N ! N! N!中输入数据的顺序。
  • Interaction among points:点在空间中是有距离概念的,这意味着点并不是孤立的,因此模型需要抓住点之间的局部结构和其对应的连接的特征。
  • Invariance under transformations:在特定的transformation下点应该拥有不变的特征表达。例如对全部点云进行平移或者旋转之后产生的结果不应该改变这个点云的类别或者改变对于点的类别的分割。

PointNet Architecture

我们的Net有三个关键地方:一个是max pooling 层用于对称作用,它可以将本地和全局的信息连接起来。还有两个连接对称网络将输入的点和点的特征连接起来。

Symmetry Function for Unordered Input

如果想要让模型在输入发生结构上的变化时让模型的结果不变,目前有三种方法:

  1. 将输入都变成一种典型的模式
  2. 将输入作为一个序列来训练RNN,同时不断改变输入的变化类型,确保包含了所有的可能类型
  3. 使用一个简单的对称函数来聚合每一个点的信息

但是在本篇论文中前两种方法行不通,首先第一个方法在高维度空间中不存在一个典型的输入格式,第二个方法则是输入的可能类型过多,占用的空间过大且训练速度过慢,且表现并没有第三种好。

因此本文模型采用一个近似的一个一般的对称的函数来定义点云。
f ( { x 1 , . . . , x n } ) ≈ g ( h ( x 1 ) , . . . , h ( x n ) ) f(\{x_1,...,x_n\})\approx g(h(x_1),...,h(x_n)) f({x1,...,xn})g(h(x1),...,h(xn))
其中 h h h表示一个mlp, g g g表示一个由一个变量组成的函数和max pooling函数。这一块是整个模型的关键

Local and Global Information Aggregation

上面那个模块的输出形成了一个 [ f 1 , . . . , f K ] [f_1,...,f_K] [f1,...,fK],这个是输入集的全局标签。我们可以训练一个SVM或者一个MLP来进行全局特征分类。然而Point Segmentation 需要对全局和局部信息的连接,因此需要一个简单但高效的方法

这里的全局信息主要是指通过max pooling后获得的一个全局特征(1 × \times × 1024),而局部信息则是每一个point的特征信息(n × \times × 1024)

根据Figure 2 中Segmentation Network 可以找到连接的方法

经过连接之后的网络就可以对全局特征和局部特征进行连接然后一起进行训练。

Joint Alignment Network

在经历点云的几何变换之后,点云的label应该不发生变化。为了解决这个问题采用了T-Net来处理点的坐标。T-Net的主要作用是学习出变化矩阵来对输入的点云或特征进行规范化处理。

T-Net具体如下:

首先将三通道的点云扩展为4D的张量。

随后利用1*1的卷积来实现全连接,每一层的的channels数分别为64-128-1024-512-256

之后将256维特征通过重新定义权重转化3*3的旋转矩阵输出

Conclusion

在这篇论文当中我们提出了一个全新的深度神经网络直接对点云进行处理。

定义权重转化3*3的旋转矩阵输出

Conclusion

在这篇论文当中我们提出了一个全新的深度神经网络直接对点云进行处理。


pytorch核心代码解读

本人阅读的代码是对ShapeNet数据集进行处理的pytorch实现代码,核心代码以及注释如下:
ShapeNetPointNet 论文学习以及pytorch代码解读_第2张图片
训练部分
PointNet 论文学习以及pytorch代码解读_第3张图片
模型结构
PointNet 论文学习以及pytorch代码解读_第4张图片
轻量网络STN-3d:STN-3d是对点的坐标进行处理,相对的STN-kd是对k维度的特征进行处理。
PointNet 论文学习以及pytorch代码解读_第5张图片
模型的损失函数:一部分是分类产生的损失,一部分是矩阵变换产生的损失
PointNet 论文学习以及pytorch代码解读_第6张图片

你可能感兴趣的:(pytorch,深度学习,人工智能)