目录

Abstract

1 Introduction

2 Notations And Preliminaries

3 Graph Recurrent Neural Networks

3.1 Node-level RNNs

3.2 Graph-level RNNs

4 Graph Convolutional Networks

4.1 Convolution Operations

4.1.1 Spectral Methods

4.1.2 The Effificiency Aspect

4.1.3 The Aspect of Multiple Graphs

4.2 Readout Operations

4.2.1 Statistics

4.2.2 Hierarchical Clustering

4.3 Improvements and Discussions

4.3.1 Attention Mechanism

4.3.2 Residual and Jumping Connections

4.3.3 Sampling Methods

5 Graph Autoencoders

5.1 Autoencoders

5.2 Variational Autoencoders

6 Graph Reinforcement Learning

7 Graph Adversarial Methods

7.1 Adversarial Training

8 Summary

8.1 Future Directions

Abstract

本文根据现有方法的模型架构和训练策略,将现有方法分为五类:图递归神经网络图卷积网络图自编码器图强化学习图对抗方法。

 1 Introduction

将传统的深度学习架构应用于图形时存在几个挑战:

  • 图的不规则结构:与图像、音频和文本具有清晰的网格结构不同,图形具有不规则的结构,这使得很难将一些基本的数学操作推广到图中。例如,为图数据定义卷积和池化操作是困难的。
  • 图的异质性和多样性:图可以是复杂的,包含不同的类型和属性。例如,图可以是异构的或同质的,加权的或未加权的,以及有符号的或无符号的。
  • 大规模的图表:真实的图形大都有数百万或数十亿个的节点和边。因此,如何设计可伸缩的模型,最好是与图的大小有线性时间复杂度的模型,是一个关键问题。
  • 结合跨学科的知识:图形通常与其他学科有关,如生物学、化学和社会科学。这种跨学科的本质提供了机遇和挑战:领域知识可以用来解决特定的问题,但集成领域知识可能会使模型设计复杂化。

基于以下高级区别,在下表中总结了五个分类的一些主要特征:

图RNN通过在节点级或图级建模状态来捕获图的递归和顺序模式;GCNs对不规则图结构定义卷积和读出操作,以捕获常见的局部和全局结构模式;GAEs假设低秩图结构,并采用无监督的方法进行节点表示学习;图RL定义了基于图的动作和奖励,在约束下获得图任务的反馈;图对抗法采用对抗法训练技术,以提高基于图形模型的泛化能力,并通过对抗性攻击测试其鲁棒性。

2 Notations And Preliminaries

本文使用的一些表示符号:

对于深度学习模型,我们使用上标来表示层,例如。我们使用来表示第 l 层的维数(即,)。sigmoid激活函数定义为,校正线性单位(ReLU)定义为ReLU(x)=max(0,x)。一个一般的元素级非线性激活函数记为ρ(·)。在本文中,除非另有说明,假设所有函数都是可微的,允许通过反向传播使用常用的优化器如Adam和dropout等训练技术来学习模型参数Θ。如果采用抽样技术,我们将样本量表示为s。

学习图形上的深度模型的任务可以大致分为两类:

1、以节点为中心的任务:这些任务与图中的单个节点相关联。例如:节点分类、链接预测和节点推荐。

2、以图为中心的任务:这些任务与整个图相关联。例如:图的分类、估计各种图的属性和生成图。

3 Graph Recurrent Neural Networks

图RNN大致可以分为两类:节点级RNN和图级RNN。主要的区别在于,这些模式是位于节点级,并由节点状态建模,还是在图级,并由一个公共的图状态建模。

3.1 Node-level RNNs

图的节点级RNN,也被称为图神经网络(GNNs)。GNN的思想:为了对图的结构信息进行编码,每个节点 都用一个低维的状态向量 表示。在递归神经网络的激励下,采用了状态的递归定义:,其中F(·)是一个需要学习的参数函数。在获得 后,应用另一个函数O(·)得到最终的输出:

为了学习模型参数,采用以下半监督方法:迭代求解等式使用雅可比方法到一个稳定点,使用Almeida-Pineda算法,执行一个梯度下降步骤,以最小化特定任务的目标函数,然后,重复这个过程,直到收敛。然而GNN有几个缺点:确保等式 有一个唯一的解决方案,F(·)必须是一个“收缩图”,即 ,使得 成立。直观地说,“收缩图”要求任意两点之间的距离只有在F(·)操作后才能“收缩”,限制了建模能力。其次,需要多次迭代才能在梯度下降步长之间达到稳定状态,计算成本昂贵。

