**
通过关联图学习聚类人脸(CVPR2019 Oral)
**
总览:
这篇文章目标是提出一个基于图卷积的人脸聚类算法,训练时是有监督的,测试时使用无标签图片聚类生成伪标签用于人脸识别算法的提升。整体框架和目标检测的two-stage类似,但仍然有所不同。步骤如下:
- 首先准备一个训练好的能够提取人脸特征的CNN网络用于提取每一张人脸图片的feature,然后根据这些feature之间的相似性(cosine距离)构建一张关联图。接下来是作者提到的三步
- 对关联图生成cluster proposal,具体是先去除不满足相似性阀值的边,然后提取去除边之后的连通分量,注意每一个关联图的大小有限制,这就意味着即使有的图非常相似,仍然会被分成两个子图或者更多,我们在这一步得到了大量的cluster proposal。
- 对cluster proposal进行IoP和IoU的计算,也就是所提出来的每一个cluster proposal都要进行,IoP和IoU能够直接通过grouth-truth和cluster proposal计算得到,这个当做是监督信息训练GCN-D,GCN-D的目的仅仅是为了给cluster proposal打分,相当于生成监督信息,而且有多尺度的监督信息,不光是一开始的proposal,proposal之后会当成是一个高维的点(经过了池化),同样计算IoP和IoU,反复多次,其实这个考量就是说要考虑到融合两个proposal的情况,与two-stage类似。但融合并不会在GCN-D中发生。预测时我们就能正确的得到分数。
- 使用GCN-S去除离群点,训练时把和随机选的点label同一类的点当成正样本,训练网络找出负样本的能力,也就是去除离群点的能力(仅仅输入IOP分数在0.3-0.7之间的proposal),预测的时候仅仅保留正样本数目大于50%的proposal,也就是IoP>0.5,相当于把比较正确的样本拿来使用,并不是所有的都用。
- 以上聚类完毕,但在此之后,作者使用了IoU分数去除了重用点。总而言之他通过有标签的人脸信息训练了一个可以聚类人脸的神经网络,能够给大量的无标签人脸数据聚类,最后能够用于人脸识别。
详细介绍如下
摘要
人脸识别近来达到了一个新的高度,但要继续提升,需要难以想象的数据量,也就是更多的投入。因此,可以考虑使用无标签数据。当前的工作显示聚类无标签数据是一个可靠的方法。
但如何有效聚类,仍然未有定论,主要的挑战在于聚类样式十分复杂。本文提出一个方法,提出如何学习聚类而不是通过人工定义的标准聚类。我们提出了一个基于图卷积的方法,结合发现和分割模型去聚类人脸。实验表明我们的方法有部分成效。
1.背景介绍
人脸识别算法成功应用,但要很多数据训练,收集数据容易,标注却费时费力。因此考虑使用无标签数据(但这篇文章的模型是通过有监督train的,只是能进一步使用无标签数据提升)
一个直观的方法是把无标签数据聚类生成伪标签(pseudo classes)。由此他们就能直接丢入到一个有监督的模型中。【30】说明这种想法是有效的。之前的想法一般直接去无监督学习中去套用,如K-means聚类,spectral clustering(光谱聚类),hierarchical clustering [多层级聚类], and approximate rank-order【近似等级排序】,K-means有一个初始假设是有一个聚类中心存在,但实际这个假设可能是错误的(如流形的分布),spectral clustering则要求类别分布平衡。结果就导致他们难以应用到复杂的聚类簇结构中,并倾向于生成有很多噪声的簇。
我们认识到,依赖于简单地假设并没有用,于是我们直接使用GCN来学习人脸聚类。然后使用他们分割无标签数据。
该方法与Mask R-CNN类似用于实例分割:例如,先生成候选框,然后定义积极的候选,用mash提炼,这些步骤由反复的迭代生成,基于超级顶点(类似于超级像素),图发现网络,图分割网络。其主要的突破点在于我们用的方式适用于处理关联图,依赖于结构模式学习基于图卷积网络其能处理复杂的结构。
该方法不光实现无监督聚类的提升,其用于处理Megaface的时候也提升了人脸识别效果,几乎达到了有监督学习的效果。
主要的贡献点在于:
- 在有监督学习中提出了一个从上到下的人脸聚类
- 第一次把聚类看作是一个基于图卷积的发现和分割的pipeline问题。
- 实现了SOTA的人脸聚类,应用发现的类时人脸识别几乎和有监督的效果一样好
2.相关工作
人脸聚类:
聚类问题来自机器学习,而人脸聚类仍然处于婴儿时期。
早期的工作使用手工的特征和传统的聚类算法。如【11】使用梯度和像素强度作为特征。【12】使用LBP特征,他们都使用spectral clustering。现在都使用学习到的特征,【13】再无监督时使用自顶向下的聚类。【5】提出一个基于SVM有监督的自底向上的方法。【1】使用利用CNN提取的深度特征,并提出一个接近于排序的矩阵把图片连接到簇。【18】基于线性SVM(通过最近邻数据样本)设计了一个类似的方法。【23】提出有条件成对聚类,明确阐述聚类可作为一个有条件随机森林通过相似性匹配处理聚类。【17】提出开拓深度特征的本地结构通过最小覆盖邻居提高相似性测量。【30】通过一个MLP分类器合计信息发现更鲁棒的联系,通过连接的comp获得簇。
通过深度feature,这些工作集中于设计相似性矩阵,仍然基于无监督的方式聚类,而我们的方法通过有监督的方式自顶向下学习聚类,通过detection和segmentation。
图卷积神经网络
GCN把CNN应用到图中,现在很多工作都展现了它的能力,【15】把图卷积放入半监督学习,【9】把图卷积应用在特征重构中,【26】展现GCN在连接预测中表现较好,【29】将它应用到了人的动作检测中。
在这篇文章中,我们把GCN用做基本的模块在关联图中提取基本的聚类模式。这是第一次把GCN应用到有监督聚类中。
3.方法
大尺度人脸聚类中,复杂的分布是主要的难题,我们把它处理为一个联系发现和分割的问题。
给定一个数据集,先用一个训练好的CNN提取人脸特征,得到一个特征的集合D ,f是d维度的特征,为了构成一个图,我们把每一个样本看成是一个点。使用cosine距离找到每个点K个最近的邻居,我们就获得了一个关联图G = (V; E),关系图G可以被一个关系矩阵A所表示。aij表示为fi和fj的cosine距离,也就是这两个定点间的连边。若为零则二者不相连。顶点上百万,我们期望:
- 不同的簇有不同label
- 同一个簇有相同label
3.1:方法总览
框架分为三个模块,(1)生成,(2)GCN-D,(3)GCN-S,生成簇的原型,sub-graphs像是簇,然后是两个GCN模块,符合two-stage框架,GCN-D定义高质量的候选框,GCN-S精炼候选框去除噪声。把簇的proposal输入,GCN-D定义proposal是否是需要的proposal,也就是说这是一个簇的发现,定义一个proposal是好的proposal,然后GCN-S对其进行精炼分割,也就是说,给与一个簇,它评估每一个顶点是噪声的概率,砍掉离群点来更改簇。(有几个点不属于任何一个簇,会被舍去)
3.2 簇的proposal
比起直接处理图,我们选择先生成簇的proposal,受到目标识别生成region proposal的启发(本质上是减少计算损失),我们用同样的方式产生,Pi是关联图G的一个子图,所有的proposal构成了一个集合P={Pi}Np_i=1,生成基于super-vertices,所有的super-vertices构成了集合S={Si}Ns_i=1,这一届首先介绍super-vertex的产生,然后介绍如何产生cluster proposal。
super-vertex:
super-vertex是一个子图包含一小部分顶点,他们彼此相似,于是想到使用连通分量对它进行替代,然而直接从G中导出联通分量仍然太大。为了维护和其他super-vertice的高连接性,我们移除了低于某一阀值的连接边,强制顶点数小于某一个值。如算法一所示,1M的顶点约有50k个超级顶点,相当于一个super-vertex有20个顶点。
算法1:生成super-vertex
输入:关联图A,边阀值eT,最大顶点数 Smax,et增加阀值△
输出:super-vertex集合S
算法1就是说,A是原来的关联图,一开始S为空,R用来储存A去除联通子图后的图,发现联通子图时,每一步先从A中去除边权低于边权阀值eT的边,然后得到因为去边所生成的联通子图,从子图中寻找节点数小于低于Smax的图,这些图就是要找的super-vertex,然后逐步提高阀值(△),直到R为空,搜索完毕。其实就是把图分割成连通子图。
Proposal generation:
对比于需要的簇,super-vertex仍然过于保守,虽然一个super-vertex很可能属于同一个人,但同一个人的样本可能会分别属于不同的super-vertex,受到目标检测中的multi-scale proposals所启发。我们在super-vertices上构建了一个更高级的graph,super-vertices的中心是作为vertice,vertice之间的联系作为边(求均值),对高层的图,我们再一次用了算法1获得了更大尺度的proposal。迭代使用多次后,我们得到了一个多尺度的proposal(如算法二所示),那么他的ground-turth是什么,如果是多尺度的话。
3.3 簇的发现。
我们使用了GCN-D,去选择高质量的簇,其质量由以下的矩阵定义。IoU和IoP。
P由所有标签为l§的顶点所构成的集合,l§是簇P的主label,也就是在P中出现的最多的label,换句话说,IoU(P)体现了P和P的相似度,IoP体现了纯净度,就是P中真实样本的点的比例。
GCN-D的架构
我们先假定高质量的簇在点之间有着极高且正确的结构信息,给与一个proposal Pi,GCN把相应定点的可见特征(F0(Pi))以及相应的关联矩阵(A(Pi))作为输入,并且预测相应的IoP和IoU,第L层的特征计算如下所示:
这是一个标准的图卷积层,D是一个斜对角矩阵,就是A和Pi的乘积之和,为一个斜对角矩阵,F_l(Pi)是第l层的特征,W是参数用以学习特征,σ是**层。也就是说,通过转换特征放到**层中,和CNN类似。在最高层我们加入了一个最大池化层,获得全局特征。同时我们还使用了两个的全连接网络分别预测回归IoU和IoP的值。
训练和预测
给予一个有标签的训练集,通过公式1多每一个proposal计算获得IoU和IoP,然后训练GCN-D,对ground-truth和预测值最小化MSE距离,。期待GCN能直接预知分数,不用处理,也就是说,我们直接使用GCN-D预言每一个proposal的IOU和IOP,IOU用于维持proposal(去除重叠),在3.5中,IOP用于决定是否要精练proposal(去除离群点)。
3.4簇的分割:
高层的proposal的定义并不纯净,其仍然包含离群点。我们提出了一个簇的分割模型,驱逐离群点。
GCN-S的设计:
和GCN-D类似,但并不是预测cluster的分数,而是输出在P中的每一个点在这个簇中的真实性,就是判断这个点是不是真的属于这个簇,输出可能性。
定义离群点:
为了训练GCN-S,我们需要准备ground-truth,定义离群点,正常的方法是把所有标签不一样的都设置为离群点。当如果有一个簇中所有的点基本上是对半的label,就不太奏效。为了防止手动调参的定义离群点。鼓励模型学习不同的分割模式,只要分割结果得到的点基本上是属于同一个类就是正样本,无论它是主要的label或者是其他,特别的我们随机选择一个顶点当做seed,对每一个点的特征加上一个值,选中的为1,其他为0,把和seed标签一致的点当做正样本,其他的是离群点。应用多次,随机选择seed,对每一个P我们就获得了多个训练样本。
训练和推理:
如上所示,对仍然存在的proposal,我们准备了一系列的训练样本,每一个都有相应的特征向量集合。每一个特征向量来自于一个一个vertex,一个关联矩阵,和一个二元项链指示顶点是正样本还是负样本。然后我们训练GCN-S模型,对顶点使用交叉熵损失作为损失函数,在推理阶段,我们同样提出多个假设生成proposal,保持预测结果有最积极的结果。这是为了防止选了一个正样本点比较少的点作为seed
我们只feed IoP为0.3到0.7的proposal给GCN-s,因为当proposal纯粹时,离群点基本上就是难样本,不应该被移除,如果非常不纯粹,那么很快就可能这不是一个类。也就不适合作为样本学习。我们通过GCN-s,移除了离群点。
3.5去重叠
对于cluster我们已经处理完了,但仍然有一些Cluster会重叠,也就是共享顶点,在人脸识别中会出现对抗的结果。于是,我们提出这个方法,我们首先按照IOU分数逆序排序得到rank,然后我们从rank中收集proposals,然后从上往下逐渐移除之前簇中拥有的顶点。如算法3所示:
对比与之前的NMS方法,我们的De-overlapping似乎更加有效。
4:实验
略
但仍然有部分细节没有弄懂,我的疑问:
- 为什么会有重叠点,如果直接按照算法1的话是不会有重叠的点,和目标检测并不一致,目标检测舍弃了部分的点,那么为什么会有3.5去重叠点。
- proposal是从哪里融合的,GCN-S为什么会有一个融合后的簇。