基于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进行理解。
image

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模型代码实现

对一个包含\(N\)个节点的图,L-GCN会以每个节点为中心点构建一个子图,然后进行GCN推理。处理完所有子图后,可以在所有\(N\)个节点和它的1-hop nodes间建立一条连边(如果两个节点互为1-hop nodes,节点间可能存在两条无向边),边的权重为GCN的预测值(如果有两个,可以取最大值,也可以取均值)。
link merging是一个迭代进行的过程。每轮迭代都有一个截断阈值\(t\),权重小于该阈值的边会被擦除。这样一张连通的大图会划分成若干个连通分量,这里每个连通分量就形成了一个簇,过大的簇会进入下一轮迭代。迭代每往下进行一轮,阶段阈值\(t\)就会增大一些,重复执行这一过程,直到没有过大的簇或截断阈值已经非常大。
计算连通分量代码实现
记录一下平时用得较少的几个操作
image
image
image

posted @ 2021-08-12 23:55  渐渐的笔记本  阅读(913)  评论(0编辑  收藏  举报