是这个,呃,这个也是露了一把声音,所以很激动。然后我这次的这个报告呢,会是英文的PPT,那我会尽量用中文的名词,当然有时候不可避免也会有一些英文,希望大家能够接受。然后这次报告我们会讲,呃,怎么样对点云这样的数据进行深度学习,如何设计新型的网络架构,然后同时如何用这些网络架构应用到一些三维场景理解的应用中去。

啊,那么在这个报告开始之前,我想先介绍一下自己。啊,就我英文名叫Charles,那有人叫我查尔斯啊啊。然后我中文名其实是四个字,叫祁芮中台。那因为中文名太长了,所以我经常就用我的英文名Charles。然后我本科是从清华大学电子工程系呃毕业的,是九字班。

现在在斯坦福大学读博士,是第五年的博士生,啊,然后隶属这个AI实验室和呃几何计算的这个组。然后我的导师是叫Leonidas Kribs,是一个希腊的教授,希腊的美呃希腊裔的美美籍的教授。那我们的实验室呢,又叫 Gribbs Lab,啊,现在大概有十个 PhD,啊,有三个 Postdoc。

然后我们组的 research,嗯,是一个交叉领域,在机器学习、计算机视觉和计算机图形学的交叉领域,啊,会有一些很有意思的这个新型的工作。那最近关于三 D 这些数据的工作呢,啊,也是兴起了一波潮流。

那另外稍微提一下我的导师,可能很多人呃不太对他不太熟悉啊,因为可能知道斯坦福有李飞飞教授啊,但其实我的导师是一个非常资深的呃呃计算机科学家,然后他是美国工程院的院士,也是美国科学与艺术学院的院士。

啊,然后他其实是呃传奇大牛的弟子,就他的导师,我导师的导师呢是Kanous,啊就Donna Kanous就是计算机这个算法这个大牛,啊那所以我的导师也是在算法上有很深的造诣,啊就经典的红黑树也是他当年发明的。

啊那这个闲话就不多扯,下面我们就开始进入正题。啊,当然,今天我会讲我研究中的一部分工作,就是基于这个三D的数据、三D数据的深度学习。那更多的工作呢,可以在我的主页上找到。

好啊,那近来我们其实发现有很多这个三D的应用在兴起,这一部分是由于三D的这个sensor在进步,另一部分是也是因为我们随着虚拟网络世界的这个应用的蓬勃发展,我们也慢慢会转移到这个物理实际世界中的应用。

比如说,这个无人驾驶或者呃AR、VR、ARMR,对吧?它会涉及到对现实世界的一些场景理解和现实世界的交互。那么举个例子,在自动驾驶的应用中呢,呃,我们这个自动驾驶的车就会需要去理解这个场景中有哪些物体。

比如说有这个汽车、有行人、有交通标志,同时还要去理解这些物体的呃运动模式,比如它是在运动中还是静止,啊,这都是三维场景理解中的一些应用。

那么在AR的这个场景中呢,很多头戴显示器实际上都是有啊深度传感器的啊。那么去感知到这个深度数据以后呢,它希望对场景做一个理解。那比如说知道有哪些物体在哪些位置,从而它可以把一些虚拟的物体,比如说这个呃to do list,合适的放到这个冰箱的门上面。

那么,所有这些这个三维场景理解的应用呢,其实很难去写一个固定的程序去做它们。所以我们需要一种数据驱动的方法去理解和处理这些三维数据,啊,从而就带来一个非常强烈的需求,就是在三维数据中的深度学习。

我们把它叫做呃 three D deep learning。那三维的三维数据的数据学深度学习和图像有什么不一样呢?那最大的不一样呢,就是由三维数据本身的复杂性带来的。

那不像图像可以很经典的表示成一个二维的矩阵的 R G B pixel array,对吧?三维的数据实际上呢有很多种不同的表达形式啊。那这种不同的表达形式呢,可能是由不同的应用驱动。

比方说这里面有点云叫 point cloud,就是一组点,是一个点的集合。啊,那可能是由呃深度传感器在扫描得到的这个深度的数据,那么变到三D呢就是点云。

那还有这个mesh,那可能是由一组三角面片组成的,那在计算机图形学中有特别多的应用,因为它是一种特别适合做建模和渲染的数据格式。

那其次呢,我们还可以把空间划分成这种三维的网格。当然,这是 Stanford Barney 非常经典。三维的网格,我专门查一下这个中文怎么说,叫三维的呃山格(栅格)。

啊,在这个山格中呢,相当于每一个小的这个正方体就代表这个地方有没有物体,那就形成了一个 binary 的这样一个网格结构,去代表空间中物体的分布。

那其次呢,我们还可以说用图片的方式来表达三维,我们可以用多个角度的图片来表达三维。那这个常常应用在这个可视化的过程中,因为人对这个图片的理解远远呃好于对三D的理解。

那在这么多不多种不同的三维表达中呢,我们觉得点云数据是一种非常适合三维场景理解算法的数据格式。那有两个原因,呃,第一个是点云是非常接近于呃原始的传感器数据的。

那比方说我们用激光雷达扫描到的数据,那直接就是点云。啊,那如果是深度传感器呢?它有一个深度图像,但实际上呢,它也是一种点云,只不过是一个呃partial的局部的点云。

那么如果是这种非常原始的数据呢,我们就可以用它来做一种非常端到端的深度学习,那能尽可能挖掘原始数据中的这个呃模模式这些pattern。

那另一个方面呢,是点云实际上在表达形式中是非常简单的,它仅仅是一组点啊。那和其他的格式相比呢,比如说对于mesh,你可能需要选择你用的是三角面片还是四边形、五边形,对吧?

你还要选择三角面片的大小,怎么去连接它们,还有很多这个复杂的选择空间。那对于栅格的这个三维的网格数据呢?你可能需要选择它的分辨率,你到底是用多大的网格?

就小了呢,那你会有很多空白的区;那大了呢,你可能会损失很多精度。那么对于这个图像的,比如说选择呢,你就会呃需要选择一些图像拍摄的角度,这个角度有时候不是很能轻易选择。

同时,这个图像的表达形式呢,它对三D的表达是不全面的,它仅仅能表达一个视角啊,它不能表达完整的三D数据。

呃,那么好,我们想要集中研究这个点云。那实际上,最近其实直到最近才有工作去研究怎么在点云上做呃特征的学习。

那之前呢,大部分工作都是集中在呃手工设计的呃点云特征上。这些特征集结了大家很多的智慧啊,就设计这个 feature engineering 做了很久。

但我们知道这些特征都是针对特定的任务,然后有很多不同的假设。那对于一个新的任务呢,我们很难用数据的方式去优化这些特征。所以我们希望进一步走到一个特征学习、深度学习的时代啊。

那最近其实是有一些工作,在我们 PointNet 工作之前是有工作来做点云上深度学习。不过因为点云是一种呃不规则的数据,我们说因为它并不是定义在一个规则的网格上啊,它在空间中可以任意分布,数量也可以任意。

那么很多之前的研究人呢,就把它转化,先转化成一种啊叫栅格化,变成一种规则的数据。比如说把它变成一个呃三维的栅格,那它就会分布在一个均匀的三维网格中。

那我们就可以用一种呃呃 convolutional neural network,对不对?CNN 三D的CNN,就2D CNN的扩展来处理这种栅格数据。那相当于这就很经典了,大家非常熟悉了。

那这么做呢,有一些很大的缺点。呃,第一个就是说,这个三维的 convolution 它的代价是非常高的。嗯,这空间的复杂度和时间的复杂度,它随着这个分辨率的增长都是三次方的增长。

所以说呢,它这个计算代价非常大。实际中,因为这个计算的代价,很多人采用的就是非常低的分辨率,比如说只有三十乘三十乘三十。那和图像比,你可能图像里会有一千多乘八百多,那这个三维的分辨率被限制的非常低。