对GNN的一个显著改进是门控图序列神经网络(GGS-NNs),进行了以下修改:替换了等式   中的递归定义与GRU,消除了“收缩图”的需求,并支持现代优化技术,即优化为。其中z由更新门计算,为更新的候选时间,t为伪时间。

SSE采用了与等式类似的方法 。然而,SSE并没有使用GRU进行计算,而是采用了随机定点梯度下降法来加速训练过程。该方案基本上在使用局部邻域计算稳态节点状态和优化模型参数之间交替进行,两种计算都采用随机小批量计算。

3.2 Graph-level RNNs

在图级rnn中,不是对每个节点应用一个RNN来学习节点的状态,而是对整个图应用单个RNN来对图的状态进行编码。

You et al.提出将图RNN应用于图形生成问题,采用两个RNN:一个生成新的节点,另一个以自回归的方式为新添加的节点生成边。这种分层的RNN架构比传统的基于规则的图生成模型更有效地从输入图中学习,同时具有合理的时间复杂度。

为了获取动态图的时间信息,提出了动态图神经网络(DGNN),使用一个时间感知的LSTM来学习节点表示。当建立一条新边时,DGNN使用LSTM更新两个相互作用节点及其近邻节点的表示,即考虑一步传播效应。结果表明,具有时间感知能力的LSTM可以很好地建模边缘形成的建立顺序和时间间隔,从而有利于一系列图的应用。

图RNN也可以与其他架构相结合,如GCNs或GAEs。例如,为了解决图的稀疏性问题,RMGCNN对GCNs的结果应用了一个LSTM,以逐步重建一个图,如下图。通过使用LSTM,来自图的不同部分的信息可以在长范围内扩散,而不需要尽可能多的GCN层。动态GCN应用LSTM从动态网络中收集不同时间切片的GCNs结果,同时获取空间和时间图信息。

4 Graph Convolutional Networks

4.1 Convolution Operations

图卷积可以分为两类:谱卷积:通过利用图傅里叶变换或其扩展将节点表示转换为谱域来进行卷积;空间卷积:通过考虑节点邻域来进行卷积。这两组可以重叠,例如,当使用多项式谱核时。

4.1.1 Spectral Methods

用于图像或文本的标准卷积操作不能直接应用于图形,因为图形缺乏网格结构。Bruna等人首先利用图拉普拉斯矩阵 L 引入了来自谱域的图数据的卷积,它在信号处理中起着与傅里叶基类似的作用。图卷积运算∗G的定义如下:,其中是定义在节点上的两个信号,Q是 L 的特征向量。表示将图信号 变换为谱域,即图的傅里叶变换,再在左侧乘Q是进行逆变换,变换回去。这一定义的有效性是基于卷积定理,即卷积运算的傅里叶变换是它们的傅里叶变换的元素级乘积。一个信号u 经卷积得,其中为输出信号,Θ=Θ(Λ)为可学习滤波器的对角矩阵,Λ为L的特征值。通过对不同的输入输出信号对应用不同的滤波器来定义卷积层如下:。此等式的思想将输入信号通过一组可学习的滤波器来聚合信息,然后进行一些非线性变换,利用节点特征作为输入层,堆叠多个卷积层,总体架构与CNN相似。

此方法存在一些问题

1、参数学习为O(N),在实践中不可行。

2、谱域内的滤波器可能不局限于空间域,即每个节点可能受到所有其他节点的影响,而不仅仅是一个小区域内的节点。

为缓解这些问题使用平滑滤波器,其中  是一个固定的插值核,是可学习的插值系数。但仍存在问题:首先,每次计算过程中都需要拉普拉斯矩阵的完整特征向量,所以每个正向和向后传递的时间复杂度至少为,计算特征分解需的复杂度,不能扩展到大规模图。其次,滤波器依赖于图的特征基Q,所以这些参数不能在多个具有不同大小和结构的图中共享

4.1.2 The Effificiency Aspect

