3D点云|云上的卷积神经网络及其部分应用

本次公开课由深蓝学院开设,李伏欣老师主讲,主要介绍了涵盖3D点云领域的研究,并重点介绍了李老师近期的最新工作内容。

李伏欣        

美国俄勒冈州立大学助理教授

图片

本次分享首先介绍了最近几年两篇经典论文中的3D点云识别的工作,详细介绍了PointNet++与PointNet;接着由传统CNN入手,逐渐引入PointConv;最后将结合PointConv介绍了我们团队最近的工作内容。

以下是公开课的相关内容
>> 文章大约5200字,预计阅读需23分钟 <<
课程开始,李伏欣老师介绍了点云CNN的一些背景。
点云上做CNN的工作和点云上其他操作有些不同,点云CNN更偏重于识别的任务,目前市面上已经有了很多深度传感器,可以直接获得周围物体的深度数据,例如Velodyne LiDAR等。

随着深度传感器的普及,日后深度传感器在我们日常生活中将会变得更加普遍。我们都知道深度学习在2D图像识别中有了飞跃性的发展,研究点云CNN的目的就是使深度学习在点云上的应用更加广泛。

       图片       

常见的三维表示形式有很多种,常见的表示形式为点云、Mesh、Volumetric和RGBD等。Mesh可以更好地表示物体表面信息,Volumetric是将三维空间转换成网格的表示形式,RGBD则在传统RGB图相中增加了一个深度维度的信息,但只能看到一个视角的信息。而为什么我们要研究点云的CNN呢?因为不管是LiDAR、结构光还是TOF等深度传感器,都是直接获得的点云信息,而其他的三维表示都是由点云生成的。       
图片
同时还可以把RGB的信息同步到点云数据中去,这样在空间表示中不仅仅有物体的三维信息,还有物体的颜色信息。常见的点云往往都是稀疏的,而在土木工程领域中会应用到一种强大的扫描仪,获得数量庞大的点云数据用于还原物体信息,可以表示详细的空间信息。

图片

一、研究现状
点云CNN为什么难做?从2D图像中出发,例如,可以用image(i-1,j-1)表示像素image(i,j)的邻域信息来表示图像中具体的位置信息,但是不能保证在点云中相同的相对位置处存在点云数据。于是可以把这个问题转成volumetric convolution来进行点云的CNN,那么有的Voxel有特征点,有的Voxel并没有特征点,有点的Voxel可以找到该点的邻域进行计算。将这种方法应用到点云中,近些年研究学者发现利用矩阵稀疏性可以起到提高计算速度的作用,精度和速度近些年已经取得了相当不错的结果。
图片

提到点云深度学习就一定离不开PointNet和PointNet++两篇经典的点云神经网络处理方法。PointNet中常用的有两种操作:1×1 convolution 和Max-pooling,然而只有这两种操作实际上对3D识别来讲是远远不够的。PointNet提取特征的方式是对所有点云数据提取了一个全局的特征,显然,这和目前流行的CNN逐层提取局部特征的方式不一样。

图片受到CNN的启发,紧接着同一批作者发表了PointNet++,就更接近了传统的CNN,相较于PointNet,它能够在不同尺度提取局部特征,通过多层网络结构得到深层特征。PointNet++由以下几个关键部分构成:Sampling(采样层),Grouping(组合层),PointNet(特征提取层)。
首先,在网络处理时对输入点的数据点进行采样,采样后的结果中每一个点所构成其局部的点进行组合,方便后面连接PointNet的局部特征提取,由于Max-pooling的影响,每组特征点最后只输出一个点。
对提取的特征点再根据每个点所构成的局部点进行组合,得到的结果进行sampling连接PointNet。由Sampling、Grouping和PointNet三层组成了类似卷积层的结构,可以应用这种结构进行分类和分割。

PointNet++作者使用的采样算法是farthest point sampling(最远点采样),相对于随机采样,这种采样算法能够更好地覆盖整个采样空间,包括点云数据特征信息和边角信息,这些都是随机采样所无法具备的。

