深入理解CVPR 2019论文 Linkage Based Face Clustering via Graph Convolution Network基于图卷积的人脸聚类

论文的翻译可以参考这篇博客
CVPR 2019 Linkage Based Face Clustering via Graph Convolution Network论文翻译
接下来是我的一些拙见。

1.解决的问题

该工作要解决的问题是人脸特征分布复杂情况下的人脸聚类任务。受遮挡、光照等因素的影响,人脸特征的分布复杂,会面临两个难题:1)预先假设数据分布的方法不再适用,例如K-Means聚类方法(需要输入类的数量);2)而不需假设数据分布的方法在有着较高的计算复杂度,在大规模聚类问题上不适用。

2.解决方案

本文提出将聚类问题当做连接预测问题,预测一个节点是否应当与它的k个近邻(kNN)连接,因此不需预设类的数量。由于需要计算节点的kNN,因此计算复杂度为O(nlogn),是可分级控制的且可以应用在大规模的聚类问题上。

连接预测流程为:1)为人脸图片提取特征;2)通过knn搜索找到每个节点的前k个近邻(kNN);3)为每个节点建图,并传入GCN得到与其kNN连接的可能性;4)进一步筛选得到最终的聚类结果。

以下为具体的pipeline(以15张人脸图像为例)。

在这里插入图片描述
设每个节点的1跳邻居个数k1=2,2跳邻居的个数k2=2,建图时节点的连接数u=3。

① 利用cnn对数据集中的人脸图片提取特征;

② 通过暴力搜索或kd树搜索找到每个节点i的2个1跳邻居并存储在列表knn_graph中,之后在knn_graph中找到1跳邻居的1跳邻居,也就是节点i的2跳邻居。 最终获得建图所需的全部节点。
举个栗子。在这里插入图片描述假设上图是全部的15张人脸,并且我们已经通过搜索算法(暴力搜索或kd树)得出了他们之间的距离和相对位置。现在要将每个节点k1(=2)个1跳邻居和2跳邻居求出来。从图中可以看到节点1的最近邻是2、4,因此2、4就是节点1的1跳邻居,同理节点2的1跳邻居是12、9。因此列表knn_graph是这样的

中心节点 1跳邻居
1 2,4
2 12,9
3 10,14
4 10,5
5 4,11
6 12,2
7 3,15
8 10,15
9 2,12
10 8,4
11 5,13
12 2,6
13 3,14
14 3,13
15 3,7

现在还需要得到每个节点的2跳邻居,其实这是根据1跳邻居得到的,比如节点1,它的1跳邻居为2、4,而2的1跳邻居为12、9,4的1跳邻居为5、10,因此节点1的2跳邻居为12、9、5、10,至此,我们也就获得了以节点1为中心节点建图所需的全部节点。如图所示
在这里插入图片描述

③ 为每一个节点建立一张图。以第一张图为例,中心节点为1,它的1跳及2跳邻居为Vp:1、2、4、12、9、10、5。对于Vp中的每一个节点v,找到v的前3个近邻,若近邻中的节点r也在Vp中,则连接(v, r)。最终建立的图为在这里插入图片描述

④ 将所有的图传入GCN。GCN的表达式为

Y = σ ( [ X G X ] W ) Y=\sigma ([X||GX]W)

其中 X X 为图的特征矩阵,且 X R N × d i n X \in \R^{N\times d_{in}} Y R N × d o u t Y \in \R^{N\times d_{out}} d i n d_{in} d o u t d_{out} 是输入/输出节点矩阵的维度。 G = Λ 1 / 2 A Λ 1 / 2 G=\Lambda^{-1/2}A\Lambda^{-1/2} 是聚合矩阵,A为邻接矩阵, Λ \Lambda 是对角矩阵且 Λ i i = j A i j \Lambda_{ii}=\sum_{j}A_{ij} 。运算符||表示沿特征维度拼接矩阵。W是图卷积网络的权重矩阵,大小为 2 d i n × d o u t 2d_{in}\times d_{out} ,最外层的是非线性激活函数。

本文的GCN有4个卷积层,第一层输入维度为512,输出维度为512。第二层输出维度为512,第三层与第四层输出维度都为256。卷积层之后是分类器,包括两个全连接层,其间激活函数为PReLU。最后通过softmax函数得到预测的边权。

⑤ GCN的输出为中心节点与其1跳邻居的边权,组合15张图的中心节点及其1跳邻居的边及边权。(2跳邻居只是为了获得邻接矩阵,不会有边权)
在这里插入图片描述

⑥ 根据边权进行聚类。使用可变阈值th以及最大合并数来防止聚类结果中某一类出现过大的聚类。阈值th初始为边权的最小值。聚类规则为:随着迭代次数增多,th增大,在每一次迭代中,确定连接权值大于阈值的边,如果该类的个数已超过max size,那么将该边待定,留到下一次迭代中再判断(下一次迭代中会有更大的th进行筛选)。

⑦ 连接着的节点为一类,最终得到聚类结果。

在这里插入图片描述