那另一个角度,如果你只是用这个非常低的分辨率呢,你会呃带来这种呃量化的噪声错误,那么会限制你识别的精确度。

那有人想,我可以说我不计复杂度的把这个分辨率搞得很高,但这样做其实会导致大量的栅格或者是空白的状态。因为实际上我们扫描一个物体,我们只能扫描到它的表面啊,那么它内部其实都是空白的。

所以嗯,这个删格并不是对一个三D扫描的点云数据一个很好的表达方式。那除了三格化这种呃转化呢,还有人尝试把这个点云呃投影到一个平面,那么就把点云的三D数据变成了一个二D数据。

然后我们就可以用二D的神经网络、卷积神经网络去处理它。嗯,那这样做呢,其实会损失一些三D的信息,因为你在投影的过程中,很多三D就呃丢失了。

而且你还要决定这个投影的角度。呃,很多时候其实这是一个不简单的问题。那其次呢,还有人尝试过从点云中直接提取一些手工的呃特征,然后再用一些简单的 fully connected network 去处理它。

啊,全连接的网络,但这么做其实这个网络的性能被手工数据的呃局限给限制住了,所以也不是很优化的一种方案。

那么一个很有趣的研究问题就是,我们能不能够嗯实现一种直接在点云上做的特征学习的方法呢?啊,那答案是当然是肯定的啊。

因为有我们这个 talk,在我们这个 point net 的工作中呢,我们就提出了一种端到端的针对这种不规则点云数据的深度学习。

那我们的网络可以提供一种呃统一的框架,呃来完成不同的任务,比如说物体的分类啊,就物体的分割、场景的分割,甚至是一些回归的问题。

那呃看这个图可以,大家呃得到一些直接的感官。那比如说,在最左边啊,我们可以把这个一个物体的点云,比如说一个杯子、一个桌子,那分开成不同的类。

啊,那我们给定一个物体呢,我们也可以中间这个图可以把物体分割成不同的呃区块功能区块,比如说飞机的翅膀、飞机的身体、飞机的引擎等等,或者桌面桌角。

那么给定一个场景的一个房间的点云呢,我们也可以做这个语义的分割。那么就可以把这个场景的点分成,比如说桌子、椅子、墙壁啊,可以完成这一系列的任务。

那么我们的网络设计呢,实际上是由两种点云的特点决定的啊。那我们先来看第一点。

第一点就是说,实际上点云从数据的表达形式来说,它是一个集合,一个点的集合,所以它对点的顺序是呃不敏感的。

点的顺序会不影响这个集合本身。那么如果我们看这个图,如果我们把这个点云往往会表达成一个二维的呃矩阵,那么它是一个n行d列的矩阵。

那n行就代表我们有n个点。那d列就代表每个点有d维的特征,或者说d维的特有d维的特征。那最简单这个d就是三,就代表这个点的x y z的坐标。

那我们也可以有更多的特征,比如它的颜色啊,它的法向量啊,它的curvature等等等等啊。但最简单d就是三。

那我们有n个点,有每个点的d维。那因为这个点集其实是呃无序的,那么如果我们把这个矩阵的行做一个变换呢?

虽然这个矩阵是不同的矩阵了,但它背后所代表的点集实际上是同一个点集。那因为这种置换的不变性呢,就要求我们设计的网络需要对所有的置换啊都具有这个不变。

那么这有多少种置换呢?就有n个阶层的排列组合数,即 n! 种。那么多种置换,我们的网络如何能做到置换的不变性呢?

那实际上有一个非常呃系统化的解决方案,那就是一个对称函数。因为神经网络本质上就是一个函数,那什么样的函数有置换不变性呢?那就叫对称函数。

那么看这个表达式中,我们有一个置换呃,置换函数派。那么我们对任意 n 个输入的点进行这个位置关系的置换,这个函数会始终保持同样的值。

那这就叫对称函数。我们其实对很多对称函数都很熟悉了,最简单的例子嗯比如说这个取最大值对吧?

对最大值的池化就是叫 max,那它是一个对点的顺序无关的操作。那或者我们可以取所有点的和或所有点的平均,那这和点的顺序也无关。

呃但是这么做呢我们会知道这会会有一些问题我们从这个下面这个图就可以看到啊那我们的问题就变成在这样一个对称函数的框架下我们如何用神经网络来构建一组对称函数?

啊我们可以从最简单的例子开始。那最简单、最最简单的例子是什么呢就比如说我们现在有这一组点啊比如第一个点是一二三坐标第二个点坐标是一一一。

好那我们怎么构建一个对称函数呢那最简单方式就是我们用一个非常简单的对称操作这个g比如它就是一个取最大值。

好那么我们看第一维最大值是什么OK第一维最大值是二那第二维最大值是什么第二维是三第三维最大值是四OK我们就得到这个最大值的这个点二三四。

或者我们可以取个平均对吧相当于就取这一组点的重心那不管是取最大值还是重心虽然这个操作是置换不变的但是这么做大家也可以想到它把所有这个点云它的几何信息基本上都丢失了。

如果是平均我只取得了重心;如果最大值,我只取得了它最远的那个点像最远的那个点的这个边界对吧那么这么做就会损失我们有意义的几何信息。

那怎么做才能不损失呢?那有一个办法就是与其说我们直接做这个呃对称性的操作,我们可以先把每个点先单独把它映射到一个更高维的空间。

那我们可以在这个更高维的空间再来做这个呃对称性的操作,那么因为这个高维空间呢可能是一个冗余的空间。

比如说我们可以是一个一千维的空间那它用一千维的空间来表示一个三维的点它的信息肯定是冗余的。

但因为它的冗余导致我们在这个对称性操作比如说max的操作把它综合起来的时候呢我们通过这个冗余可以避免信息的丢失。

那么在这个对称操作之后我们依然能够保留足够的点云信息那再通过另一个网络伽马来进一步消化这个信息来得到一个点云的特征。

那么结构呢实际上是一组函数的这个composition一个组合由函数g、h、伽马的一个组合。

那注意到表达式写在上面,注意到这里我们会把这个 h 复用在每一个点上所以每一个点会单独用同样的 h 做这个低维到高维的映射。

然后只要这个函数简单的对称函数 g 是对称的那整一个函数就会保证是对称的。那么我把这个结构就叫做 pointnet vanilla,是一个原始的 pointnet 结构。

那实际在呃执行过程中呢我们可以用这个特意查的这个词叫多层感知器啊 multi-layer perception 来来去描述这个函数h和伽马。

然后对于g呢我们有很多种选择那实验中表明就max pooling就是最大池化是一个效果比较好的对称操作。

OK那么接下来有一个很有意思的理论问题了就是说我们用神经网络构建了这个 PointNet、Valina 的这个网络结构保证它的对称。

那么它在所有的对称函数的这个空间中它占据了一个什么位置呢?它能不能代表所有函数,或者有什么函数它不能代表呢?

那很有意思我们可以得到一个理论就是说实际上这个 point net 可以成为一种呃 universal approximation,呃就是说它可以任意的逼近在集合上的对称函数。

那只要是这个对称函对称函数,这个集合上的函数呢是在 Hausdorff 空间中是连续的,那我们就可以通过增加神经网络的个数和宽度,网络的宽度呢来任意逼近这个函数。

啊当然实际中操作呢会涉及到这个问题本身的难度但在理论上这是一个呃很好的结论那代表我们网络结构本身的设计呢是非常 solid 的。

好那我们看了这个如何设计这个网络通过这个对称性函数来让它对输入顺序的不敏感。

啊那么接下来我们再考虑一下如何来应对这个输入点云的几何变换。那我们知道比如说对于一个呃比如说一辆车,那我们在不同的角度来看呢它会有不同它的点云的 x y z 的坐标会不同但实际上它代表的都是车。

