基于GCN的人脸聚类算法1——LGCN
Posted 渐渐的笔记本
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于GCN的人脸聚类算法1——LGCN相关的知识,希望对你有一定的参考价值。
这篇文章主要介绍基于GCN的有监督人脸聚类算法——L-GCN《Linkage Based Face Clustering via Graph Convolution Network》,github codes
L-GCN
L-GCN将人脸聚类转换成linkage prediction问题进行处理,即给定若干个节点及节点信息,判断哪些节点间存在连边。其中,每个节点表示一张人脸图像,节点特征即为该人脸图像的feature embedding。我们期望得到节点间存在连边的概率,然后基于这些概率,采取一定的处理手段,将整个图划分成一些连通分量,每个连通分量就是聚类结果的一个簇。L-GCN可以分成构造子图、GCN推理和link merging三个部分。
构造子图
假如有\\(N\\)个节点(人脸图像),理论上需要对\\(N\\times (N-1)/2\\)条边计算概率。由于我们有所有节点的特征,可以只计算某个节点(中心节点)和它的\\(KNN\\)的连边概率,从而减小计算量。那么,构造一个包含\\(1+K\\)个节点的子图,并利用GCN判断这\\(K\\)个点和中心点的连边概率就好了吗?这个方案还需改进,由于判断节点\\(a\\)和节点\\(b\\)是否存在连边时,\\(a\\)和\\(b\\)的context information(它们各自邻居节点的信息)能够提供丰富的信息,所以我们将\\(K\\)个邻居各自的邻居(2-hop nodes)也包含进来。目前,我们的子图包含以下三种类型的节点:1)中心点;2)1-hop nodes;3)2-hop nodes。
由于我们要判断的是1-hop点和中心点存在连边的概率,为了编码它们与中心点的关系,我们用每个节点的特征减去中心点特征来重新表示该节点的特征,并把中心点移除子图(归一化后的中心点特征为0)。这样,我们最终的子图只包含中心点的1-hop nodes和2-hop nodes。
确定了构成子图的节点及节点特征后,下一步需要确认添加哪些边。L-GCN的策略是:对子图的任意一点,计算它在所有\\(N\\)个节点的\\(\\mu NN\\),如果它的某个\\(\\mu NN\\)恰好也在子图中,那么将在这两个节点添加一条连边。
完整的构图过程可以参考论文中的图2进行理解。
GCN推理
构造好子图,我们可以得到以下数据:
- \\(X \\in R^{N*d}\\):对中心点归一化后的节点特征,这里的\\(N\\)表示子图中的节点个数,\\(d\\)表示人脸特征的维数;
- \\(A \\in R^{N*N}\\):子图的邻接矩阵(是实对称阵),如果节点\\(a\\)和节点\\(b\\)存在连边,则\\(A[a,b]=1\\),否则\\(A[a,b]=0\\)。(将\\(A[a,b]=1\\)改动为\\(A[a,b]= similarity\\)也是一种合理的改动)
GCN有很多GCN layer堆叠得到,每层GCN layer都会对各节点做特征变换,我们以第一层GCN layer为例,看看它是如何做特征变换的。根据论文公式,变换后的节点特征矩阵\\(Y \\in R^{N*d}\\)可以表示为:
\\(\\boldsymbol{Y}=\\sigma([\\boldsymbol{X} \\| \\boldsymbol{G} \\boldsymbol{X}] \\boldsymbol{W})\\)
其中\\(W\\)是GCN layer的可学习参数,\\(G=g(X,A) \\in R^{N*N}\\)是聚合矩阵,它的每行加起来为1,作用在\\(X\\)上就是对其它节点的特征做加权。常见的聚合函数\\(g\\)有以下一些,本文使用的是weighted aggregation。
- Mean Aggregation: \\(\\Lambda^{-\\frac{1}{2}} A \\Lambda^{-\\frac{1}{2}}\\),其中\\(\\Lambda\\)是对角矩阵,\\(\\boldsymbol{\\Lambda}_{i i}=\\sum_{j} \\boldsymbol{A}_{i j}\\)
- Weighted Aggregation:\\(A\\)中的非零值为对应两个节点的相似度,然后对\\(A\\)的每行做softmax得到\\(G\\)
- Attention Aggregation: \\(G\\)中的参数通过两层MLP学习得到
训练阶段,我们对每个节点进行分类(该节点和中心点存在连边or不存在连边),但在计算loss时只考虑1-hop nodes,即只对1-hop nodes的误差进行反向传播,因为我们最初的目标是判断1-hop nodes和中心点是否存在连边。同理,推理阶段也只关注1-hop nodes和中心点存在连边的概率。
GCN模型代码实现:
link merging
对一个包含\\(N\\)个节点的图,L-GCN会以每个节点为中心点构建一个子图,然后进行GCN推理。处理完所有子图后,可以在所有\\(N\\)个节点和它的1-hop nodes间建立一条连边(如果两个节点互为1-hop nodes,节点间可能存在两条无向边),边的权重为GCN的预测值(如果有两个,可以取最大值,也可以取均值)。
link merging是一个迭代进行的过程。每轮迭代都有一个截断阈值\\(t\\),权重小于该阈值的边会被擦除。这样一张连通的大图会划分成若干个连通分量,这里每个连通分量就形成了一个簇,过大的簇会进入下一轮迭代。迭代每往下进行一轮,阶段阈值\\(t\\)就会增大一些,重复执行这一过程,直到没有过大的簇或截断阈值已经非常大。
计算连通分量代码实现:
记录一下平时用得较少的几个操作
以上是关于基于GCN的人脸聚类算法1——LGCN的主要内容,如果未能解决你的问题,请参考以下文章