3D数据的处理历史:
Mesh(2006)
由三角面片和正方形面片组成,其来源于多边形网格。多边形网格由一组带公共顶点的凸多边形表面组成,可近似一个几何表面。我们可以将点云看作是从基础的连续集合表面采样得到的三维点集;多边形网格则希望通过一种易于渲染的方式来表示这些基础表面。尽管多边形网格最初是为计算机图形学设计的,但它对于三维视觉也十分有用。我们可以通过几种不同的方法从点云中得到多边形网格,其中包括 Kazhdan 等人于 2006 年提出的「泊松表面重建法」。
multi-view CNN(2015)
使用三维数据的多视图表示是将二维深度学习技术应用到三维场景下的最简单的方式。这是一种将三维感知问题转化为二维感知问题的明智做法,但它仍然在某种程度上允许你对物体的三维几何结构进行推理。早期的利用这种思想的基于深度学习的工作是 Su 等人在 2015 年提出的 multi-view CNN。
这是一种简单却十分有效的网络架构,它可以从三维物体的多个二维视图中学到特征描述符。实现这种方法与对目标分类任务使用单个二维图像相比,提高了模型的性能。这种方法通过将一张张图像输入在 ImageNet 上预训练好的 VGG 网络,从而提取出显著的特征、将这些结果向量组合在一起,并且将这些信息传递给其余的卷积层进行进一步的特征学习得以实现。
然而,multi-view 图像表示仍然有很多的局限性。主要的问题是你并没有真正在三维环境下学习,固定数量的二维视图仍然只是一个对于底层的三维结构的不完美的近似。因此,像语义分割这样的任务,特别是在跨越更复杂的物体和场景时,就会因为从二维图像中获得的特征信息有限而变得具有挑战性。此外,这种可视化三维数据对于像自动驾驶和虚拟现实这样计算开销非常大的任务来说是不可扩展的。请记住,生成多视图表示需要渲染一个完整的三维模型并且模拟一些任意的视点。多视图学习仍然有许多缺陷,这些缺陷促使人们研究直接利用三维数据进行学习的方法。
VoxNet(2015)
通过体素网格进行学习可以解决多视图表示的主要缺点。体素网格缩小了二维和三维之间的差距,它们是最接近图像的三维表示形式,这使得二维深度学习的概念(比如卷积操作)能够容易地应用于三维情景。
Maturana 和 Scherer 在 2015 年提出的 VoxNet(2015)是最早在给定体素网格输入的情况下在物体分类任务上取得优异表现的深度学习方法。VoxNet 使用的是概率占用网格,其中的每个体素都包含了该体素在空间中被占用的概率。这样做的一个好处就是,它允许网络区分已知是自由的体素(例如,激光雷达光束经过的体素)和占用情况未知的体素(例如,激光雷达击中位置后方的体素)。
VoxNet 的架构本身非常简单,它由两个卷积层、一个最大池化层和两个用于计算输出的类别得分向量的全连接层组成。这个网络比最先进的图像分类网络要浅得多,参数也少得多,但是它是从上百种可能的卷积神经网络架构中挑选出来的。由于体素网格与图像十分相似,它们实际上使用的带步长的卷积和池化运算都是从二维像素的工作方式进行调整迁移到三维体素上来的。卷积算子使用的是 d×d×d×c 的卷积核而不是二维卷积神经网络中使用的 d×d×c,池化运算考虑的是不重叠的三维体素块而不是二维像素块。
VoxNet 存在的一个问题是,该架构本质上并没有旋转不变性,尽管作者合理地假设传感器保持直立,使体素网格的 z 轴和重力方向保持一致,但是并没有假设物体会绕着 z 轴旋转:一个物体从背后看仍然对应相同的物体,即使在体素网格中的几何形状与我们所学的卷积核有很大的不同。为了解决这个问题,他们使用了一个简单的数据增强策略。在训练中,他们多次对每个体素网格进行旋转,并且在所得到的副本上进行训练;接着在测试时,他们将最后的全连接层在输入的不同方向上得到的输出进行池化。他们指出,这种方法比 Su 等人使用的多视图 CNN 在「视图池化」步骤中所做的对中间卷积层输出进行池化的方法能更快收敛。通过这种方式,VoxNet 通过在输入的体素网格的不同旋转方向上共享相同的学到的卷积核权值来学习这种旋转不变性。
VoxNet 代表着我们向真正的三维学习迈进了一大步,但是体素网格仍然具有一些缺点。首先,与点云相比,它们丢失了分辨率。因为如果代表复杂结构的不同点距离很近,它们会被被绑定在同一个体素中。与此同时,与稀疏环境中的点云相比,体素网格可能导致不必要的高内存使用率。这是因为它们主动消耗内存来表示自由和未知的空间,而点云只包含已知点。
PointNet(2016)
考虑到这些使用基于体素的方法存在的问题,后面的工作将重点放在了直接在原始点云数据上进行操作的架构上。最值得人们注意的是 Qi 等人于 2016 年提出的 PointNet 是最早的处理这种不规则三维数据的方法。然而,正如作者所指出的,点云仅仅是一组通过 xyz 坐标表示位置的点。更具体地说,当我们给定点云中的 N 个点,网络需要学到相对于这 N 个输入点的全排列不变的唯一特征,因为这些输入给神经网络的点的顺序并不会影响底层的几何形状。此外,网络应该对点云的旋转、平移等转换有很强的鲁棒性,而放缩操作也不应该影响预测结果。
为了保证对于不同的输入置换的不变性,PointNet 背后的解决方案的关键思路是使用一个简单的对称函数,该函数为任意顺序排列的输入生成一致的输出(加法和乘法就属于这类函数)。在这种直觉的引导下,PointNet 背后的基本架构(称 PointNet Vanilla)可以定义为:
整体的 PointNet架构继承了最基本的方法和 T-Net 以及多层感知机层,它们为点云创建特征表示。然而,除了物体分类之外,PointNet 还支持对物体和场景进行语义分割。为了实现这一点,该架构将来自最大池化对称函数的全局特征和将输入数据传递给一些多层感知机后学到的点特征相结合。通过将这两个向量连接起来,每个点都知道它的全局语义和局部特征,这使网络能够学习额外的、有助于分割的更有意义的特征。
尽管 PointNet 取得了令人满意的结果,其最主要的缺点是该架构不能获取点附近的底层局部结构,这一思想类似于使用 CNN 从图像中不断增大的感受野中提取特征,