那我们希望我们的网络呢也能应对这种呃视角的变化啊那其实如果大家知道 spatial transformer network 的话就接下来的几页呃幻灯片就会比较好理解了。

那我们希望做的呢实际上是增加一个基于呃基于数据本身的一个变换函数模块,那么看这个图最左边我们输入的点云是n乘三有n个点那三维是x y z。

那我们希望呢对这个点做一个变换有一个神经网络t net来生成一个变换参数,然后对这个n乘三的呃点云做变换得到另一组变换后的点。

之后呢我们再有的网络继续处理这组点那我们希望的是呢通过整体优化这个变换函数以及之后的网络使得这个变换函数能够自动的去呃对准、对齐我的输入。

那使得后面如果它对齐了,那后面的网络的任务就会很简单,就会能把这个呃不同视角的问题给呃简化。

那实际中呢?因为点云是一种非常容易做几何变换的数据,那不像在图片中比如说你要实现一个 transformer network你可能要涉及很多的这个呃插值啊什么很复杂的操作。

那点云里很简单你只要做一个矩阵的乘法就可以比如说对一个 orthogonal transform呃正交化的变换那仅仅是一个三乘三的矩阵乘法,那计算上非常容易。

呃实现中也非常简单。那我们可以继续推广这个呃操作不仅仅是在呃输入的时候做这个变换,我们还可以对这个点的中间特征做这个变换。

比如说我们刚开始有几层网络已经把每一个点变换成了k维,那我们现在有一个n乘k的矩阵。

每个点是k维的特征那我们也可以用另外一个网络去生成一个k乘k的变换那我们可以对这个特征进行一个特征空间的变换,也可以通过矩阵乘法的方式啊来实现。

那这样变换完我们得到另一组特征然后可以接下来的网络进行处理。那在优化的过程中嗯因为这个高维的变换可能优化起来难度更加高我们可能也要加一些要求

正则化,比如我们可以希望这个矩阵尽可能接近一个正交矩阵。好,那我们接下来看一下如何把这些变换的网络和我们之前讲到的原始 PointNet 结合起来,得到我们最终的分类网络和分割网络。那我们一步一步来看:给定一个输入的点点云,比如 N 个点,每个点三维 XYZ,我们可以先做一个输入的几何变换,通过一个变换网络生成三乘三的矩阵做变换。然后我们再通过 MLP 把每个点投影到一个六十四维的高维空间,然后在六十四维中可以再做一个高维空间中的变换,把它变换到一个更归一化的六十四维空间。

然后我们继续做这个 MLP,把六十四维映射到更高维度的一千零二十四维。在这一千零二十四维中呢,我们可以做这个对称性的操作,就是由最大池化 Max Pooling 来实现。那我们就得到一个全局的特征 Global Feature,有一千零二十四维。这个全局特征继续处理,我们可以通过级联的全连接网络最后生成 K 个 Output Score,就针对 K 个 Class 进行 K 个类别的分类。OK,这是一个对点云的分类网络。

那如果我们要对点云做一个分割呢?分割其实可以定义成一个对每个点的分类问题。如果我们知道每个点的分类,就可以对这个点进行固定类别的分割。当然,我们通过全局坐标是没法直接对每一个点分割的。所以一个简单又有效的做法呢,就是我们可以把局部的特征、单个点的特征和全局的坐标结合起来,实现分割的功能。

那么最简单的做法就是:我们可以把全局的特征进行重复 N 遍,然后每一个和原来的单个点的特征连接在一起。相当于单个点在全局特征中进行了一次检索:它去全局特征中看,哎,我在这个全局特征中处于哪一个位置?我应该属于哪一类呢?大家理解这个意思后,后面就很简单了。我们就对每一个连接起来的特征又进行另外一个 MLP 的变换,最后把它每个点分类成 M 类,相当于输出 M 个 Score。OK,这是一个分割网络。

那接下来我们可以看一些结果。当时这个工作其实是在点云深度学习中最早的一个工作之一。虽然是最早的工作,我们可以和原来一些比较成熟的 3D CNN 相比:在 ModelNet40 四十个物体分类的问题上,我们已经取得了相当甚至有时候更好的结果。和一些基于传统特征的 Baseline 相比呢,更是取得了明显优异的结果。

这里我们可以看到一些物体部件分割的可视化。左边显示的是对于部分数据(Partial View)数据的分割;右边是对于完整点云的分割。可以看到它可以把滑板分割成不同的轮子和板面,耳机分割成线、头梁和耳套等等。它还是能实现一个非常精细的分割。在结果上呢,我们也明显好于原来的一些 Baseline 还有一些 3D CNN 的方法。这是在 ShapeNet Part 这个 Dataset 上评估的。

这里其实 Visualize 的是一个场景分割的结果。第一行展示的是一个带有颜色的点云,虽然我们把它表示成图片呢,实际上它是一个三维的点云。第二行显示了我们网络分割的结果,这是 Stanford 的一个 Dataset。我们可以看到网络能成功把这个场景的点云分割成不同的语义区域:比如地面是蓝色的,墙壁是这个淡蓝色的,椅子红色的,桌子紫色的等等。

我们提出的 PointNet 不仅在理论上很有优异性,而且能在实验上能有很好的分类和分割效果。它还是一个非常轻量级、非常快速、高效的一个模型。和传统的基于多视角 3D/2D CNN 和基于 Volumetric CNN 的方法比呢,我们的 PointNet 能大幅度提升空间的利用效率以及计算的速度。

比如和经典的 Volumetric CNN 相比,它可以省下超过百分之八十的内存。在计算上相比呢,也可以省下超过百分之八十八的计算量。这个纵坐标都是 Logarithmic 的,也就是几何级数的。所以 PointNet 实际上是一个非常适用于移动设备和可穿戴设备 Mobile Devices 的一种网络框架,因为它的高效性。

同时它还对于数据的丢失非常鲁棒。比如这里我们和一个 3D CNN 的经典 Baseline VoxNet 做一个对比,在 ModelNet40 分类的问题上。当我们看到有百分之五十的点丢失的时候呢,PointNet 的分类精度仅仅受到百分之二的影响;而与之相比,这个 VoxNet 3D CNN Baseline 的精度呢丢失了超过百分之二十。

那有一个问题就是为什么 PointNet 对这个数据的丢失这么鲁棒呢?接下来我们可以通过一个可视化去理解。第一行显示的是一个原始的点云输入,代表一些不同的几何形状。我们想知道在这些输入的点是哪些点对我们的全局特征做出了贡献?因为我们有一个 Max Pooling 最大池化的操作,实际上有些点的 Embedding 特征是非常小的,所以在经过 Max Pooling 之后它对全局特征没有做任何的贡献。

那我们就想知道哪些点是剩下来的那些“胜利者”。我们把把这些关键点叫做 Critical Points 关键点。那么把这些关键点展示出来呢,它实际上很多关键点表征的就是一个几何形状的轮廓还有它的骨骼形状。那么只要这些点得到保存,它就能把这个形状分类正确。所以这在一定程度上解释了为什么 PointNet 对点的丢失非常不敏感、对点丢失非常鲁棒。

OK,虽然我们介绍 PointNet 有很多优秀的特征和特点,但是实际上呢它还是有一些局限性的。这也就是为什么我们有了第二代网络结构啊,相当于是 Second Generation 叫 PointNet++。那为了理解这个 PointNet 的缺陷呢,我们可以把它和 3D CNN 做一个对比。

左边看到我们是一个 3D CNN,它和二 D CNN 很像了只是把二 D 的卷积变成了三 D。我们知道这个网络呢它会有这种多级的特征学习,它有不断的对特征的抽象;同时它还可以有这个平移不变性的特点因为有这个 Convolution 的操作。那与之相比呢我们来看 PointNet:在 PointNet 中实际上它刚开始是对每一个点做一个从低维到高维的映射通过这个 MLP,然后每个点映射完呢它再把所有点映射到高维的特征通过 Max Pooling 结合在一起。

