概要
今天主要来介绍一个基于点的深度学习网络 PointNet ,今天要介绍内容包括以下内容
- 简单聊一聊什么是点云、以及点云这种数据格式的特点以及应用场景
- 然后介绍 PointNet 如何解决置换不变性和旋转不变性的
- PointNet 网络架构,以及其不足之处
- PointNet++ 是如何解决 PointNet 存在的问题
Point Cloud
之前从事工作多半是和图像相关的。最近也是因为工作的关系逐渐接触到点云这样数据结构,以及一些基于点云数据的一些任务,例如点云的配准、基于点云的目标检测和点云语义分割。
在正式介绍 PointNet 网络前,我们简单介绍一下点云,先从 3D 表示方式来说起,说一说为什么最近 3D 点云这种数据格式逐渐成为大家认可的点云表示方式。
3D 表达方式
- 网格(mesh)
- 体素(Volumetric)
- 多视图(multi-view)
- 点云(Point cloud)
- 投影视图(Projected View RGB(D))
点云
点云直接从设备获取,点云对于原始表达方式更加简单、直观。在 Pointnet 出现之前,通常对于点云识别方式大概有几种,对于点云提取多个视角的视图,然后输入神经网络进行识别。或者将点云
- 点云没有拓扑结构
点云的应用
点云数据应用范围还是比较广泛
- 自动驾驶
- 机器人
- AR
- 医疗
- 3D 仿真
点云的获取
- 激光雷达直接获取
- RGBD摄像机可以通过射影几何方向推导出点云
xi=dicos(iωΔt)yi=disin(iωΔt)x_i = d_i cos(iomegaDelta t)
y_i = d_i sin(iomegaDelta t)
假设旋转速度为 ωomega ,每 ΔtDelta t 时间间隔测量一次,测量距离为 did_i 则可以得到一些列位置坐标(xi,yi)(x_i,y_i)
点云处理
- 点云分类
- 目标检测
- 点云的全语义分割
接下来介绍 PointNet 基本可以实现大部分点云上任务。
常用点云数据集
关于点云数据集,相对于 2D 图像数据集结构要复杂一些,又是由于点云数据集是相对比较新兴的事物,所以资源没有图像和语言那样丰富。
- scanNet
- kitti
点云面临的挑战
- 密集点云/稀疏点云,激光雷达近密度和远稀疏
- 没有结构化的数据,点与点之间没有依赖关系
- 无序性
PointNet
背景
在 PointNet 出现之前,还有没有一个网络是直接在 3D 点云上来做点云分类和点云语义分割的。都是要先将点云数据格式转换为体素或者多张不同角度(绕着目标获取一圈图像)观测到点云图像,然后基于体素来做 3D 卷积或者,基于多视图来做卷积来间接地利用点云数据进行点云分类和点云语义分割的工作。
主要是
- 基于卷积的方法(convolution-based method)
- 基于图的方法(graph-based method)
那么随着 PointNet 提出,这是一个不同以上两种方法的基于点云自身方法(Point-based method), PointNet 提出因为较少转换数据格式的环节,所以 PointNet 是一个端到端(end2end)的网络,而且可以将分类任务、目标检测以及语义分割任务统一在一个框架下,提出一个统一框架。
两个不变性
接下来我们结合点云自身特点来提出两个不变性,然后看一看在 PointNet 网络结构中,针对这两个不变性提出那些解决方案。
置换不变性
- 点云是点的集合,也就是由 N 个(x,y,z)来表示 N 点,这些点排列是没有顺序的,任意两个点交换位置不会影响其所表示 3D 物体的性质
- 针对点云置换不变性就应该采用对称函数
h(xi)h(x_i) 把空间中的一个点,映射到 1×m31 times m^3 这样网络,因为 hh 是 MLP 可以拟合任意一个函数,可以让 mm 任意高,这样一来可以拟合到更高维度空间,因为 mm
对称函数
f(x1,x2,…,xn)=f(xπ1,xπ2,…,xπn) xi∈RDf(x_1,x_2,dots,x_n) = f(x_{pi_1},x_{pi_2},dots,x_{pi_n}) , x_i in mathbb{R}^D
例如求和和求最大值的函数都是对称函数
f(x1,x2,…,xn)=max(x1,x2,…,xn)f(x_1,x_2,dots,x_n) = max(x_1,x_2,dots,x_n)
γg(h(x1),h(x2),…,h(xn))gamma g(h(x_1),h(x_2),dots,h(x_n))
- h(xi)h(x_i) 这里 hh 是一个共享函数,提供升维度(MLP)
- gg 是一个简单求最大值的函数(max pooling)
变换不变性
- 对点云进行旋转,主要要找到一个合适角点来输入
- Tnet 通过学到一个 3×33 times 3 的矩阵,就等价于对于点云进行校正
通过上图不难看出,PointNet 网络结构图并不复杂,主要以 MLP 结构为主,然后通过 max pool 来达到对称函数的效果。
网络结构输入就是点云的数据,未经过任何处理,也就是 n×3n times 3 数据,首先会经过一个 3×33 times 3 的旋转矩阵来调整观测角度。然后是 mlp 来实现升维的目的,这里 mlp 是共享的参数,就是对每一个点都用一套参数来实现对每一个点从 3 维度扩充到 64 维度。接下来还是一个 T-Net 这一回是 64×6464 times 64 的正交阵,所以具有下面
Lreg=∣∣I−AAT∣∣2L_{reg} = || I – AA^T||^2
约束条件,接下来还是一路 mlp 从 64 维经过 128 升到 1024 维,接下来再去做 max pool 保留每一个维度的最大值,这样一个向量作为全局特征来使用。如果只是对点云做分类任务,那么就可以利用 mlp 将 1024 维向量变换到要分类类别数量 k,最终这里的 k 是一个概率分布,给出点云属于某一个类型的概率。
如果做得任务不是简单分类任务,而是语义分割或者目标检测,我们需要对每一个点都给出一个预测类别时,就需要将之前的 n×64n times 64 和全局特征 1024 经过复制出 n 份后进行拼接。得到 n×1088n times 1088 维度,接下来还是 mlp 将每一个点的维度压缩最终输出 m 维度。
PointNet 的网络结构能够拟合任意的连续集合函数
这种变换在 pointNet++ 随后被弃用了,因为在 PointNet++ 中效果并不明显。
Robustness to Data Corruption
- Missing Data
- outlinear
- 只要主干点存在