图片虽然PointNet已经足够优秀,但是PointNet缺少邻域信息,与传统意义上通过周围邻域得到卷积结果十分不同,这也很难直接应用于后面的点云CNN中。
例如这里有一个最简单的边缘检测的任务,在边缘处两边的颜色不同,为了检测出边缘,我们至少需要考虑两个点的颜色信息才能判断出是否存在边缘。
而PointNet除了Max Pooling以外,剩下的所有操作都只对单点进行,很难直接应用到Corner Detection等任务中去,因此我们迫切需要真正意义上的点云CNN。
图片
二、CNN 到PointConv

为了引入点云CNN,首先我们来回顾一下传统的CNN。对于2D图片来说,某个位置的输出,不仅与该位置的输入有关,还与此位置周边位置的输入有关,不同位置的输入,具有不同的权重。下图中X(i,j,k)可以看做图像的原始像素,W为卷积核,G为邻域。卷积是一个加权求和的操作,由于位置坐标的像素值是固定值,卷积核上所有作用点以此作用于原始图像像素,并通过线性叠加把所有的作用结果累加,即是图像卷积的输出。

图片
可以通过连续域考虑,此时W就不是权重矩阵而是一个函数,那么由于点云位置是随机的,不同位置的权重应该不同,这样可以把权重函数W抽象成为一个关于三维坐标的函数。由于所有操作都可微,通过深度学习不断学习,由Δi, Δj, Δk作为输入的权重值作为函数的输出结果,这也是最初很重要的一种想法。下图中W和X为连续的函数,(i,j,k)为三维参考坐标,(Δi, Δj, Δk)为该点邻域的相对坐标,由于卷积本质上是一个加权求和的操纵。如果某些位置的采样点比较密集,而某些位置的采样点比较稀疏,最终的计算结果主要受到采样密集的位置的点的影响。考虑到点云是非均匀采样的传感器,为了补偿不均匀采样,需要用点云逆密度对学到的权重进行加权,该模块主要目的是处理点云采样不均的情况。这样我们可以把PointConv描述为:

图片

三、PointConv 与 深度学习
PointConv的主要工作是在原有通过1层隐藏层替换权重函数W的基础上,在添加了一层隐藏层和KDE。这样网络的基本结构就可以描述为:通过寻找点云的K nearest neighbor获得K×3的坐标,做两层全连接网络,得到K×(Cin×Cout)的W,与复制Cout份的输入特征Fin运算,便可以得到1×Cout维的一个点的输出特征。完整的PointCov网络结构图如下所示:

       图片

李老师团队之前提交过一篇论文,但由于不知道之前已有团队做过相同的工作而被拒。在他们的工作中由于每个点都需要计算K×Cin×Cout维的权重值, PointConv 实现起来内存消耗大、效率低,很难形成大型的卷积网络结构。李老师发现通过更改了上图中蓝框里求和的顺序可以保证在结果不变的基础上,极大降低内存。假设MLP最后一层的输入为M,M与计算的逆密学习到的权重加权得到的结果Fin直接相乘,而把最后一层全连接层放到最后。看似只是简单的调整顺序,却可以省去复制Cout次的操作,也不用得到K×(Cin×Cout)很大的Tensor,有效的降低了参数的数据量,避免每次卷积都要产生巨大的权重值的问题。
图片

实验结果证明原结构大概需要8G内存,优化过后大概只需要占用100M,极大的节省了内存占用率,为后面构建大规模网络奠定了基础,这样一个PointConv layer就可以完整的对应到一层普通卷积层,优化过后的网络结构为:

图片当然,我们还可以来定义PointDeconv,在之前的PointNet++中,Deconvolution主要是通过插值的方法来实现的。例如在下层有了一个k邻域,上层的点直接做插值来实现。而有了Pointconv以后可以在每次插值加入一层Pointconv,这样PointDeconv 由两部分组成:插值和 PointConv。首先,使用一个线性插值算法来得到精细层的特征的初始值,再在精细层上进行一个 PointConv 进行优化特征,从而获得较高精度的特征值。

图片有了PointConv和PointDeConv,便可以根据传统的卷积神经网络结构搭建一个U-Net网络,用于点云的分类任务。如下图所示,将所有的点先通过PointConv得到非常少的点,再通过一系列PointDeConv点数逐渐增多直至回到初始的点数,再对每个点进行1×1的卷积,便得到了点云的U-Net。