所以本质上呢,它要么是对一个点在做操作,要么它是对所有的点全局的特征在操作。那这样实际上它是没有一个局部的概念。因为没有这个 Local Context 的概念呢,它其实比较难对一些精细的特征做一些学习,所以在分割的问题中会有一定的局限性。另外因为没有这个 Local Context 呢它其实在平移不变性上也有所缺陷。

我们知道点云网络的输入是 XYZ 的坐标。假设你对这个点云做了一个平移,那它所有的 XYZ 都不一样了;所有导致它所有的特征都不一样最后的全局特征也不一样分类也会不一样。那如果是单个的物体呢还好办,我们可以把它平移到坐标系的中心然后把它的大小归一化到一个球里面这是可以做的。但如果我们是在一个场景中有多个物体那这就不好办,因为你究竟对哪一个物体做这个归一化呢?所以它就有在这时候就会有平移不变性的缺陷。

那针对这些问题呢我们就提出了第二代网络叫 PointNet++。核心的想法呢就是在局部的区域重复地、迭代性地使用 PointNet。我们可以在这个小区域使用 PointNet,然后在小区域使用 PointNet 生成一个新的点;新的点又组成一个新的点集。那在这个新的点集中我们又可以定义新的小区域,从而我们会实现一种多级的特征学习。

那因为是在区域中我们可以用局部坐标系也可以实现这个平移的不变性。同时因为我们是在小区域内还是使用的 PointNet,它是对点的顺序无关的;那么整个网络它同时还可以保证这个置换(Permutation)的不变性。OK,那我们可以用一个具体的例子来理解一下这个多级的点云特征学习是怎么实现的。

这里有一个二 D 的卡通例子,那是一个字母 A,有一个二维的点每个点有 XY 坐标。那我们可以先找到一个局部的区域比如说是在这个红点周围的一个小区域,那我们想学这个小区域的特征。因为我们不想受整体平移的影响第一步呢先把这个小区域的点转换到一个局部的坐标系,这样整体点云就不会影响这个小区域的局部坐标了。

那在这个局部坐标系下呢我们可以使用一个 PointNet 来提取它的特征。提取完特征呢我们就会得到一个新的点:这个点不仅有它的 XY 代表这个小区域在整个点云中的位置,还有一个向量特征 F 代表这个小区域的几何形状。那么如果我们重复这个操作呢?好的这 XY 是在欧几里得空间中的,而 F 是在一个高维的特征空间中。

如果我们重复这个操作就会得到另一个小区域的代表点(小方块)。再重复、再重复,经过一系列操作之后呢我们就会得到一组新的点。这组点在数量上往往少于原先的点,但每一个点呢它代表了周围一个区域的几何特点。我们把这个操作叫做这个点集的简化(Set Abstraction),像 Point 相当于是一个 Layer;这组 Layer 就有选择小区域的操作和对小区域点的提取:选定局部坐标系,然后应用 PointNet。这一组操作联合而成。

那我们可以重复这个 Set Abstraction 点集抽象化的过程,实现一个多级的网络。这里展示了两级:两级网络分别是 Set Abstraction 使得我们的点的数量越来越少,但每个点它代表的特征的区域就越来越大相当于它的 Receptive Field 感受野越来越大。这和卷积神经网络里的概念就非常相似了。

那最后我们对所有这些最后得到的点呢做一个 Pooling,就会得到一个 Global Feature 全局特征。我们可以用它来做分类整个点的分类;我们也可以把这个最后的点呢再重新它的 Feature 通过某种 Up Convolution 的方法,再传回到它原来的点上。这个传播的方法呢既可以通过三 D 的插值也可以通过另一种基于 PointNet 的方式传。我就在这里就不讨论细节,但是会有一种方式实现这个 Segmentation(分割)。

那么在这个多级的网络中实际上有一个非常有意思的问题,就是如何选择这个区域的小区域的局部区域的大小。相较而言就是说你怎么选择卷积神经网络中 Filter 的宽度?对于 Point Cloud 来说就如何选择我 PointNet 作用区域的球的半径。在 CNN 中我们知道现在越来越流行的一个趋势是选择非常小的 Kernel,比如在 VGG 中有大量应用这个三乘三、三乘三的 Kernel。那么在 Point Cloud 中是不是这样?

那实际中不一定为什么呢因为点云中非常常见的现象是这个采样率的不均匀。比如你有一个 Depth Camera 深度相机采到的图像,那近的点就会非常密远的点就会非常疏。那么在密的地方没有关系在疏的地方会产生很大的问题:比如最极端的情况下你只有一个点那你在那里学到的特征会非常不稳定。这是我们很想避免的。

为了量化这个问题呢我们这里有一个控制变量的实验:我们在 1024 个点上来训练我们的网络,然后我们减少这个点的数量相当于减少它的密度而且是不均匀地在空间中减少。那我们来观看 PointNet 和 PointNet++ 它受到的影响。我们知道在最刚开始 1024 个点的时候因为 PointNet++ 更强大、多级的训练它得到更高的分类精确度。但是因为它是在小区域上作用随着点密度的下降它的性能受到了更大的影响:在密度下降到小于 500 个点以后,它的性能甚至低于了 PointNet。

那所以得出一个结论:实际上在点云中这个局部的操作 Kernel 如果太小的话,实际上性能会被采样率的不均匀所影响。那针对这个问题呢我们就可以设计一些新型的网络结构来智能地去学习如何综合不同区域大小的特征,来得到一个鲁棒的这个学习层。那背后的 Intuition 直觉实际上是我们希望在密的地方相信这个特征,在疏的地方不相信这个特征而希望去看一个更大的区域。

那简单的思路就是通过 Multi-Scale 多尺度结构:我有不同半径的区域(这是一个二 D 的例子),然后把这些不同区域的特征联合在一起。这有点像 Inception Network 里面的结构,但不一样的是我们在训练的过程中可以通过 Random Dropout 随机的对输入的 Dropout 来迫使我们的网络学习如何能应对这些损失的数据,如何结合不同尺度上损失数据的性能特征。

另外一个类似的结构是不是在同一级中去综合不同尺度的信号,而是在不同网络层级集中去综合?这个没有时间细讲。那有一个好处就是它可以节省一些计算,因为在下一级的特征可能已经计算好了你只需要把它池化拿来用就可以;而在 Multi-Scale 的结构中你需要对不同尺度分别计算。那从这个图中可以看到采用了这种 Multi-Scale 或者 Multi-Resolution(多分辨率)的结构中,我们的网络和原来的 PointNet++ 比呢就会对这个数据的丢失变得非常、更加鲁棒:那么即使丢失甚至百分之七十五的点,这个分类的性能都不太受到影响。

同时呢我们也可以把这个网络在场景的分割上做一个评估:这是一个 ScanNet 的数据集,对一个场景做语义分割。我们看到从 PointNet 到 PointNet++:PointNet++ 大幅度提高了场景分割的性能,因为这种多级的结构使得它对局部的特征有更好的学习;同时它还有平移变换不变、平移不变性的特点。所以它能更加鲁棒地学习特征,同时这个有多级的网络呢也稍稍帮助了这个分割的效果。

那这是一个全点云的分割;如果是一个局部点云比如说是由单个角度拍摄的 Partial Scan 的分割,我们可以看到这个多级的结构。我们对采样率更鲁棒的 Multi-Scale Grouping (MSG) 的结构呢大幅度提升了在这种 Partial Scan(部分扫描)上分割的精度。那体现它是一个非常有用的设计。

