https://www.youtube.com/watch?v=Ew24Rac8eYE
传统图像数据是2维的
3D点云是3维的,可以表达更多信息
初始的点云数据仅仅包含了每个点的坐标信息(x,y,z),这些对我们要完成的后续任务远远不够,我们还需要知道每个点和周围的点的关系甚至是每个点和全局的关系。
点云数据并不是定义在一个规则的网格上,空间上可以任意分布、数量也可以任意,是不规则数据。
一种解决方案:
这种方式的缺点:
那么如何构造一个backbone来提取3D点云的这些特征呢?
点云数据的特点
点云数据是一个inordered set,每个点出现的顺序不影响集合的本身
N表示点云中的有N个点,D代表每个点拥有D维的特征。D中可以包含点的坐标信息(x,y,z),也可以包含颜色、法向量…
因为点集是无序的,一共有N!种排列组合。这要求我们设计的backbone对所有置换都具有不变性。
最简单的最大池化和平均池化函数虽然具有置换不变性,但是无疑会丢失有意义的几何信息。
比如说一辆车,在不同的角度观察,点云中的每个点的坐标会有所变化,但表示的都是同一辆车。
如何设计网络能使得网络能够适应这种视角的变化呢?
通过一个神经网络T-Net生成变换的参数,再用生成的变换函数对输入数据进行变换。使得这个变换函数能够自动对准对齐我们的输入,后面的网络能够适应不同角度的输入数据,处理任务变得更加简单。
对点云数据进行变换操作非常简单,只需要进行一个矩阵乘法。
做一些扩展:不仅可以对输入数据进行变换处理,也可以对点的中间特征进行特征空间的变换。
比如,一开始已经将点的特征变成K维,那么现在有一个N * K的矩阵。我们可以设计一个K * K的矩阵进行矩阵乘法对这些中间特征进行特征空间的变换。这样可以得到另一组特征。
对于以上涉及的这些高维的变换,优化的难度也更高,可能会需要一些regularization:比如会尽可能希望这个矩阵接近于正交矩阵。
单个点的特征和全局的坐标结合起来实现分割的功能。
最简单的就是:将全局的特征重复n遍,每一个和原来的单个点的特征连接在一起,相当于单个点在全局特征中进行了一次检索,“我在全局特征中处于哪一个位置,我大概属于哪一个类”
FLOPs:计算量,floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
因为PointNet的高效性,其非常适用于移动设备和可穿戴设备。
对数据的丢失都非常鲁棒
why?
解释这个可以通过一个可视化去理解:
最大池化使得模型只去关注critical points,这也使得模型对点的丢失具有较好的鲁棒性。
在PointNet中,先对每一个点通过MLP做一个从低维到高维的映射,再对高位的特征通过MLP结合到一起。所以PointNet要么是对一个点做操作,要么是对所有点全局的特征在做操作。所以PointNet和3D卷积相比缺少了一个局部的概念,比较难对一些精细的特征进行学习。此外,在平移不变性上也有一定的缺陷,如果对点云的每一个点进行一个平移操作,那么经过PointNet学习的特征也会完全不一样。
也可以通过一种“up-convolution”的方式将pointnet提取的特征点复原回去。
在CNN中现在越来越流行选择非常小的kernel,比如在VGG中大量应用3*3的kernel。
那么在PointNet++中是不是这样呢?其实这是不一定的。
在point cloud中非常常见的一种情况是采样率非常不均匀。比如一个depth camera采样到的point cloud,近的点会非常密集,远的点会非常稀疏。那么对于PointNet++的学习就会在稀疏的地方产生很大的问题。比如在某个地方我们的划定的作用区域中只有一个点,那么在那个区域中学到的特征就会非常不稳定。这是我们很想避免的。
为了量化这个问题,我们做了一个控制变量的实验,验证了点的疏密对PointNet++网络精确度的影响:小的kernel会受采样率不均匀影响较大。
针对这个问题,可以设计一些新的网络结构来避免这个问题。
缺点:
- 3D空间的搜索量非常大,计算量也非常大。
- 点云的分辨率有限,比较难发现比较小的物体。
缺点:
RGB图像:依赖物体大小的先验知识,很难估计物体的精确位置。
RGB-D图像:两个实际距离很远的点投影到图像上的距离有可能非常近。
在图片这种表达形式下,用2D的CNN还是受到了很大的局限性。
很难精确地估计物体的深度和大小
2D detectors for region proposal + 3D frustum + PointNets
整体思想:
缺点:
occlusions and clutters are common in frustum point clouds