图片

为了验证PointConv可以替代真正的卷积效果,李老师团队将CIFAR-10替换成了点云,在5层和19层的实验中发现,PointConv的准确度高于近期出现的PointCNN和SpiderCNN 的点云深度学习网络,接近甚至高于传统卷积神经网络框架。
同时李老师团队也在ModelNet、ShapeNet和ScanNet上与更多的点云深度学习网络结果进行对比,在ModelNet40和ShapeNet提高的精度不是很高,但是在真实的室内扫描数据集ScanNet却提高了很大的精度。
在4层PointConv的基础上就达到了55.6%的精度,显著的高于ScanNet、PointNet++、SPLAT Net和Tangent Convolutions,近期李老师通过搭建更多层的PointConv已经达到了66.6%的精度。这些结果足以证明PointConv在点云深度学习中可以替代传统的卷积层。
图片
 四、最近工作
4.1 PointPWC-Net

根据上述提到的PointConv的有效性,可以把许多2D的工作进行推广,扩展到点云的应用,例如在计算机视觉中的运动估计。而在运动估计中最重要的环节就是配准,传统方法中的SIFT等方法是可以轻松实现,但是随着深度学习的推广,如何在物体一直运动的情况下有效匹配像素点成为了深度学习运动估计的难题。

最直接的想法就是在相邻两帧之间分别做CNN,得到W×H×D维的特征,在使用Cost Volume的方法用于像素匹配,Cost Volume方法的基本原理为:在W×H×D的特征中,每一个特征计算对应到另一个特征d×d邻域2范式,得到了W×H×D×d×d的匹配信息。尽管得到的匹配信息可能会很大,但是可以获得更好的配准效果。那么如何将配准问题运用到点云上呢?

大体思路为:在相邻的两帧点云Point Cloud1和Point Cloud2作为输入连接PointConv layer得到Point Feature1 和Point Feature2,设以第一帧为target,则在Point Feature1有N个点的基础上取k邻域,计算的N×K维的Point Cost Volume,在连接PointConv layer后与贴到Point Feature1上便可以得到相关的运动信息。

       图片      

但是完整的实现还是需要完成许多细节,其中最重要的为coarse-to-fine,李老师的团队根据2D里的optic follow中有一个很好的方法PWC-Net,实现了3D 点云上的coarse-to-fine。原PWC-Net方法中是将输入图像变小(例如16×16),在两个16×16的基础上计算Cost Volume,之后应用16×16得到的运动结果,先对第一帧的32×32的图像进行移动,在和第二帧的32×32进行匹配计算Cost Volume,以此类推,把所有层的结果加在一起,便可以得到最终的计算结果。这样每次计算的Cost Volume取的邻域并不会很大,计算新的Cost Volume时,可以直接应用上一次的运动结果。

在李老师团队最新的工作PointPWC-Net中,因为有PointConv的存在,可以将PWC-Net中的downsample用PointConv替代,upsample用PointDeConv的方法替换,在Warping layer中,假设得到的输入运动估计为(Δi, Δj, Δk),与原有输入点(i, j, k)相加即可得到输出(Δi+i, Δj+j, Δk+k)。这样我们可以得到点云中的运动估计。点云里的Cost Volume可以把像素坐标值转换为点云数据,由于图像中的d×d是一个dense矩阵,而点云是找K nearest neighbor,得到的Cost Volume的大小就直接去取决于K取值的大小为N×K。

图片在测试中与之前许多工作进行对比,由于ICP假设物体是刚性不变的,所以相较于ICP, PointPWC-Net有较大的提升。而与其他深度学习网络对比,由于大量使用了Max pooling操作,致使了很多特征点丢失,PointConv可以替换CNN层的优势便体现出来,在许多开源数据集上的表现十分良好。
图片
4.2 IGOS:Integarted-Gradient Optimized Saliency