OK,另一个 PointNet++ 非常好的性能是它不局限于在二 D 或者三 D 的欧几里得空间,它可以扩展到任意的这个测度空间只要有一个定义好的距离函数。比如这里我们可以展示一个它扩展到非欧几里得空间 Non-Euclidean Space 的例子:是一个对可变形物体、有机物体分割的一个数据集。比如这里我们想要分类的数据集,想对这个马和猫做一个分类。

那虽然在这个图中 A 和 B(这个马和猫)它的外形、几何外形是非常相似的但实际上它们属于不同的类;而这个 A 和 C 虽然几何外形很不相似但实际上属于同一个类。所以这时候我们想依靠的不是 XYZ 这种 Extrinsic(外在)的外形上的表达,而是希望在这个物体表面有一种基于 Geodesic 测地线的特征学习。

那我们就可以非常灵活,PointNet++ 支持这个点上 Intrinsic(内在)的 Feature:比如一些 Curvature 曲率、一些 Heat Kernel Signature 热核签名等等,去表征这个物体表面形状的变化而不是它在整个空间中的位置。那我们可以对这个局部采用一个 Geodesic Distance 去寻找这个局部来做采样。从实验结果来看呢,采用这种 Non-Euclidean Space 和 Intrinsic Feature 大幅度提高了这个分类的性能,也验证了 PointNet++ 的灵活性。

好那我以上呢我们介绍了这个 PointNet 的网络结构以及它背后设计的原理,以及它的第二代网络结构 PointNet++。

那接下来我们希望花一些时间来讲一讲这些网络结构在三维场景理解中的应用。它们有很多应用,当然背后共享的一个主题是:因为在点云上我们能够用这些网络,它能够支持我们去探索一些全新的解决方案——基于三维数据的解决方案,而不再是像传统一样基于图像表达的。我们其实有两个想要讲的内容,但今天因为时间关系,可能我会侧重于讲这个三维物体识别这一块。另一块三维的光流估计,可能会跳过。

对于三维物体识别,我们可以先来看这是一个什么样的任务:比如我们输入一个RGB-D的数据(有图像的色彩和深度信息),希望去得到这个物体的三维边界框,即它的三维物体框。比如在室外例子中可以得到汽车的三维框;在室内也可以得到桌子、椅子的三维物体框。这是在图片中的表达,实际上这些三维边界框是在空间中的。这是一个在点云中可视化的例子,我们可以看到有汽车、自行车等。

那传统的工作是怎么来处理这个三维物体识别呢?有很大一类工作是基于这一套思路:它先在三维空间中做区域提议(region proposal),可能是基于点云把它投影到图片上,然后在图片中就提议三维的框;也可以是用3D CNN来做。提议完以后,它可以再把2D的特征和3D的结合到这个proposal中做一个分类。

那这么做有一个缺点:就是三维空间它的搜索空间是非常大,计算量也非常大;而且这么做在3D中proposal时,因为点云的分辨率有限,所以很多时候很难发现比较小的物体。那另外一个思路呢是基于图片的:比如我有一个RGB的图片,我希望估计3D的框,这时候就依赖于一些对这个物体大小的先验知识。

那这时候很难精确地估计它的深度和位置。另外也可以基于depth image,但其实depth image对邻域的定义有很多局限:比如两个点在空间中距离可以很远,但投影后它的距离会非常近。所以在图片这种表达形式下,用2D CNN还是受到了局限性,很难精确地估计物体的深度和大小。

简单讲一下我们的设计思路:我们希望结合2D和3D的优点。针对一个RGB-D的输入,我们先在图片上(RGB的图片)用一个2D detector得到一个二维物体区域。比如对于这辆车,我们得到一个红色的方框。

得到二维的区域中,因为大部分任务我们知道camera intrinsics(相机内参),那我们可以有二维区域生成unproject(逆投影)到一个三维的视锥,叫frustum。在这个三维视锥的区域里,有一个四面体的结构来表示一个视锥区域。

那接下来我们对这个物体的搜索呢,就可以在这个视锥内搜索,而且我们可以把它转化成一个在三维点云中搜索的问题。那这么做有什么好处呢?第一,我们可以利用这个2D的detector来缩小我们搜索的范围:本来我们需要在整个3D空间中搜索这辆车,那现在因为有2D detector的帮忙呢,我们只需要在视锥的范围内搜索,大大减小了我们搜索的计算量和复杂度。

第二个呢,就是因为我们在视锥内可以直接在点云上做操作,所以我们可以利用点云几何的精确性,以及利用我们3D deep learning的工具(比如PointNet),去直接分析和处理点云的数据,最后得到非常精确的三维bounding box。我们叫这个框架为“frustum based 3D object detection”,即基于视锥的三维物体检测。

那这个识别有两个挑战:第一个,大家可以看到这个例子,有一个人在打电话,他在这个房子前面。绿色的方框代表图片上的区域,那对应3D的区域呢,我们投影到一个上帝视角(相当于从上面往下看),就可以看到它对应的点云分布在非常大的一个尺度上。

那实际上这个人所对应的点云呢,仅仅是一个非常小的区域。这就会有非常多的前景的遮挡和后面的干扰的点出现。那可以想象,任何基于heuristic(启发式)和clustering(聚类)的方法都会非常惨地在这里败下阵来。

那另外,因为这个点的分布很大,你也很难用一些基于3D CNN的方法去把这个网格化、栅格化来做。那我们的解决方案呢,是用PointNet来处理这个问题:是一种基于数据的方法、基于3D点云的方法。

那大概的这个算法框架是这样的,我可以简单介绍一下:第一步很简单,就是说我们先在2D的图片上得到一个2D detection的结果;然后我们根据camera intrinsics可以把一个2D的region(或box),把它变换到一个3D的区域,就对应一个视锥的范围。

那我们就在这个视锥内去搜索这辆车在哪里。这是第一步,称作为“frustum proposal”(视锥提议)。那当然我们可以直接在这个视锥的点云里面去找这个3D的box,但我们看到:因为有很多后面的遮挡、前面的遮挡和后景的干扰,我们希望先把这个关键的点拿出来,而不要受到那些干扰点的影响。

所以我们接下来会做一个3D的物体分割的网络,那也是由一个PointNet的分割网络实现的。那我们把这个物体分割出来以后呢,我们可以再用另外一个网络去精确地估计这个物体的三维bounding box:去估计它的姿态、它的大小以及它精确的3D位置。

我想基于这个时间关系,我们接下来就略微快一点来讲:我们的网络实际上在KITTI的benchmark上取得了一度取得了非常优异的结果,远远超过了其他的方法。那当然现在显示的是在汽车上的3D物体检测average precision(平均精度)的结果,但是现在有不停的有人上传更新的结果,但我们的工作还始终保持在比较前沿的位置。

那另外在一些更小的物体上(比如刚刚是汽车,现在是行人和自行车),我们的优势和其他方法比就更大了。这是为什么呢?因为2D的proposal它的分辨率、image(图像)的分辨率是非常高的,所以它可以比较容易地把2D的区域propose出来。

嗯然后我们在行人的检测率上,到现在在KITTI还是在排名第一。OK,那么接下来时间有限,我可能就快速的过一下:就是说我们这个方法为什么有这么优异的结果呢?有两方面。第一方面就是它选择了3D这种representation(表示)。

那和2D的方法比呢,它取得更好的分割效果。比如说这个例子是说:我们可以在2D上也做一个Mask R-CNN,那么在image上就得到一个掩码。那用这个掩码我们可以把相应的depth point(深度点)拿出来;实际上看到这个depth point在空间中画成3D,它的分布是非常广的,它的分割效果其实很差。

为什么呢?因为两个点虽然在图片中很近,但在3D中它其实是可以非常远。所以呢2D的分割是很难实现精确的3D物体单独画出来。那和它相比,PointNet在3D直接在三维点云中分割呢取得非常精确和干净的分割效果。那结果上也可以看到,我们的这个3D的方法有大幅度的提升。

