点云定义:通过测量仪器得到的产品外观表面的点数据集合,通常使用三维坐标测量机所得到的点数量比较少,点与点的间距也比较大,叫稀疏点云;而使用三维激光扫描仪或照相式扫描仪得到的点云,点数量比较大并且比较密集,叫密集点云。其本质是nx3得矩阵(n是点数,3坐标信息)。
点云的特征:
- 无序性:点云只是一个集合,点的顺序不会影响其表示的物体的形状。
- 旋转性:刚体旋转、平移不变性,旋转和平移甚至是尺度的变化不会改变点云的分类、分割结果
针对点云的特征的解决办法:
无序性:采用对称函数,如maxpool,或求平均数提取质心
如下图,
Xi:每个点 h:特征提取 g:对称函数 r:更高维的特征的提取
针对点云的旋转性:希望不论点云在怎样的坐标系下呈现,网络都能正确的识别出。这个问题可以通过STN(spacial transform netw)来解决。pointnet通过学习一个矩阵来达到对目标最有效的变换。
pointnet采用了两次STN,第一次input transform是对空间中点云进行调整,直观上理解是旋转出一个更有利于分类或分割的角度,比如把物体转到正面;第二次feature transform是对提取出的64维特征进行对齐,即在特征层面对点云进行变换。
网络结构图:
由结构图可以看出其网络流程:
首先输入进来[B, n, 3]的数据,先通过乘一个仿射矩阵(通过T-NET学习得到)对原始点云数据进行空间调整(将点云旋转出一个有利于分类或分割的角度);
接着进行共享的MLP进行特征提取(先用[1, 3]的卷积核,将[B, n, 3, 1]进行增加维度同时将三个坐标合为一个数,具体合的方式是通过学习得到的,最终得到了[B, n, 64]);
通过乘一个学习到的仿射矩阵对提取的多维特征进行对齐(????)。
再利用MLP进行多维特征提取得到[B, n, 1024]的特征(每个点由原来的三维扩展到了1024维);
再经过对称函数maxpool提取到[B, 1024] (其实这个维度是最后经过reshape得到的,这里为例叙述方便就直接写成这样了)global feature ;
再经过几个全连接层逐渐降低特征维数,降低到分类种类数即各类的得分。分类任务到此结束。
分割任务:
本质是对点云的每个点进行分割,除了全局特征还需要低维的局部信息,所以如结构图所示:PointNet的做法是将全局信息附在每一个局部点描述的后面,形成了1024 + 64 = 1088维的向量,而后通过两个感知机来进行分割。最终输出的是[B, n, m],m是每个点的分类。
网络细节:T-NET解析:
从结构图可以看出T-NET的作用就是生成一个仿射矩阵,与输入的数据或提取到的特征相乘。
具体的细节:T-NET其实就是一个微型的Pointnet网络结构,对点云进行平移、旋转等规范化操作。
先经过MLP进行特征提取[B, n, 1024],经过maxpool得到[B, 1024],然后再经过几个全连接层,1024->512->256,即[B, 256]。至此就是一个微型的point net网络。
接下来将生成仿射矩阵操作,先初始化一个[256, k*k]的权重和[k*k]的偏置(其中k取决于输入数据的大小),进行与提取到的数据相乘[B, 256]*[256, k*k] + [K*k]==>>生成[B, k*k](矩阵与向量的相加用到了broadcast), 再对其进行reshape成[B, k , k],仿射矩阵生成完毕。