另外李老师团队介绍了另一个非常有意思的工作:如何清楚的知道CNN中是那些Feature起到了至关重要的作用呢?那么需要优化一个mask,对输入图像进行blur,将blur过后的图像重新放到之前CNN网络中预测,使预测的准确度尽可能的较低。例如在预测口琴的图像中,原图像的分类精度在99.9%,如果对人的嘴和手部与口琴接触的地方进行blur,得到的结果就只有11.9%,相反,如果我们只显示嘴部和手部与口琴接触的图像,分类预测的精度达到了81.9%。

图片李老师团队同时将这个有趣的工作推广到了点云中,但是与2D图像不同的是,2D图像可以通过blur进行操作就可以把图像的特征给去掉了,而点云中如果直接删除特征点,会在某些分类器中出现问题。基于上述问题,李老师团队提出了一种点云smooth方法,对部分点云进行smooth逐渐变成一个球,来起到2D图像blur的作用。这样在smooth的操作下将2D中优化mask的工作推广到了点云。例如人的点云图像分类中,如果把人的头部smooth掉后,人的点云分类精度就从原来的0.79降到了0.15,便可以了解到人的头部在点云分类起到了至关重要的作用。

图片

05
 讨论

在公开课的最后,李老师给到了我们一些学习深度学习的建议。点云与深度学习结合的应用范围十分广泛,例如三维重建、运动估计等,要想学好深度学习,首先需要学好机器学习的理论知识,例如Overfitting是什么等基础问题,写一写简单的SVM代码。

在对机器学习有了一定的认识之后,再开始学习深度学习,深度学习本身没有很难的知识点,难就难在做实验,例如如何提高精度、怎样对数据初始化可以得到较好的结果等。多学习别人在深度学习中使用的各种技巧,对提高深度学习代码精度有很大的帮助。很多时候自己写一个深度学习的网络不如直接下载一个开源的深度学习网络的代码,在现有的基础上对原工作进行修改。

相关文章

  • [Qi et al. CVPR 2017] C. Qi et al. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation. CVPR 2017

  • [Wu, Qi and Fuxin 2019] W. Wu, Z. Qi, L. Fuxin. PointConv: Deep Convolutional Networks on 3D Point Clouds. CVPR 2019

  • [Graham et al. 2018] B. Graham and L. van der Maaten. Submanifold Sparse Convolutional Networks. CVPR 2018

  • [Choy et al. 2019] C. Choy, JY. Gwak, S. Savarese. 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks. ICCV 2019

  • [Qi et al. NeuRIPS 2017] C. Qi et al. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space. NeuRIPS 2017

  • [Su et al. 2018] H. Su et al. SPLATNet: Sparse Lattice Networks for Point Cloud Processing. CVPR 2018

  • [Xu et al. 2018] Y. Xu et al. SpiderCNN: Deep Learning on Point Sets with Parameterized Convolutional Filters. ECCV 2018

  • [Li et al. 2018] Y. Li et al. PointCNN: Convolution On X-Transformed Points. NeuRIPS 2018

  • [Jia et al. 2016] X. Jia et al. Dynamic Filter Networks. NeuRIPS 2016

  • [Simonovsky 2017] M. Simonovsky, N. Komodakis. Dynamic edgeconditioned filters in convolutional neural networks on graphs. CVPR 2017

  • [Wang et al. 2018] S. Wang et al. Deep parametric continuous convolutional neural networks. CVPR 2018

  • [D. Sun et al. 2018] D. Sun et al. PWC-Net: CNNs for Optical Flow Using Pyramid, Warping, and Cost Volume. CVPR 2018

  • [Wu et al. + Fuxin arXiv:1911.12408] W. Wu et al. PointPWC-Net: A Coarse-to-Fine Network for Supervised and Self-Supervised Scene Flow Estimation on 3D Point Clouds. arXiv:1911.12408

  • [Ziwen et al. + Fuxin arXiv:1911.10415] C. Ziwen et al. Visualizing Point Cloud Classifiers by Curvature Smoothing. arXiv:1911.10415

  • [Z. Qi, S. Khorram, L. Fuxin, AAAI 2020] Zhongang Qi, Saeed Khorram, LI Fuxin. Visualizing Deep Networks by Optimizing with Integrated Gradients. AAAI, 2020