另外就是说我们可以对输入做一些很容易的归一化:因为我们是基于点云做操作,所以对点云的归一化可以简化我们学习的问题。比如说这里有一个例子:你想象这是一个从上面往下往地上看的一个视锥,我们有一些点分布在这个视锥里。

那想象有一辆汽车横在这里,我们看到这个汽车一部分的侧面。那取决于这个汽车的位置(比如汽车在左面、右边),这个视锥的范围呢变化非常大,那它的点的x坐标会有很大的变化。

为了归一化这个问题呢我们可以把坐标系进行旋转,那这样所有的z轴都会指向这个视锥的中心方向;那这个点在x方向的分布呢就会非常被简化,所以学习的问题也会变得很容易。

进一步呢这个因为这个物体在深度上可以有很大的区别(它的z有很大的分布),我们基于3D物体的分割呢可以找到这个分割后物体的中心。那这样这个物体的点会集中在原点附近,使得后面的学习问题大幅度继续简化。

同时我们可以用另外一个网络去估计这个物体真实的中心:那之前红色的中心仅仅是分割的中心,但物体真实的中心可能是另一个地方。我们一个网络进一步估计它然后最后在这个绿色的坐标系下去进行最后的bounding box估计。

那从结果上来看,经过这一系列的归一化操作我们这个detection accuracy(检测准确率)飞速的提升。那因为是点云,所以这些归一化的操作非常容易:仅仅是通过一些矩阵的旋转、矩阵的乘法就可以实现。

这里是一个总结,我们可以快速看一些结果:比如这个图片显示的是2D的proposal,那这个点云被渲染在三维空间中;和2D proposal对应的有一些3D的bounding box,可以看到在很多情况下它都能精确地估计三维的区域。

即使是在比如V3最右下角这个物体,它仅仅是有很少一部分可视,但我们依然能够PointNet估计它完整的3D bounding box。还有对于V4非常远的点,还有两个自行车靠的非常近都能精确地分割出来。

这里有另外一个例子我们跳过。这里可以有一个video来展示我们的检测结果:那个video是没有经过平滑的,下面显示的是3D box,上面显示的是2D box。那太远的物体因为点非常少所以我们就没有显示。

OK,那不仅仅是室外的物体对室内的场景也可以做3D物体的检测:这里也是展示了一些结果,效果上也非常好。不仅是在性能上有大幅度提升那速度也是和传统方法比有十倍到一千倍的加速。

OK,后面内容可能没有时间讲我们就直接跳到这个结论的部分:好在这个报告中我们介绍了两种针对点云专门设计的神经网络结构(PointNet、PointNet++),它们可以有这个对输入顺序的置换不变性,同时它们是轻量级的结构能对这个数据的丢失非常鲁棒。

而且提供了一个统一的框架可以为很多不同的任务服务。那进而呢我们也介绍了这个网络结构在3D场景理解中的应用,具体讲了这个在3D物体识别中的应用。

那其实还有很多其他应用场景了:比如说光流估计、场景的分割,或者是最近很多其他的(比如在局部特征的估计、对甚至camera pose的估计等等),都有很多应用。

那这是一些相关的文献列举在这里:实际上这个PointNet和PointNet++不仅应用在3D场景的识别,还可以应用在更多的领域:比如基于AI帮助的物体的设计、工业4.0啊(产品设计也好),需要很多3D数据的分析,PointNet在其中也能发挥作用。

那还有呢比如在Robotics(机器人学)中有大量的3D数据:比如要做Grasping(抓取)、Manipulation Simulation(操作仿真),那这些3D数据的分析和处理呢都可以应用到PointNet。

那甚至在生物计算中,生物学中有一些分子结构也可以用point cloud(点云)来表示。那PointNet也可以帮助它去估计里面的一些功能。

那甚至更广义来说,对于任何sample space(样本空间),其实都可以表示成一个point cloud:比如说一个image space(图像空间)it's a point clouds,就是一个图片的点云。那每一个点呢就是一个高维的图片。

那在未来也有可能用PointNet或PointNet++这样的结构去分析这个图片集合中图片的关系以及其特征。OK,那我这次报告就到这里为止:感谢大家待那么久来听这个报告,那谢谢大家的收听。接下来我愿意回答大家的问题。

OK我看到有很多问题,我来翻一翻:这个PointNet没考虑点之间的关系?对。然后在PointNet++里有这个考虑。STN的全称是什么?是Spatial Transformer Network(空间变换网络)。

OK,PointNet语义分割结果出来后输出的点云数量和输入不一样?呃这个应该是一样的:因为你希望对输入的每个点啊做一个分类,所以最后输出点的数量是一样的。实际上它并没有输出点(只是对每个点做了一个分类)。那么输出点相当于是一个3D的生成问题,那是一个另外的研究方向。

嗯关键点是如何选取的啊?关键点并不是选取的而是我们可视化的:就是说我们想要知道哪些点是关键的,然后相当于是已经有一个网络了,然后我们去分析这个网络它选择了哪些重要的点,然后把它可视化出来,把它叫做关键点。

呃分割中的数据集是什么?这个部件分割用的是ShapeNet Part(是ShapeNet子下的一个数据集)。那如果是场景呢?我们用到了S3DIS,就是Stanford的一个数据集;还有ScanNet(是Stanford另外一个数据集)。

Stanford特别喜欢打造数据集。PointNet++能用到分割吗?能,嗯。如果仅仅使用LiDAR做3D detection有没有可能进行拓展?可以的:那一个简单的拓展是我们可以在LiDAR中进行proposal,那它就不是一个视锥的proposal了。

比如可以是基于你把这个LiDAR投影到这个地面上变成一个bird eye view image(鸟瞰图),然后在里面进行区域的proposal;proposal出来以后你可以在这个区域里再用PointNet来估计它的3D bounding box。当然这是基于投影的方法。

那最近我们也在思考能不能直接在3D里做这个proposal:也有一些相关工作,比如最近有一个苹果的工作叫VoxelNet(体素网络),它就是也是利用了PointNet和3D CNN,直接在LIDAR数据中进行proposal和detection。

啊有兴趣的话这个夏老师可以看一下:呃最近几篇文章的评价,这个可能时间太长我们就跳过这个问题。

嗯输入点数量是可变的吗?是的:虽然在训练的时候为了这个batch,所以我们是sample到固定的数量;但在测试的时候是可变的。嗯如果是单个的数据的话它可以是任意的数量:那如果是一个batch的话实际上也是可以可变,你只要强行把它pad到一样的数量就可以了。

呃PointNet Sorry可能跳过了一些问题啊:PointNet在Grasping方面的应用可以介绍一下了吗?那Grasping其实大家知道,Berkeley有个应用叫DexNet都是在Depth Map上做的。但是它的这个Grasp的方向非常有限:但如果你想从任意方向去Grasp呢,你可能希望有一个更3D的理解。

那这里PointNet实际上是有应用的空间:呃检测分割用2D比较多,您认为使用3D会成为只用3D成为主流吗?啊我觉得未来的主流应该是结合2D和3D的数据,因为它们俩实际上是互补的。

那3D数据有非常精确的几何信息但它的分辨率往往比较低;而近期可能传感器还不能跟上这个图像的分辨率,因为图片的分辨率可以非常高。而且它有非常精细的这个texture(纹理),所以最终肯定是图片的信息和3D的数据结合:那这里其实有很多研究的工作可以做。

啊请问激光雷达点云是近密远疏这个怎么处理?嗯那当然就是说PointNet++里本身也有一些结构能处理这些不均匀采样率的问题:那更进一步呢实际上你也可以比如你知道这个点云的分布,你可以其实有办法加一些weight(权重),加一些权重来调节这个网络。

