FaceNet: A Unified Embedding for Face Recognition and Clustering 论文笔记

0 摘要

       尽管有一些研究已经在人脸识别领域取得了重大进展,但大规模地实施人脸验证和识别仍然是一个严峻的挑战。在本文中,我们提出了FaceNet,它可以将人脸图像映射到欧几里得空间(人脸图像->空间向量),两个空间向量之间的距离代表了两张人脸图像的相似程度。只要能生成这个空间映射的关系,使用FaceNet将人脸图像转换为特征向量的技术,像人脸识别、人脸验证、人脸聚类等任务都可以轻松完成。
       我们的方法是直接使用深度卷积神经网络优化特征向量本身(根据不同的损失函数),而不是像以前的深度学习方法那样,优化中间的瓶颈层。训练时,我们使用三元组损失粗略匹配/不匹配人脸图片,这些人脸图片使用在线三元组挖掘的方法生成。(如果每次都是随机选择三元组,模型虽然可以收敛但达不到最好的效果;如果加入困难样本挖掘,即每次都选择最难分辨的三元组进行训练,模型又不能很好收敛;为此提出每次都选取半难(semi-hard)的数据进行训练,让模型可以在收敛的同时又保持良好的性能。)我们有更高的表现效率:每个人脸使用128字节(每个人脸表示成128维向量)就实现了最先进的人脸识别性能。
       在LFW数据集上,实现了最高精度:99.63%。在youtobe数据集上实现了95.12%的精确度。在这两个数据集上,错误率与最好的方法相比降低了30%。

1 引言

        本文提出了一种统一的方法,可以用在人脸验证,人脸识别,人脸聚类任务中。我们的方法是利用深度卷积神经网络学习将图像映射到欧几里得空间(人脸图像->128维的空间向量)。训练网络使得在空间中,向量的L2距离平方表示了人脸的相似程度:同一个人的不同图像在空间中的距离很小,不同人的图像在空间中的距离很大。
        一旦这个空间映射生成,上面提到的三个任务就变得很直接。人脸验证:通过设置两个向量之间距离的阈值,区分是否两张人脸图像是否属于同一个人。人脸识别:使用knn分类器。人脸聚类:使用k-means等。
        以前基于深度网络的人脸识别方法是训练一套已知的人脸身份的分类层,然后采取卷积层的最后一层作为人脸的向量表示。这种方法是低效的:一是我们希望最后一层卷积层的特征表示能够表示一些新面孔,二是这个特征表示的尺寸通常非常大(通常1000维度)。最近的一些工作已经使用PCA降低维度,但这是一种线性变换,可以用一层网络轻松学习到。
        相比于传统的方法,FaceNet利用三元组损失函数来训练,可以直接输出一个压缩后的128维度的特征向量。我们的三元组损失函数包含两张同一个人的图像和一张另外一个不同人的图像。损失函数的目标是通过距离区分一对正样本和一个负样本。人脸的图像是紧密裁剪的人脸区域,没有经过2D和3D对齐以及放大转换等预处理。
        选择使用哪个三元组对于性能非常重要,我们提出了一种新的在线负样本挖掘策略,可确保网络训练时,持续增加三元组难度。 为了提高聚类的准确性,我们还探索了困难正样本的挖掘技术。
        如图1的图像。对于之前的人脸验证系统来说非常困难。但是我们的方法可以很容易处理。
这里写图片描述

2 相关工作

        与近期使用深度网络解决问题的方法相同,我们的方法也是靠纯数据驱动,深度网络从人脸图像的像素中学习特征表示。我们使用大量带标记的人脸数据集来获得姿态、光照和其他变化条件的不变性。我们探索两种不同的深度卷积神经网络结构,这两种结构近期在计算机视觉领域取得了很大成功。第一个结构是基于ZFNet,该模型由多个交错卷积层,非线性激活,局部响应归一化和最大池化层组成。我们额外增加了一些 1 × 1 × d 卷积层。第二个结构是基于GoogLeNet,该模型获得了2014ImageNet冠军。该网络使用混合的层,并行运行几个不同的卷积层和池化层,并将它们的输出响应连接起来。 我们发现,这些模型可以将参数数量减少多达20倍,并有可能减少可比性能所需的FLOPS数量。
        一些近期人脸验证和识别的工作如下:[15,17,23]使用了多阶段的系统,将深度卷积网络的输出与PCA相结合以降低维度,并用SVM分类。[23]采用深层网络将脸部“扭曲”成典型的正面视图,然后学习一个CNN对已知身份的脸部进行分类。 对于人脸验证,将深度卷积网络的输出与PCA相结合以降低维度,并用SVM分类。[17]提出了多阶段的方法,该方法使人脸与一般的三维形状模型对齐。 训练多分类的网络,以执行超过四千个身份的人脸识别任务。作者还试验了一个Siamese network,他们直接优化两个脸部特征之间的L1距离。 他们在LFW上的最佳表现(97.35%)源于三个网络的集成。网络预测的距离结合了非线性的SVM。