为解决效率问题,ChebNet提出使用一个多项式滤波器:,其中 为待学习的参数。因多项式计算的复杂度比较高,故采用切比雪夫扩展:,其中 为缩放后的特征值,为最大特征值,为K阶切比雪夫多项式。利用拉普拉斯矩阵的一个多项式作为其特征值的一个多项式的操作,即,则卷积操作为:,其中。使用切比雪夫多项式的递归计算:也可由递归计算得  ,其中

这样的多项式滤波器是严格的k定域的:经过一次卷积后,节点  的表示将只受到其k步邻域的影响。通过仅使用一阶邻居进一步简化过滤得,用矩阵形式表示为,其中(添加自环,保留自身特征)。通过设置K=1与一些小的变化可得等式 是  得一个特例,且堆叠足够数量的层具有类似于ChebNet的建模能力,但可以得到更好的结果。如下图:

当谱的卷积函数是多项式或一阶时,谱图的卷积等价于一个空间卷积。此外,在等式  中的卷积与等式 中GNN中的状态定义高度相似,除了卷积定义被替换为递归定义。由此GNN可以视为GCN与大量相同的层达到稳定状态,即GNN使用固定函数与固定参数迭代更新节点隐藏状态,直到达到平衡,而GCN预设的层和每一层包含不同的参数。

除此,CayleyNet采用Cayley多项式来定义图的卷积:,进一步提出了图小波神经网络(GWNN),通过重写等式  的图小波变换来代替光谱滤波器中的傅里叶变换如下 :,其中,ψ表示图的小波基。通过使用快速逼近算法计算ψ和ψ−1,GWNN的计算复杂度也是O(KM),即与边数呈线性关系。

4.1.3 The Aspect of Multiple Graphs

神经FPs提出了一种空间方法,同时也使用了一阶邻居:,由于参数Θ可以在不同的图之间共享,并且独立于图的大小,因此神经FPs可以处理多个任意大小的图。和等式  非常相似 。而神经FPs没有添加一个归一化项来考虑节点程度的影响,而是提出对不同程度的节点学习不同的参数Θ。这种策略对于小图表现良好,但可能不能扩展到更大的图。

.............

综上所述,卷积操作已经从谱域演化到空间域,并从多步邻居演化到近邻。目前,从近邻那里收集信息,并遵循方等式的框架。

4.2 Readout Operations

利用图卷积运算,可以学习到有用的节点特征来解决许多以节点为中心的任务。然而,为了处理以图为中心的任务,需要聚合节点信息以形成图级表示。文献中这种过程通常被称为读出操作。标准CNN基于一个规则的局部邻域,进行多步卷积或池化,以逐步降低分辨率。由于图缺乏网格结构,这些现有的方法不能直接使用。

顺序不变性。图读出操作的一个关键要求是,操作应该对节点顺序不变,也就是说,如果我们在两个节点集之间使用双射函数改变节点和边的索引,整个图的表示不应该改变。

4.2.1 Statistics

最基本的顺序不变操作涉及简单的统计数据,如求和、平均或最大池化:

或 或 ,其中是图G的表示,是最后一层L中节点的表示。然而,这种具有代表性的一阶矩统计量可能不足以区分不同的图。Kearnes等人使用模糊直方图来考虑节点表示的分布。模糊直方图的基本思想是构造几个“直方图箱子”,然后计算对这些箱子的隶属关系,即通过将节点表示视为样本并将其与相同的预定义模板匹配,最后返回最终直方图的串联。通过这种方法,可以区分具有相同和/平均/最大值但分布不同的节点。另一种常用的聚合节点表示的方法是添加一个完全连接的(FC)层作为最终的层,即:,其中为最终节点表示的连接,为参数,为输出的维数。可以看作是节点级特征的加权和。其中一个优点是,该模型可以为不同的节点学习不同的权值。然而,这种能力是以无法保证顺序不变性为代价的。

4.2.2 Hierarchical Clustering

不是节点和图级结构之间的二分法,图显示丰富的层次结构,可以通过层次聚类方法来探索。如图

