aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

人脸识别-人脸识别合集 | 6 FaceNet解析(谷歌 CVPR2015)

FaceNet是谷歌于CVPR2015.02发表,提出了一个对识别、验证、聚类等问题的统一解决框架,即它们都可以放到特征空间里做,需要专注解决的仅仅是如何将人脸更好的映射到特征空间,FaceNet: A Unified Embedding for Face Recognition and Clustering


主要思想

  • 提出了一个通用的人脸验证(这是同一个人吗)、人脸识别(这是谁)和人脸聚类(在这些面孔中找到同种人)系统,整个系统可以端到端学习。Triplet Loss直接反映了这些问题实现的目标,他们努力嵌入能够从图像x映射到特征空间R^d的f(x),以使两者的平方距离很大或很小。
  • 总体网络结构:基于GoogLeNet或Zeiler&Fergus模型,CNN+Triplet loss方法,直接学习从人脸图像到紧凑的欧几里德空间的映射,提取的嵌入特征可实现人脸识别、验证和聚类等任务,训练的损失函数直接针对实际误差,端到端训练更能提高精度。
  • 嵌入:128维特征,可使用网络训练直接优化嵌入本身。而不是像以前中间的瓶颈层的表示,是间接的分类网络。
  • Triplet Loss:将正对与负对分开一个距离余量
    • semi-hard:半困难三元组样本选择方式
  • 最小的对齐:面部周围紧密的裁剪。我们还尝试了相似性变换对齐,并注意到这实际上可以略微提高性能,但也会略微带来额外的复杂性。而其他模型则需要复杂的3D对齐。
  • 人脸验证:用两个嵌入特征之间的平方L2距离进行阈值比较,此嵌入空间中的平方L2距离直接对应于人脸相似性,同一人的人脸具有小距离并且不同人的人脸具有大距离。
  • 在LFW上99.63%,YouTube Faces上95.12%。

缺点

  • 模型的拟合时间非常长,很少的数据就可以产生很多的三元组,样本数量是O(N3),当训练集很大时,基本不可能遍历到所有可能的样本(或能提供足够梯度额的样本)
  • 模型好坏很依赖训练数据的 Sample 方式,理想的 Sample 方式不仅能提升算法最后的性能,更能略微加快训练速度。

模型总体结构

  • 以前的基于深度网络的人脸识别方法是使用分类层对一些已知身份进行训练,然后使用一个中间的瓶颈层(bottle-neck)作为表示,这个表示用于将识别推广到训练中使用的这些标识之外。 这种复杂的多级系统的缺点是它的间接性和效率低下:人们不得不希望表示能够很好地概括为新面孔,表示的维度也比较大(1000维),要用PCA降维。
  • FaceNet抛弃了DeepID2的Softmax分类层,再将 Contrastive Loss 改进为 Triplet Loss,以获得类内紧凑和类间差异。
  • 网络由一个批量输入层和深度CNN组成,然后进行L2归一化,得到人脸嵌入,后面是训练时的三元组损失。
  • 使用深度卷积网络学习每个图像的欧几里德嵌入( Euclidean embedding),网络经过训练使得嵌入空间中的平方L2距离直接对应于面部相似性:同一人的面部具有小距离并且不同人的面部具有大距离。

人脸嵌入

  • 嵌入(embedding):由f(x)∈R^d表示,它将图像x嵌入到d维欧几里德空间中。另外,我们将这种嵌入限制在d维超球面上,即
  • FaceNet直接将人脸图像输出训练成紧凑的128-D嵌入,再使用基于LMNN(Large margin nearest neighbor)的三元组损失函数。
  • 用嵌入是因为两幅人脸图在高维空间的比较作用不大,而低维的嵌入空间的比较就能发挥作用。
  • 一旦产生了这种嵌入,则上述任务变得直截了当:
    • 人脸验证仅涉及对两个嵌入之间的距离进行阈值处理;
    • 人脸识别成为k-NN分类问题;
    • 人脸聚类可以使用诸如k均值或agglomerative聚类的现成技术来实现。