请问在哪里可以下载数据集?呃我们有这个项目都有GitHub:就PointNet、PointNet++和Faster PointNet啊都有GitHub,然后GitHub上都有数据下载和网络实现代码的这个开源。你可以直接搜索“GitHub pointnet”啊就能找到。

呃PointNet教大家如何用到实例分割:那其实Faster PointNet就是一种实例分割(Instance Segmentation),对吧?但在3D中实际上实例分割是先做的一个问题:你先有实例分割,然后再有3D object detect(bounding box)。所以Faster PointNet是……

PointNet 已经有实例分割的功能。最近也有一些其他工作,如果你看哪些工作引用了 PointNet,可以看到比如 UCS、USC 也有基于 PointNet 结构做的实例分割。未来会有更多的三维实例分割工作。场景分割现在效果已经很好,还推荐做吗?我觉得效果好也要看用什么样的指标去衡量。比如三年前大家觉得图像分类效果也很好,但后面又有大幅度提升,包括目标检测等。实际上就算到现在也还不是完美。三维和二维相比还有非常大的空间,不管是在分割、分类、物体检测这些问题上,都还处于比较早期的阶段。所以只要速度够快,做研究都是有价值的。

有人说 GitHub README 中的网址失效了。我会检查一下。PointNet++ 模型大概需要用多大的 GPU 来运行?目前来说,PointNet++ 有一点局限性,因为它需要对每个局部做计算,所以 GPU 使用要求比较高。但这有办法解决,比如设计专门的 CUDA layer 来减少 GPU 的使用率。对于一千零二十四个点,可能需要用到 batch size 三十二左右,需要六 G 的内存。PointNet++ 中使用了点坐标和法向量结合,但是代码中编码维度是三,这个可以很简单地去改。你可以参考 Semantic Segmentation 中的 code,很容易修改。

请问 Frustum PointNet 训练的时候用的是 2D ground truth 还是 2D 检测结果?我们用的是 ground truth,然后对它进行了一些扰动。这样有两个好处:一是比较简单;二是它可以和 2D detector 有一个分离,这样可以随时去换这个 2D detector,而不用重新训练后面的网络。当然,为了最大化地挖掘性能提升的空间,你可以做一些更紧密的联合,比如增加一些在 2D detection 上的训练。

请问建模后的数据集(如 Semantic3D)怎么构建训练样本?一个方法是把它变成一块一块的局部区域,比如十米乘十米的范围,可能有一些 overlap。Semantic3D 的场景比较单一,车可能只有十几辆。最近也有一些更好的数据集出现,可以网上关注一下。PointNet++ 代码测试结果的问题:测试时需要对这个方向做一个旋转,然后取平均。因为原来物体都 align 到某一个方向,对结果有一定波动性;旋转后取平均效果较好。Data augmentation 上可以做 random drop 一些点,这样 generalizability 更好。

有没有可能直接用 PointNet++ 从点云中提取特征预测 3D object?是有可能的,我觉得这个还是正在进行中的研究。VoxelNet 也是其中的一种。VoxelNet 现在在 KITTI 排名中做到第一,仅用 LiDAR 数据。我觉得这是可以理解的,因为它检测的是车辆,做到第一是因为车辆比较大,光靠点云是足够的。但它对于行人和自行车就比较困难了。

一个网络中跑多次 PointNet++,每次 batch size 可以不一样吗?这取决于框架。如果框架支持的话就是可以的。如何看待今年的 SplitNet?我觉得 SplitNet 还是一个挺有意思的工作,它结合了传统的 Splitting 思想,另外考虑了 2D 特征和 3D 特征结合的问题。虽然不一定是一个完美的解决方案,但它是比较早考虑这个问题的,而且显示出了 2D、3D 结合的一些优势。

法向量的作用是什么?如果您仔细看的话,可以发现物体分类中基于图像(multi-view)的方法实际上还是最领先的。因为图片分辨率非常高,可以捕捉非常细微的几何细节。比如键盘上的键在图片上看是非常清晰的;但在点云上看,它和一个平板没有区别。如果在 mesh 上提取法向量,就能把平板和键盘的键给区分开。PointNet CNN 的问题比较具体,我们可以线下讨论。

十元十 rack 十五(deformable object)就是那个猫和马分类的问题中,非欧的空间是怎么处理的?我们先算这个 geodesic 的测地距离,然后把它做一个 dimension reduction,降维到一个三维。用一个三 D 欧式距离去模拟高维的测地距离,然后用 PointNet++ 实现。请问 T-Net 的训练好的吗?它并不是提前训练好的,它是和后面的网络一起优化的。所以属于一个 weakly supervised 的系统。当然在 Frustum PointNet 里,如果数据集有姿态的 ground truth,也可以用这个去监督 T-Net 的训练。所以它既可以是 end-to-end weakly supervised training,也可以是有监督的 training。

PointNet++ 结果不太稳定,请问如何取得最佳结果?这在一定程度上是由 ModelNet50 这个 data size 限制的。ModelNet 上面结果可能非常不稳定,取决于不同的 evaluation 方法和 test training split。所以我们鼓励在测试时对每个 test shape 进行多次旋转,然后平均这个结果,这样会稳定很多。最近最好的室外分割数据集包括哪些?有一个法国的组出的数据集比较大,但我不确定怎么搜。如果你给我发一个邮件的话我可以发给你。

这是斗鱼用户 1xae 提出的问题:PointNet++ 为什么不在 S3DIS 上做?当时一是想测试一下 ScanNet 这个数据集,因为是一个新的数据集;第二是因为觉得 S3DIS 的 diversity 其实不太够。因为它是在六个建筑的层里面做的,每一层里面的物体实际上是非常相似的,所以 generalizability 有一些问题。我们觉得 ScanNet 是一个更大规模的数据集,所以当时在那上面做了一些尝试。

请问在人脸点云这样的细粒度分类可以用 PointNet 来做吗?我觉得应该是可以的。如果你直接用点云,更精细的几何信息反而是更有用的,所以直接在点云上做学习是很有潜力的。三维行人识别有意义吗?当然有意义了,因为你想要检测到有没有人嘛,这样不希望撞到他。有时候图片比较暗的时候看不到这个人,如果在三维中能检测到,可以预防很多交通事故。

PointNet 大家能对 RGB 点云中的 RGB 进行处理吗?可以啊,一个简单的方法就是把 RGB 当做这个点的 channel。这样点就不止三维了,可能有六维(XYZ+RGB)。PointNet++ 中的代码中有用到 T-Net 吗?我们 release 的代码中没有用到 T-Net,因为发现在 ModelNet 分类的问题中 T-Net 的帮助不大。一定程度上是因为 PointNet++ 已经学习了局部的特征,局部特征对旋转不太敏感,所以能取得比较好的效果。

PointNet++ 具有对点云局部几何变换的不变性吗?我们想过这个问题,但如果你在局部也加一些 T-Net 的结构实际上不太合理。因为局部变换了并不能保证不同局部的变换是统一的。如果要实现这个统一性,实际上你需要某种类似 Capsule Network 的网络了。法国的数据集是室外的,每一个点都有一个类别,是一个语义分割的数据集,这个数据集还是比较大的。

请问 PointNet 可以用于房屋家具摆放的设计中吗?这个问题比较开放,我觉得可能可以。因为涉及到三维的理解和处理,取决于你怎么对这个问题建模了。我觉得是有这个应用前景的。点云特征提取跟 RGB 的颜色信息有关吗?在最简单的假设下可以是无关的,因为光是 XYZ 坐标已经提供了几何信息。理论上来说不需要其他的信息,已经能完成很多任务。RGB 是锦上添花的一些特征。