然而,这些分层聚类方法都独立于图的卷积(即可以作为一个预处理步骤来执行,而不以端到端方式进行训练)。为了解决这一问题,DiffPool提出了一种与图卷积联合训练的可微层次聚类算法。具体来说,作者提出使用隐藏表示在每一层学习软聚类分配矩阵如下:,其中是簇分配矩阵,是第  层中的簇数,F(·)是一个需要学习的函数。通过根据 取平均值,可以得到该“粗化”图的节点表示和新的邻接矩阵如下:是通过将图卷积层应用于得到的,即在卷积操作后将节点粗化到节点。初始节点数为,最后一层为,即表示整个图的单个节点。由于聚类分配操作较软,因此聚类之间的连接并不稀疏。因此,该方法的时间复杂度原则上为

4.3 Improvements and Discussions

许多技术被引入来进一步改进GCN。

4.3.1 Attention Mechanism

在上述GCN中,节点邻域以相等或预定义的权值聚合。然而,邻居的影响可能有很大差异。因此,他们应该在训练中学习,而不是预先确定。受注意机制的启发,图注意网络(GAT)通过修改等式中的卷积操作,将注意机制引入到GCNs中如下:,其中是第 层节点对节点的注意力:,其中,F(·,·)是另一个待学习的函数,如多层感知器(MLP)。提高模型的容量和稳定性,可使用多个独立的注意机制,并将结果连接起来,如图示:多头注意机制

4.3.2 Residual and Jumping Connections

许多研究发现,对现有的GCN来说,最合适的深度往往是非常有限的(如2层或3层)。这个问题可能是由于训练深度GCN所涉及的实际困难或过平滑问题,即更深层次的所有节点都有相同的表示。为解决这个问题,可将类似于ResNet的剩余连接添加到总连接网络中。Kipf和Welling在等式中添加剩余连接如下:,添加这种残余连接可使网络深度增加,与ResNet的结果相似。

受个性化PageRank的启发,PPNP定义了可传送到初始层的图卷积:,其中和 α 是一个超参数,所有的参数都在(·)中,而不是在图的卷积中。跳跃知识网络(JK-Nets)提出了另一种架构,将网络的最后一层连接起来所有较低的隐藏层,即通过“跳转”所有表示到最终输出。

通过这种方式,该模型可以学习有选择性地利用来自不同层次的信息。在形式上,JK-Nets的制定如下:是节点 的最终表示,AGGREGATE(·)是聚合函数,L是隐藏层数。JK-Nets使用了三个类似于GraphSAGE的聚合函数:连接、最大池化和LSTM注意。实验结果表明,添加跳转连接可以提高多个GCN的性能。

4.3.3 Sampling Methods

提出两种类型的抽样方法:邻域抽样分层抽样

在邻域采样中,计算过程中对每个节点进行采样。GraphSAGE在训练过程中对每个节点均匀采样固定数量的邻居。PinSage提出了使用在图上的随机游动对邻居进行采样,并进行了一些实现改进。FastGCN采用了不同的策略,不是节点的邻居进行采样,而是通过将节点解释为i.i.d,对每个卷积层的节点进行采样(即层采样)和图的卷积作为概率测度下的积分变换。且通过归一化程度的采样节点可以减少方差,导致更好的性能。

5 Graph Autoencoders

自编码器(AE)及其变体已广泛应用于无监督学习任务中,适用于图的节点学习表示。

5.1 Autoencoders

利用稀疏自编码器(SAE)生成图。其基本思想是,通过将邻接矩阵或其变化作为节点的原始特征,可以利用AEs作为一种降维技术来学习低维节点表示。具体来说,SAE采用了以下L2-重建损失:

 、,其中P为转移矩阵, 为重构矩阵, 为节点 的低维表示,F(·)为编码器,(·) 为解码器,d<<N为维数,Θ为参数。编码器和解码器都是一个具有许多隐藏层的MLP。换句话说,SAE将P(i,:) 的信息压缩为一个低维向量,然后从该向量重建原始特征。另外,还增加了另一个稀疏性正则化术语。在获得低维表示后,应用k-means进行节点聚类任务。实验证明,SAEs优于非深度学习基线。

由于网络嵌入方法表明一阶接近性也是重要的,结构深度网络嵌入(SDNE)通过添加另一个拉普拉斯矩阵来修改目标函数的特征映射项:,也就是说,如果两个节点是直接连接,那么也共享相似的潜在表示。利用邻接矩阵对L2-重构损失进行修正,并对零元素和非零元素分配了不同的权值:,其中,如果A(i,j)=0则;否则,β是另一个超参数。SDNE的整体体系结构如下图:

构造输入矩阵的时间复杂度为,不能扩展到大规模的图中。GC-MC采用了一种不同的方法,使用Kipf和Welling提出的GCN作为编码器:,并使用一个简单的双线性函数作为解码器:,其中 为解码器参数。

5.2 Variational Autoencoders

与上述的自动编码器不同,变分自动编码器(VAEs)是另一种将降维与生成模型相结合的深度学习方法。它的潜在好处包括容忍噪声和学习平滑表示。变分图自编码器(VGAE)首先引入了的图形数据,其中解码器是一个简单的线性积:。对于均值和方差矩阵的编码器,作者还采用了Kipf和Welling提出的GCN:。然后,通过最小化变分下界:来学习模型参数。然而,由于这种方法需要重建完整的图,它的时间复杂度是

6 Graph Reinforcement Learning

深度学习的一个方面尚未被讨论过,那就是强化学习(RL),它已经被证明在人工智能任务中是有效的,如玩游戏。众所周知,RL擅长从反馈中学习,特别是在处理不可区分的目标和约束时。GCPN利用RL生成目标导向的分子图,同时考虑非微分目标和约束。具体来说,图的生成被建模为添加节点和边的马尔可夫决策过程,生成模型被视为在图生成环境中运行的RL代理。通过将代理行为视为链接预测,使用特定领域和对抗性奖励,并使用GCNs来学习节点表示,可以使用策略梯度以端到端方式训练GCPN。

同时进行的工作,MolGAN采用了类似的想法,即使用RL来生成分子图。然而,MolGAN并不是通过一系列的动作来生成图,而是提出直接生成完整的图,这种方法对小分子特别有效。

GAM利用随机游动应用RL进行图分类。将随机游动的生成建模为一个部分可观察的马尔可夫决策过程(POMDP)。代理执行了两个动作:首先预测了图的标签然后选择随机游走中的下一个节点。奖励仅仅由代理是否正确分类图表决定,即,其中代表正确的预测;否则。T是总时间步长,是环境。

7 Graph Adversarial Methods

7.1 Adversarial Training

GAN背后的基本思想是建立两个链接的模型:一个鉴别器和一个生成器生成器的目标是通过生成假数据来“欺骗”鉴别器,而鉴别器的目的是区分一个样本是来自真实数据还是由生成器生成的。随后,两个模型通过使用极大极小博弈的联合训练而相互受益。

GraphGAN提出使用一个增强图嵌入方法与以下目标函数:

其中,分别是鉴别器和生成器中节点v的低维嵌入向量。结合上述方程,鉴别器实际上有两个目标:原始图中的节点对应该具有较大的相似性,而生成器生成的节点对应该具有较小的相似性。这种架构类似于LINE等网络嵌入方法,只是负节点对是由生成器G(·)生成的,而不是由随机抽样生成的。结果表明,该方法提高了节点嵌入向量的推理能力。

GraphSGAN使用了一个GAN来增强图上的半监督学习。具体来说,应该在子图之间的密度间隙中产生假节点,以削弱现有模型在不同簇之间的传播效应。为了实现这一目标,设计一个新的优化目标,具有详细的损失项,以确保发电机在平衡时的密度间隙中产生样本。NetGAN采用了一个GAN用于图形生成任务。具体来说,将图的生成视为学习有偏随机游动分布的任务,并采用GAN框架,使用LSTM来生成和区分随机游动。实验表明,使用随机游走也可以学习全局网络模式。图的对抗性方法的主要特征如下表:

8 Summary

以上调查表明,图形深度学习是一个有前途的和快速发展的研究领域,既提供了令人兴奋的机会,也提出了许多挑战。研究图形上的深度学习是关系数据建模的关键基石,它是迈向未来更好的机器学习和人工智能技术的重要一步。

8.1 Future Directions

  • 为未被研究的图结构建立了新的模型
  • 现有模型的组合性
  • 动态图
  • 可解释性和鲁棒性

