SO-Net detailed reading log.
Intro
SO-Net延续了PointNet系列的实验及写作方式,提出一种可以适用于目前多个点云处理任务(classification, retrieval, segmentation)的模型,与PointNet++类似,SO-Net是一个Hierarchical的模型结构,这也与我一直想要在点云上实现的CNN-like pooling有关联.
PointNet++中对输入1024个点采用了FPS(Farthest Point Sampling)采样的方式, 确定128个具有代表性的点, 进而利用欧氏距离在每个点的邻域中确定一个点云簇, 从而分别在128个点云簇中利用一个权重共享的PointNet提取每个小点云簇的特征.
SO-Net 与 PointNet++的不同之处主要在于确定128个具有代表性点的方法不同, SO-Net借鉴了无监督学习中的SOM,通过拟合输入点的空间分布来确定最终需要保留的点.
Method
通过SOM训练更新每个nodes的信息,从而使得nodes能够充分地表征输入点云的空间分布.
首先确定输入点在SOM nodes中的k近邻:
\[s_{i k}=\mathrm{kNN}\left(p_{i} | s_{j}, j=0, \cdots, M-1\right)\]然后利用k近邻nodes的坐标信息去标准化输入点:
\[p_{i k}=p_{i}-s_{i k}\]因此输入点数从N个变到了kN个, 文章在这里利用多层全连接提升模型的非线性:
\[p_{i k}^{l+1}=\phi\left(W^{l} p_{i k}^{l}+b^{l}\right)\]此时,模型需要将kN个点的特征映射到M个nodes上, We apply a channel-wise max pooling operation to get the node feature $s ^0 _j$ for those point features associated with the same node $s _j$,对与同一个node相连的所有点作max-pooling:
\[s_{j}^{0}=\max \left(\left\{p_{i k}^{l}, \forall s_{i k}=s_{j}\right\}\right)\]Discussion
SOM应用难点:
- SOM训练后的nodes值与其初始化有较大关系,因此模型在训练过程中可能不稳定;
- SOM的更新算法与输入点的顺序有关,这与点云处理过程中需要满足的可置换型(invariant to permutation)相悖.
作者的解决方案:
- 对每一个点云样本固定初始种子点;
- 利用batch update的更新方式, 舍弃per point的更新方法.
问题 SOM nodes的初始化只能是在半径为1的球内进行随机选取,但输入点云可能只在球的某一个角落,因此会存在隔离点(isolated nodes)的情况.
SOM vs k-means
k-means | SOM | |
---|---|---|
初始化问题 | Y | Y |
更新算法满足可置换型 | Y | N |
考虑点云density影响 | N | N |
References
[1] Li et.al SO-Net
[2] Qi et.al PointNet
[3] https://towardsdatascience.com/kohonen-self-organizing-maps-a29040d688da