3 方法

        FaceNet使用深度卷积网络。我们讨论两种不同的结构:ZFNet和GoogLeNet。网络的细节在3.3部分。
        考虑模型的细节,如图2所示。将它看成一个黑盒子,最重要的部分在于整个系统是端到端学习,在最后,使用三元组损失。我们把图像 x 映射到特征空间 R d ,映射成的特征向量用 f ( x ) 表示。计算所有特征向量间的平方距离,同一个人的特征向量间距离小,不同人的特征向量间距离大。
这里写图片描述

3.1 三元组损失

        模型的目的是将图像 x 映射到 d 维的欧几里得空间,映射的特征向量为 f ( x ) 。训练的时候固定 | | f ( x ) | | 2 = 1 ,即特征归一化,保证特征不会无限地”远离”。在该向量空间内,我们希望保证单个个体的图像 x i a ( a n c h o r ) 和该个体的其它图像 x i p ( p o s i t i v e ) 的距离近,与其他个体的图像 x i n ( n e g a t i v e ) 距离远。他们之间的关系如图3。
这里写图片描述
        因此,我们想要:
        | | f ( x i a ) f ( x i p ) | | 2 2 + α < | | f ( x i a ) f ( x i n ) | | 2 2 ( 1 )
即相同人脸间的距离平方至少要比不同人脸间的距离平方小 α 。据此,设计的损失函数为:
        L = i = 1 N [ | | f ( x i a ) f ( x i p ) | | 2 2 | | f ( x i a ) f ( x i n ) | | 2 2 + α ]
        所有可能的三元组中,会有很多的三元组满足上述条件(1)。这些三元组不产生任何损失,对训练没有贡献,会导致收敛速度减慢(因为它们仍然会通过网络)。 选择三元组是非常重要的,可以有助于改善模型。 以下部分将讨论我们如何选择不同的三元组。

3.2 三元组的选择

        为了加快模型的收敛,选择不符合公式(1)的三元组很关键。最暴力的方法是对于每个样本,从所有样本中找出离它最近的反例和离它最远的正例,然后进行优化。
(如图3所示,学习前,anchor和nagative距离很近,和positive距离很远;通过学习,anchor和positive距离很近,和negative距离很远,符合公式(1)。但是往往我们随机选择的三元组就能符合公式(1)的要求,也就是说不学习也能符合要求,这些三元组不会产生损失,对训练没有帮助,会导致收敛变慢。因此要选择合适的三元组,不能随机选择。对暴力的方法就是对于一个样本,每次迭代找出所有样本中离它最近的反例和离它最远的正例,这三个样本组成一个三元组进行训练)
        暴力的方法有两个明显的问题:耗时。选择三元组要比训练还要耗时;错误标记和形象不佳的人会导致模型性能很差。本文提出两种策略:
1.离线的方法:每过N步,对当前样本,使用最新的网络在数据的子集上找出离它最近的反例和离它最远的正例,三个样本组成三元组;
2.在线的方法:在mini-batch中,对当前样本,找出离它最近的反例和离它最远的正例,三个样本组成三元组。
        在这里,我们专注于在线生成的方法,并使用包含有几千个样本的mini-batch,并且仅在一个mini-batch内,对当前样本找出离它最近的反例和离它最远的正例。为了使mini-batch中生成的三元组更加合理,生成mini-batch的时候,保证每个mini-batch中每个人平均有40张图片,然后随机加一些反例进去。
       在生成三元组的时候,在mini-batch中找出所有的anchor-positive对,然后对每个anchor-positive对找出其hard negative样本。我们也探索了离线生成三元组的方法,它允许使用较小的批量,但是实验结果显示他并不稳定。
       选择最困难的负样本实际上可能导致训练早期陷入局部极小,特别可能导致模型崩溃(即 f ( x ) = 0 )。为了避免这种情况,我们选择的 x i n 满足下面的不等式:
| | f ( x i a ) f ( x i p ) | | 2 2 < | | f ( x i a ) f ( x i n ) | | 2 2 ( 4 )
我们把这样的负样本称为semi-hard(半难,不考虑 α 因素)。因为它们远离anchor,却不是正面示例,但仍然很难,因为平方距离接近anchor-positive距离。
        正如上述描述的,正确的三元组选择对于模型的快速收敛非常重要。一方面,我们会使用较小的mini-batches,在SGD时加快收敛;另一方面,实施细节表明,数十到数百个样本的批次更有效。 然而,关于批量大小的主要限制是我们从小批量中选择困难三元组。 在大多数实验中,我们使用大约1800个样本的批量大小。

3.2 深度卷积网络

        在实验中,我们训练CNN使用的是SGD和标准反向传播方法。多数实验中,初始的学习率为0.05,然后逐渐降低。参数随机初始化,初始化方式同Inception v3,在CPU集群上训练了1000-2000小时。在500h以后,损失减少(准确性提高)显着减慢,但额外的训练仍可以显着提高性能。 α = 0.2
       我们使用了两种结构,在实验部分会探讨它们的细节。它们的实际区别在于参数和FLOPS的区别。 根据应用场景的不同,最佳的模型选择可能会有所不同。例如:在服务器端运行的模型可能有很多参数,并且需要大量FLOPS,而在手机上运行的模型需要的参数很少。所有的模型都是用ReLU激活函数。
        第一类是基于ZFNet结构的网络如表1。增加了 1 × 1 × d 卷积层,模型共22层。总共有140million个参数,1.6billionFLOPS。
这里写图片描述
        第二类是基于GoogLeNet结构。减小模型的大小,形成2个不同的模型。这些模型参数是第一个的 1 20 ;FLOPS是第一个的 1 5 。这些模型的尺寸大大缩小(过滤器的深度和数量),因此它们可以在手机上运行。 其中一个,NNS1有26M参数,每个图像只需要220M FLOPS。 另一个,NNS2有4.3M参数和每个图像只需要20M FLOPS。表2详细描述了NN2我们最大的网络。 NN3的架构与NN2(输入尺寸224x224)相同,但输入尺寸缩小为160x160。 NN4的输入尺寸仅为96x96,从而大大降低了CPU需求(285M FLOPS与1.6B的NN2)。 除了缩小输入尺寸的大小之外,它在较高层中不再使用5x5卷积,因为那时的感受野已经太小了。 一般来说,我们发现5x5卷积可以在整个过程中被去除,但精度只有微小的下降。 图4比较了我们所有的模型。
这里写图片描述
这里写图片描述

4 数据集和评估方法

        我们在四个数据集上评估我们的方法。除了LFW数据集和YouTube Faces数据集外,我们还在人脸验证任务上评估了我们的方法。即,给定一对人脸图像,使用平方L2距离阈值 D ( x i , x j ) 来确定是否是相同或不同的分类。所有具有相同身份的人脸对 ( i , j ) P s a m e 表示,而所有不同身份的人脸对用 P d i f f 表示。
        我们将所有true accepts集合定义为:
T A ( d ) = { ( i , j ) P s a m e , w i t h D ( x i , x j ) d } ( 5 )
       人脸对 ( i , j ) 正确分类的阈值为 d 。相同的,false accepts集合定义为:
F A ( d ) = { ( i , j ) P d i f f , w i t h D ( x i , x j ) d } ( 6 )
       然后将给定人脸距离 d 的验证率 V A L ( d ) 和错误接受率 F A R ( d ) 定义为:
V A L ( d ) = T A ( d ) P s a m e , F A R ( d ) = F A ( d ) P d i f f ( 7 )

5 实验

       如果没有提到,我们会使用由大约8M个不同身份组成的100M-200M训练人脸图像。 在每幅图像上运行人脸检测器,并生成每个人脸周围的紧密边界框。 这些脸部图的大小被调整为相应网络的输入大小。 在我们的实验中,输入尺寸从96x96像素到224x224像素。

猜你喜欢

转载自blog.csdn.net/weixin_37904412/article/details/80480373