SO-Net

Posted by 加华 on November 19, 2019

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