当数据集不是太充足的时候,请问怎么能保证框架的性能呢?这是一个非常开放的问题了。数据是一个很大的瓶颈。但有一些方法,比如你可以在已有的数据集上进行 pre-training;也可以生成一些人造的数据集(synthetic data)。另外更多的工作是我们如何能进一步设计网络,使得它能更优化地利用数据。这是一个比较开放的问题。

用于冰 picking 的工作(弓箭识别,然后位置估计、做抓取),前景如何?我觉得前景非常好。斗鱼用户 1xae 关于数据集的问题,你也可以试试最近一个叫 Matterport3D 的数据集,听说还不错。小歪充满阳光的问题:为什么要用一千零二十四维这么高?我们在理论部分其实有一些解释。这个 bottleneck layer 的维度大小是很关键的一个维度。如果太小,会非常限制网络的 capacity(能力)。

请问 PointNet 使用更多次采样、更深的网络提升有多大?这个我们没有尝试太多。如果你有足够大的 GPU 和计算资源,可以试一下。Kiki7jx 的问题:好的我可以去更新一下。斗鱼用户问为什么用 FPS 降采样?有其他方法吗?FPS 实际上是希望达到一个均匀采样的效果。因为 FPS 是采尽可能远的点,最终实现的是对空间比较均匀的降采样。其他方法其实有很多了,比如最简单的随机采样,效果上会不如 FPS 的 Fastest Point Sampling。当然最近也有工作提出其他采样方法,空间很大,但实验来说 FPS 已经能取得比较好的结果。

PointNet 针对的点云数据输入是不是主要来自 LiDAR 和图像融合的点云,还是只是针对 LiLidar?我们在设计网络结构时希望这个问题尽量 general、经典。最开始假设你的点只有三维数据(XYZ 坐标)。接下来你可以扩展,在三维数据之上加点的 RGB、intensity、normal。这些都是锦上添花,但最基本的我们觉得光有 XYZ 网络也要能有特征学习的能力。另外如何更好地结合 RGB 和 XYZ geometry,是一个现在比较火的研究方向了。

Little Quite Sweety 问:如何处理旋转至各个不同角度的点云模型?这也是一个开放的研究问题。最简单你可以通过 data augmentation 的方式实现,但效率很低。最近有一些工作进一步研究,比如基于 spherical CNN 的方法。还有人问斯坦福 PhD 一般每天工作几小时?我觉得变化范围很大,有时候不工作,有时候一直在工作。

斗鱼用户 GVQ 的问题:对于乱序堆叠的不规则形状的弓箭识别效果会好吗?这个问题比较开放。因为弓箭识别和其他物体识别不太一样,你可能有它的模型,所以识别方法会和通用物体的识别有所不同。我觉得如果能把这些已知的模型利用上来,识别准确度应该会高很多。PointNet 怎么用多 GPU 进行加速训练?在 PointNet++ 中我们提供了多 GPU training 的代码,基于 TensorFlow。它也可以支持 PointNet。在 GitHub 代码库里有。

您觉得点云的表达会是未来三维视觉的方向吗?还是感觉有其他趋势?我觉得会是一个非常主要的方向。但是因为三维本身应用场景非常多,在不同场景中它会倾向对不同的数据类型有不同的偏好。在三维场景理解中点云肯定非常重要;在其他领域如建模、可视化或仿真里面,你可能会倾向于用不同的数据类型。

有一个用户问了很有意思的问题:请问 Frustum PointNet 2D 检测不准的时候,frustum 会把物体截掉一部分吗?会的。但是这个网络就算截掉一部分也有一定的能力重新去复原整个完整的形状。当然如果 2D 结果非常不好,肯定会限制后面 3D 部分的效果。未来有一些工作是如何更好地把 2D 和 3D 信息整合在一起进行训练,这可能是未来的工作。

还有一个用户问到:在 Flatten PointNet 实现中为什么可以不把 flatten size 变大一些?当然是可以的,这都是可以尝试的空间。如何看待 GCN(Graph Convolutional Neural Network)在点云上的应用?GCN 训练难度、显存占用这两者会成为比较大的限制。我觉得 GCN 和 PointNet++ 有非常多相通的地方,因为两者都是在三维空间中去寻找局部,然后在局部定义某种操作形成多级网络架构。其实非常相似甚至可以互相变换。但 PointNet++ 有一个好处是它不仅适用于二维和三维空间,还适用于非常高维的空间。因为它只是纯粹依赖于距离的定义;而很多其他网络架构限定只能应用在三维空间中。

请问能给一下邮箱吗?可以啊,我的邮箱就是 rqi at stanford dot edu([email protected]),就是我主页后面那个。嗯,请您推荐几个国内外做这个方向的老师和学校?国内其实我不是特别清楚啊。国外的话主要可能是斯坦福、伯克利、MIT,还有很多其他学校也都开始在做。德国也有一些 ETH 的组。现在其实是一个趋势了,因为计算机视觉领域大家也在寻找新的增长点,三维方向肯定会越来越火热。

请问有做三维重建与语义结合的项目吗?这其实也是一个很有意思的方向。我自己暂时有一个项目是做这个的,做三维物体扫描物体的 completion(补全)。相当于你有一个非常 partial 的 scan,希望把它变成一个完整的扫描。你可以用一种 data-driven 的方法用一个网络去恢复它完整的结构。如果你到我的主页就可以看到那个工作。

请问和 Deep Sets 这个工作的区别?我们这个 PointNet 工作和 Deep Sets...

Sets的工作是同期的工作,嗯,但他们可能更侧重于在Machine Learning的Community,所以他们呃。宣传的范围、应用范围会广一些,比不仅仅只三D啊,还有其他的。但我们会更侧重于研究怎么在三D设计网络,所以PointNet加加会去研究这个三D中怎么利用distance space,包括怎么样利用点云的transformation等等。所以虽然是同期的工作,但我们更侧重于三D的数据理解、识别,他们可能更侧重于呃比较general的machine learning。

GAN有没有可能用在点云上呢?如果可以,会用在哪些方面呢?我们组也有一个呃PhD做了一篇工作叫Point PointGAN,嗯,是研究怎么在点云上做GAN的。您可以看一下那篇论文,嗯,可能有所启发。

呃,请问 PointNet可以用到遥感影像的分类检测吗?嗯,我觉得因为遥感影像确实也会有一些稀,可能是稀疏的点云比较多,我觉得完全是可能的,特别是呃语义的分割应该是一个很好的应用场景。

呃,请问Flatten Model 2D Box是如何获得的呢?直接用Ground Truth吗?那在训练的时候,我们可以用Ground Truth去生成这些2D Box,那做一些扰动和一些扩大、缩小。那在测试的时候,我们是有一个2D的Detector来生来得到这个2D Box的。

请问点云的数据增强可以怎么实现?那有很多种不同的扰动了,比如说你可以呃增加点的数量,减少点的数量,可以对点的大小,对点云的大小做一个scaling,做一个大小的变换,做平移、旋转、sampling density采样度的变换,嗯,然后对每一个点进行不同的噪音扰动,比如高斯的噪声等等等等。

请问,之后的发展如何?会留在斯坦福吗?啊,我之后我现在还是在读博士啊,之后会从斯坦福毕业。然后近期接下来会在Facebook呃做一段时间的学术访问。那之后呃这个可能是比较开放的。

嗯,PointGAN好像谷歌搜不到。嗯,你可以搜我们的实验室,叫那个Grubbs Lab。然后你可以看到,或者你可以给我发邮件,包括我看到这个斗鱼用户之前还有呃一些问题,你可以发邮件,我可以在邮件里统一回复你。

好,谢谢大家这个来到直播间收听。那希望呃大家以后学业工作都一切顺利。如果有相关的问题或者有想合作的意愿,我们都可以继续交流啊。我的主页上也有我的联系方式。好,再次谢谢大家。