Deep Learning on Graphs: A Survey相关推荐

  1. Deep Learning on Graphs: A Survey论文笔记

    Deep Learning on Graphs: A Survey 问题 术语表示 词汇说明 摘要信息 文章框架 主要内容 读出操作 什么是读出操作(readout operation) 读出操作要求 ...

  2. A Gentle Introduction to Deep Learning for Graphs 图深度学习的温和介绍

    文章目录 1.简介 2. 高级概述 2.1.数学符号 2.2.动机 2.3.大图 2.4.局部关系和信息的迭代处理 2.5.语境扩散的三种机制 3.构建块 3.1.邻域(邻居)聚集 3.2.池化 3. ...

  3. 人工智能书单|Deep Learning on Graphs

    " 近些年来,图深度学习,尤其是图神经网络算法展现了极强的学习图的表示的能力,并且促进了许多图上的计算任务的发展. " 01 推荐阅读 今天给大家推荐密西根州立大学的汤继良团队即将 ...

  4. 深度学习编译器综述The Deep Learning Compiler

    深度学习编译器综述The Deep Learning Compiler The Deep Learning Compiler: A Comprehensive Survey 参考文献: https:/ ...

  5. Geometric deep learning: going beyond Euclidean data译文

    Geometric deep learning: going beyond Euclidean data(几何深度学习:超越欧几里得数据) 摘要: 许多科学领域研究具有非欧几里德空间的底层结构的数据. ...

  6. Biological network analysis with deep learning(使用深度学习的生物网络分析)

    Biological network analysis with deep learning(使用深度学习的生物网络分析)很少有关于生物网络的综述类论文,这是今年发在 Briefings in Bio ...

  7. 【点云系列】综述: Deep Learning for 3D Point Clouds: A Survey

    文章目录 起因 题目 摘要 1 简介 2 背景 2.1 数据集 2.2 衡量指标 3 3D形状分类 3.1基于多视角的方法 3.2基于体素的方法 3.3 基于点的方法 3.3.1逐点MLP网络 3.3 ...

  8. Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)

    Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查(IEEE TPAMI 2020) 摘要 1. 引言 2. 背景 2.1 数据集 ...

  9. 【Paper】Deep Learning for Anomaly Detection:A survey

    论文原文:PDF 论文年份:2019 论文被引:253(2020/10/05) 922(2022/03/26) 文章目录 ABSTRACT 1 Introduction 2 What are anom ...

最新文章

  1. 浅谈进程同步和互斥的概念
  2. 06 Java程序员面试宝典视频课程之Javascript
  3. mysql 导入一个数据库_mysql导入一个数据库
  4. 软件需求工程与UML建模——第九组原型系统总结
  5. php+html 实现加减乘除
  6. ##(两个井号)和#(一个井号)都是什么意思C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 .
  7. C实战:项目构建Make,Automake,CMake
  8. Dinic算法----最大流常用算法之一
  9. [CareerCup] 8.7 Chat Server 聊天服务器
  10. 力扣题目算法分类【持续更新】
  11. 隐藏播放器html代码大全,播放器代码大全
  12. 在MFC中使用MSXML库 (一)MSXML库的导入
  13. java调用百度地图的不同显示方式
  14. chrome 设置保护眼睛颜色
  15. 腾讯云从业者认证考试(学习笔记知识总结-全部章节)
  16. 旗下企业永远不会超过七家 马云
  17. 计算机打印机能不能取消正在,删除HP打印机驱动程序. 打印机驱动程序正在使用中,无法删除...
  18. 基于CNN和VLAD的人体行为识别研究
  19. ABAP 调用webservice 错误
  20. 用Python的Pandas和Matplotlib绘制股票KDJ指标线

热门文章

  1. 【POJ 1788 --- Building a New Depot】
  2. 通俗理解LDA主题模型(转载自 v_JULY_v 大佬)
  3. [从头读历史] 第289节 神之物语 忒修斯的故事
  4. echarts从全国地图切换成省级地图地图不居中的问题
  5. Leetcode 1921. 消灭怪物的最大数量-排序+贪心
  6. oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...
  7. c语言十进制转ieee754代码,C#IEEE754到十进制(C# IEEE754 to decimal)
  8. Web入门学习笔记1——建立第一个网站
  9. 【VC++游戏开发#六】2D篇 —— 粒子系统(一):浪漫唯美的场景之雪花飞舞
  10. 具备对接云平台的4G车牌识别摄像机硬件模组方案