常见的3D数据表示方式有点云、多视图、体素、mesh网格等。
PointNet是直接处理点云数据的网络,可以实现对点云的分类和分割,其首页地址为:http://stanford.edu/~rqi/pointnet/。
主要从解决点云的无序性和保证旋转一致性两个方向出发,提出了以点云作为输入的分类网络和分割网络。
一、点云存在的两个问题
1、 点序不同排列(无序性)结果应该一致
可以选择以下几种方式:
方式1. 按照一定规则对点集进行排序
方式2. 将点集的所有排列作为增强数据,训练一个循环网络
方式3. 利用一个对称函数将所有信息进行聚合
方式1看起来最简单,但是在高维空间中,实际上不存在一个在一般意义上相对于点扰动稳定的排序方式,方式2也被证明对于长度小的序列有较好的鲁棒性,但对于动不动上千的点云数据不太合适,因此PointNet采用第三种,以下是不同方式实验对比结果。
常见的对称函数有取最大、求和等
PointNet选择采用多层感知机(MLP)和最大池化(Max Pooling)
2、旋转后分类结果一致
要做到旋转的一致性,PointNet引入T-Net得到一个旋转矩阵,对输入特征进行自动对齐。将正则化项添加到我们的softmax训练损失中,即将特征变换矩阵约束为接近正交矩阵(正交变换不会丢失输入中的信息)
实验发现,通过添加正则化项,优化变得更加稳定,并且模型也获得了更好的性能。
二、网络结构
分类网络
分割网络
三、实验结果
分类
部件分割
场景语义解析
四、其他细节:
Shared MLP
网络结构中的Shared MLP是什么?这一点论文中没有提,但从代码实现上来看其将点云变为B * N * 3,采用1*1的一维卷积,其实相当于每个顶点都共用了同一个卷积权重
如下图所示某种程度上是类似于MLP的,因此称为Shared MLP(个人理解,不知道对不对)。
鲁棒性好
PointNet对缺失数据鲁棒性较好,如下图所示,数据下采样至原来的50%,精度值只下降2%, 其中Furthest表示最远点采样,Random表示随机采样。
而VoxNet对缺失数据鲁棒性就很差。
可视化
可视化显示出哪些点对最后全局特征有影响,输出为Critical Points
具体操作步骤是输出maxpooling之前的特征N*1024, 然后获取最大值的索引,得到这些索引对应的点即为Critical Points。
代码可参考:https://github.com/GitBoSun/PointNet_vis/blob/master/Desktop/DeepLearning/pointnet_vis/vis.py
参考链接
https://github.com/charlesq34/pointnet/issues/115
https://blog.csdn.net/Passersby__/article/details/104941591
https://github.com/GitBoSun/PointNet_vis/