本系列是按照bilibili上刘永成博士的分享课的论文笔记,主要针对点云基于图论的处理方法。
这一部分主要讲解的方法包括:DGCNN、RGCNN、Spectral Graph Convolution、DeepGCNs
DGCNN (TOG 2019)
DGCNN: Dynamic Graph CNN for Learning on Point Clouds
具体思想
- 改进pointNet方法。主要是pointNet在特征提取中只考虑各个点的特征,未对相邻点进行考虑。PointNet的主要流程是:先单独计算(更新)每个点的feature,更新多次之后,最后用global pool将所有点的feature整合为一个点云的feature。在更新每个点的feature时,只与这个点之前的feature有关,与其它点的feature无关。作者在论文中认为:每个点的feature在计算(更新)过程中彼此独立,每个都相可以看作是一个全局feature。这可能就是一个值得改进的地方。
- 提出动态图的想法,每经过一次edgeConv之后都要重新提取一次动态图,即knn特征提取。使得特征感受野逐步增加。
核心部分
edgeConv
- 输入特征维度为$(n,c_1)$, 针对每一个点$x_i$计算它的knn,即k个相邻点(使用top-k即升序得到)。
- 计算每个点的edge特征:$x_{j_{i1}}-x_i,…,x_{j_{ik}}-x_i$
- 将点的特征和边的特征连接起来。$(x_i, x_{j_{i1}}-x_i),….,(x_i, x_{j_{ik}}-x_i)$
- 使用共享参数的全连接层来进行特征提取。代码中可以用1x1的卷积来实现。得到k个特征。
- 用max-pool这种对称函数来提取每个点的特征。输出特征维度为$(n,c_2)$。
这样一来更新权重的时候,每一个点的权重更新不止于这个点的特征有关,还与周边的k个最邻点的特征有关。
动态图
1 | x = get_graph_feature(x, k=self.k) |
在每一次edgeConv之前要进行新特征的图提取,提取出新特征每一个点的k个相邻特征。这样图结构就变成动态的,能够自适应不同数据。越深的特征感受野也就越大。如代码所示也将不同感受野的特征进行了连接操作。
Regularized GCNN. MM 2018
RGCNN: Regularized Graph CNN for Point Cloud Segmentation
具体思想
- 用图论的思想处理点云数据,论文中graph中说的是全连接图,即点云中所有点是互通的。然后用正则化的图卷积来进行特征提取。
- 用切比雪夫多项式拟合$L^k$降低计算复杂度。
结构图如下所示:
这篇文章只讲关键部分,具体推导请看我的另外一篇GCN的博客。
核心部分
邻接矩阵A、度矩阵D、拉普拉斯矩阵L
- A: 定义的图结构为全连接图,计算点云的A矩阵的公式为:
- D: 因为图结构是全连接,所以度矩阵D为对角线为点云总点数的对角阵。
- L: 正常L = D - A,归一化的L为: $\boldsymbol{L}=\boldsymbol{D}^{-1 / 2}(\boldsymbol{D}-\boldsymbol{W}) \boldsymbol{D}^{-1 / 2}=\boldsymbol{I}_{n}-\boldsymbol{D}^{-1 / 2} \boldsymbol{W D}^{-1 / 2}$
图卷积
- 因为点云所在的空间不像图像类似的欧式空间,我们可以建立点云之间的拓扑图,在这个拓扑图上进行特征提取。所以这也是另外一个处理点云数据的方法。
- 将空域的数据转换为频域上面,用傅里叶变化进行变换计算之后再通过傅里叶逆变换转换回来。$\mathbf{x} *_{\mathcal{G}} \mathbf{y}=\mathbf{U}\left(\mathbf{U}^{T} \mathbf{x}\right) \odot\left(\mathbf{U}^{T} \mathbf{y}\right)$,其中$U^Tx$为傅里叶变换,$Ux$为逆变换,相乘方式为逐点乘。
- 通过滤波提取有用特征:
切比雪夫多项式
使用切比雪夫截断法来拟合$L^k$降低计算复杂度。
结合代码:
1 | def chebyshev5(self, x, L, Fout, K): |
和上图是一致的,W就代表着切比雪夫多项式的系数,用这个多项式去拟合高阶方程,有点类似PCA降维。
k值代表k-hop,最多能传递几步。这就和感受野比较类似。但是相对应的k越大计算复杂度越大。
Spectral Graph Convolution (ECCV 2018)
Local Spectral Graph Convolution for Point Set Feature Learning
具体思想
仍然是针对pointNet++系列,点特征已经以独立和孤立的方式被抽象,忽略了相邻点的相对布局及其特征。这一个缺点进行改进。通过在局部图上使用谱图卷积结合新的图池化策略来克服这种限制。
如图所示主要是三个部分:
- 采样和knn进行分组,和pointNet++系列类似
- Spectral Convolution,用图谱的方式提取特征,考虑了相邻点之间的联系
- Recursive Cluster, 用谱聚类 + 交替最大池化和平均池化,来提取具有代表性的区域特征
核心部分
Spectral Convolution
左边是pointNet++系列的方法,右边是图谱卷积的方法。
对局部点云建立图结构,用傅里叶变换和谱滤波再用傅里叶逆变换,返回空域。也是用图谱卷积提取局部点云特征的一贯方法。和上一种RGCNN不同是在局部区域中提取。
Recursive Cluster
既然之前已经计算过拉普拉斯矩阵,那么当然就可以用这个来进行谱聚类。用递进的方式,逐步减少聚类中心,即cluster。结合池化操作,提取出当前区域的中心特征。
DeepGCNs (ICCV 2019)
DeepGCNs: Can GCNs Go as Deep as CNNs?
具体思想
将GCN做得跟CNN一样可以有较深的层数。GCNN因为需要聚合相邻信息,所以说有一定的平滑,导致层数不能太深。所以说作者将三个在CNN中用得比较多的方法(resnet连接方式、densenet连接方式、膨胀卷积),用在了动态图卷积中。使得梯度不会消失,信息得以保留。
核心部分
连接方式
如图所示,每一层GCN都会分别提取动态图的信息,resGCN进行加和;denseGCN进行拼接。在尽可能保留信息的同时,使得层数变深,增强感受野。
图膨胀卷积
如图所示,通过knn的方式,先确定卷积区域,也即当前感受野区域。设置不同的dilation值,在不增加计算复杂度的前提下,增强感受野。和CNN中的膨胀卷积类似的效果,只是应用到图中来。