首发于 机器学习和深度学习

点云基于图论的处理方法

本系列是按照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个最邻点的特征有关。



动态图

x = get_graph_feature(x, k=self.k)
x = self.conv1(x)
x1 = x.max(dim=-1, keepdim=False)[0]

x = get_graph_feature(x1, k=self.k)
x = self.conv2(x)
x2 = x.max(dim=-1, keepdim=False)[0]

x = get_graph_feature(x2, k=self.k)
x = self.conv3(x)
x3 = x.max(dim=-1, keepdim=False)[0]

x = get_graph_feature(x3, k=self.k)
x = self.conv4(x)
x4 = x.max(dim=-1, keepdim=False)[0]

x = torch.cat((x1, x2, x3, x4), dim=1)

在每一次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$降低计算复杂度。


结合代码:

def chebyshev5(self, x, L, Fout, K):
        # If K == 1 it is equivalent to fc layer
        N, M, Fin = x.get_shape()
        N, M, Fin = int(N), int(M), int(Fin)
        x0 = x  # N x M x Fin
        x = tf.expand_dims(x0, 0)

        def concat(x, x_):
            x_ = tf.expand_dims(x_, 0)  # 1 x M x Fin*N
            return tf.concat([x, x_], axis=0)  # K x M x Fin*N

        if K > 1:
            x1 = tf.matmul(L, x0)
            x = concat(x, x1)
        for k in range(2, K):
            x2 = 2 * tf.matmul(L, x1) - x0
            x = concat(x, x2)
            x0, x1 = x1, x2
        # K x N x M x Fin
        x = tf.transpose(x, perm=[1, 2, 3, 0])  # N x M x Fin x K
        x = tf.reshape(x, [N * M, Fin * K])  # N*M x Fin*K
        # Filter: Fin*Fout filters of order K, i.e. one filterbank per feature pair.
        W = self._weight_variable([Fin * K, Fout], regularization=False)
        x = tf.matmul(x, W)  # N*M x Fout
        return tf.reshape(x, [N, M, Fout])  # N x M x Fout

和上图是一致的,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中的膨胀卷积类似的效果,只是应用到图中来。

代做工资流水公司沧州个人流水价格桂林代开对公账户流水昆明制作对公账户流水宜春打对公流水桂林银行流水账单制作太原房贷流水价格淄博自存银行流水制作广州代做流水单兰州打印流水单邯郸办理背调流水荆州转账银行流水代做襄阳背调银行流水办理襄阳打印贷款流水昆明入职流水办理贵阳代办背调工资流水沧州贷款流水多少钱海口打印入职流水吉林企业对公流水样本漳州做工资代付流水保定车贷流水样本苏州打公司银行流水银川代开薪资流水单大连查公司流水济南房贷银行流水 多少钱大连自存流水价格济宁办购房银行流水长沙企业对私流水代做淄博制作薪资流水单宁德代做背调流水昆明对公银行流水公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化