三元组的定义

  • 三元组损失(triplet loss): 努力获取到嵌入f(x),使得相同身份的所有面部图像之间的平方距离很小,来自不同身份的一对面部图像之间的平方距离很大,负例应该比正例的距离至少远margin。这直接反映了我们想要在人脸验证,识别和聚类中实现的目标。
  • 三元组由两个匹配的人脸缩略图(thumbnail)和一个不匹配的人脸缩略图组成。缩略图是人脸区域的紧裁剪,除了缩放和平移之外,没有2D或3D对齐。
  • 期望的三元组约束:
    • 在公式里α是正负对之间区分界限的阈值(margin),τ是训练集中所有可能的三元组的集合
  • 具有基数N的三元组损失函数:
    • 这是基于LMNN(Large margin nearest neighbor)的三元组损失函数,并且损失的目的是将正对与负对分开一个距离余量(distance margin)。

选择三元组

  • 很少的数据就可以产生很多的三元组,如何用正负例构建triplet,对模型训练的效率有很大影响。easy negative example比较容易识别,没必要训练,否则会严重降低训练效率;若都采用hard negative example,又可能在训练早期导致不良的局部最小值,特别是它可能导致模型崩溃(i.e.f(x)=0)
  • 最暴力的方法就是对于每个样本x^a,从所有样本中找出离他最近的反例和离它最远的正例。这种方法有两个弊端:手工选择非常耗时;容易受不好的数据的主导,导致得到的模型会很差。所以有两个解决策略:
    • 每n步在线下生成一些三元组,使用最新的网络检查点并在数据的子集上计算argmin和argmax。
    • 在线生成三元组,在每个mini-batch中选择hard positive/negative样本来完成。如使用1800个样本的mini-batch,每个mini-batch的每个身份选择大约40张,然后随机加一些负例。(在线负例样本挖掘策略,确保在网络训练时不断增加三元组的难度)
  • 本文中采用了随机的semi-hard 样例方法构建triplet进行训练。
  • 基于negative example与anchor和positive距离,分为三类三元组:
    • 半困难三元组(semi-hard triplets):其中负例不比正例更接近锚点,但仍有大于0的损失,d(a,p) < d(a,n) < d(a,p) + margin。本文就用这种
    • 容易三元组(easy triplets):损失为0的三元组,因为d(a,n) > d(a,p)+margin
    • 困难三元组(hard triplets) :其中负例比正例更靠近锚点,即d(a,n) < d(a,p)

深度卷积网络架构

本文探讨了两种不同的深度卷积网络架构,以及一些缩小的网络。

  • NN1:基于2013年Zeiler&Fergus模型,该模型由多个交错的卷积层、非线性激活、局部响应归一化和最大池化层组成。另外又在标准卷积层之间增加1×1×d卷积层,得到22层深的模型。它总共有1.4亿个参数,每个图像需要大约16亿FLOPS。
  • NN2:基于GoogLeNet风格的Inception模型。使参数减少了20倍(约6.6M-7.5M),FLOPS减少5倍(500M-1.6B之间)。而且他的性能更好。
    • 和原Inception模型的两个主要区别是:使用L2池化而不是最大池化(m)。 池化总是3×3(除了最终的平均池化),并且与每个Inception模块内的卷积模块并行。
  • NN3 与NN2架构上相同,但输入尺寸减小到160x160
  • NN4 与NN2架构上相同,但输入尺寸减小到96x96,从而大幅降低了CPU要求(NN4的 285M FLOPS vs NN2 的 1.6B FLOPS),另外它在较高层中不使用5x5卷积,因为此时感受野已经太小。
  • NNS1 小型的Inception,165x165,有26M参数,每个图像仅需要220M FLOPS。
  • NNS2 轻量的Inception,140x116,有4.3M参数和20M FLOPS

各模型性能比较

表3表示一般网络结构越大,性能越好,但参数量越大,NN2准确率最高,NNS2最轻量。它们的实际差异在于参数和FLOPS的差异。

图4显示了各种不同模型尺寸和架构的FLOPS与精度之间的权衡,错误接受率(FAR)为0.001,显然,如果参数的数量进一步减少,预计性能会下降。


人脸验证评估方法

我们在人脸验证任务上评估我们的方法。即给定一对两个面部图像,使用平方L2距离阈值D(xi,xj)来确定相同和不同的分类。具有相同身份的所有面部对(i,j) 用P_same表示,而所有不同身份对用P_diff表示。在四个数据集上评估我们的方法,除了LFW和YouTube Faces。

  • 在阈值d处被正确分类为same的面部对(i,j)true accepts:
  • 被错误分类为same的所有对的集合(false accept):
  • 将给定面部距离d的验证率VAL(d)和错误接受率FAR(d)定义为:

人脸验证数据集

  • Hold-out Test Set:一百万张图像,我们将它分成五个不相交的数据集,每组200k图像。 然后在100k-100k的图像对上计算FAR和VAL率。
  • Personal Photos:它由三个个人照片集合组成,总共大约12k张图像。 我们计算所有12k平方对图像的FAR和VAL率。
  • LFW:对无限制,标记的外部数据进行报告,并报告平均分类准确度以及均值的标准误差。
  • Youtube Faces DB:它的设置类似于LFW,但不使用验证图像对,而是使用视频对。

实验设置

所有的模型都使用整流线性单元(RELU)作为非线性激活函数。用随机梯度下降(SGD)的标准反向传播和AdaGrad训练CNN。在大多数实验中,我们从学习率0.05开始,我们降低(学习率)以完成模型。模型从随机初始化,并在CPU集群上训练1,000到2,000小时。在训练500小时后,损失的减少(以及准确度的增加)急剧减慢,但额外的训练仍然可以显着提高性能。阈值(margin) α=0.2。

我们使用100M-200M个训练面部缩略图,其中包含大约8M个不同的身份。 在每个图像上运行人脸检测器,并且生成围绕每个面的紧密边界框。 这些面部缩略图的大小调整为相应网络的输入大小。 在我们的实验中,输入尺寸范围从96x96像素到224x224像素。


测试结果

LFW:使用标准协议对无限制的、标记为外部数据的模型进行了评估。使用9个训练分组来选择L2距离阈值。然后在第十次测试分组上执行分类(相同或不同)。所选的最佳阈值为1.242。
我们的模型有两种评估模式:

  • 固定的LFW中心裁剪提供了缩略图,98.87%。
  • 在提供的LFW缩略图上运行一个专用的人脸检测器,如果它没有对齐人脸(这发生在两个图像上),则使用LFW对齐。NN1实现了99.63%±0.09的分类准确度。

Youtube Faces:在每个视频中使用人脸检测器检测前100帧的所有对的平均相似度,分类准确度为95.12%±0.39,使用前一千帧是95.18%。

CNN模型的效果:NN2与小型NNS2相比可以显着提高精度,后者可以在手机上运行30ms/image,并且仍然足够准确用于人脸聚类。当FAR<10^−4时在极低的错误接受率下,单个错误标记的图像会对曲线产生显着影响,FAR的急剧下降可以通过groundtruth标签中的噪声来解释。

对图片质量的敏感度:表4.左侧是不同JPEG质量对10E-3精度的验证率的影响。右边是图像大小(以像素为单位)对10E-3精度的验证率的影响。在test hold-out dataset 的第一次拆分中使用NN1实验。这显示了我们的模型在各种图像尺寸上的稳健性。该网络在JPEG压缩方面非常强大,并且在JPEG质量为20时表现非常好。对120×120的面部缩略图,性能下降非常小,即使在80×80像素下也可接受。这是值得注意的,因为网络是在220×220输入图像上训练的,在低分辨率面部训练可以进一步改善这个范围。

嵌入的维度:表5比较了我们的模型NN1的嵌入(embedding)的维数对4.1节中的保持集(hold-out set)的影响。128维最好。

训练数据集的大小:表6比较了较小的模型用96x96像素作为输入进行700h训练后的性能。模型体系结构类似于NN2,但没有Inception模块中的5x5卷积。很明显,使用数千万个样本可以明显提高在personal photo test set的准确性。使用另一个数量级的更多图像(数亿)仍然可以得到小幅提升,但改进逐渐减少。

人脸聚类效果,一个用户的示例集群:我们的紧凑嵌入有助于将用户个人照片聚集到具有相同身份的人群中。图7显示了使用凝聚聚类生成的用户个人照片集中的一个聚类。它清晰地展示了遮挡,光线,姿势甚至年龄的惊人不变性。

姿势和照明是人脸识别中长期存在的问题。该图显示了FaceNet在不同姿势和照明组合中相同人和不同人的人脸对之间的输出距离,类间的差距较大。取1.1的阈值会正确地对每一对进行分类。


参考资料

https://zhuanlan.zhihu.com/p/76538002
https://blog.csdn.net/stdcoutzyx/article/details/46687471
https://www.jiqizhixin.com/graph/technologies/cd523caf-c196-4418-b561-c1f7e3e3bc61
https://blog.csdn.net/intflojx/article/details/81278330
https://github.com/davidsandberg/facenet
https://github.com/cmusatyalab/openface