FaceNet

萝らか妹 提交于 2020-03-12 04:52:58

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

0 摘要

FaceNet,直接把输入图像变成欧式空间中的特征向量,两个特征向量间的欧式距离就可以用来衡量两者之间的相似度。可以用在人脸验证、识别和聚类任务中。

本文提出了三元组的概念,构建anchor - matching sample -unmatching sample进行模型的训练。

FaceNet在LFW和YTF数据集上取得了很好的效果,远超当时的其他算法。

1 简介

本文提出的思想是,直接通过CNN学习一副输入人脸图像的欧式空间特征,那么两幅图像特征向量间的欧式距离越小,表示两幅图像是同一个人的可能性越大。一旦有了这个人脸图像特征提取模型,那么人脸验证就变成了两幅图像相似度和指定阈值比较的问题;人脸识别就变成了特征向量集的KNN分类问题;人脸聚类就可以通过对人脸特征集进行kmeans聚类完成。

前面的算法都是用已知身份的人脸图像集训练一个分类模型,然后取中间某个层的输出作为人脸的特征表示。这种方法的弊端是:不够直接和效率低下。不够直接是指希望学习的指定层的特征可以很好的泛化到未知人脸上,效率低是指一般学习的特征维度很高(大于1000维)。有的方法对提取的特征进行PCA降维处理,但这只是一个线性变换,可以通过一个网络层很简单的实现出来。

FaceNet是直接利用triplet loss训练模型输出128维的特征向量,triplets由来自于同一人的两张人脸图像和来自于另一人的第三张图像组成,训练的目的是来自于同一人的人脸对之间的欧式距离要远小于来自于不同人的人脸对之间的欧式距离。输入的人脸图像只是检测的结果,没有进行任何的二维和三维对齐操作。

三元组的样本选择至关重要,作者设计了在线的难例挖掘策略来保证网络训练过程中持续增加三元组的训练难度。下图给出了FaceNet可以正确识别的举例图。
在这里插入图片描述

2 本文方法

FaceNet用到了两个网络,分别是ZFNet和GoogleNet V1。给定网络之后,训练过程中就把网络当成了黑盒子进行端到端训练。网络的输出是triplet loss,用于计算人脸验证、识别和聚类的性能。直观上来说就是,不管输入的人脸图像的质量如何,经过网络f(x)f(x)处理后,将图像x变换成了RdR^d空间的向量,要保证来自于同一人的两张图片的向量间的欧式距离小于来自于不同人的两张图像的向量间的欧式距离。
在这里插入图片描述

2.1 Triplet loss

输出的特征表示成f(x)Rdf(x) \in R^d,即把一副人脸图像映射到d维空间。另外,限制特征空间维d维标准超球体,即f(x)2=1||f(x)||_2=1。如图3所示,训练目的就是保证:
在这里插入图片描述
xiax_i^a表示anchor图像,xipx_i^p表示和anchor图像同一人的另一幅图像,xinx_i^n表示和anchor图像不同人的另一幅图像。α\alpha表示间隔值,τ\tau表示训练集中所有可能的三元组对。上式的意思是,保证同一人的两幅图像间的特征距离比该图像与其他人的任意图像的特征距离都要小。

训练的优化目标是最小化下式:
在这里插入图片描述
使用所有可能的triplet进行训练会使得收敛很慢,因为绝大多数的triplet都满足公式(1)。因此高效训练模型的关键在于找出那些最难的triplet,它们才可以最大程度上刺激网络进行收敛。

2.2 triplet的选择

最难的triplet是指,对于给定的xiax_i^a,应该根据argmaxxipf(xia)f(xip)22argmax_{x_i^p}||f(x_i^a) - f(x_i^p)||_2^2来选择xipx_i^p;应该根据argminxinf(xia)f(xin)22argmin_{x_i^n}||f(x_i^a) - f(x_i^n)||_2^2来选择xinx_i^n

遍历整个训练集去选择xiax_i^axipx_i^pxinx_i^n是不现实的。一是计算量太大,二是某些错误标注的样本会构建错误的triplet影响训练。

可以有两种方法来构建triplet:

  • 每训练n步离线计算下当下的triplets,使用最新训练的模型在训练数据的子集上计算argmax和argmin,从而构建triplets;
  • 在线生成triplets,就是从mini-batch中选取positive/negative难例对。

这里作者使用的是在线的方式,并且使用的mini-batch很大,目的是从规模达到数千样本的mini-batch中选择argmin和argmax。构建mini-batch的时候,需要保证同一人有一定数量的照片才能构建正样本对。所以,作者构建训练集的时候,在每个mini-batch中包含的人员至少有他40张人脸图像,作为负类的人脸图像都是随机选择添加进mini-batch的。

在训练过程中,使用了一个mini-batch中所有的正样本对,但仅使用比较难的负例对。作者没有进行在mini-batch中选择最难正例对和使用所有正例对进行训练的区别,但是实际上使用所有的正例对训练过程比较稳定且训练初始阶段收敛速度要稍微快一点。

选择最难的负例对,有可能在训练的初期收敛到一个较差的局部最小解,特别是有可能收敛到一个崩溃的模型(f(x) = 0)。为了避免这个情况,需要根据下面的规则选择负例对:
在这里插入图片描述
作者将这样的负例对叫做半难负例对。这样的负例的确比正例与anchor间的距离要大,但是相差的差距不是最大的。和公式1相比就是选择间隔稍微大于α\alpha值的负例,也就是放宽了负例的选择条件,不选那些最难的,选择那些比较难的。

triplet的选择质量对模型的训练至关重要。使用小mini-batch的SGD收敛的快,但实现的时候mini-batch大一些使用向量化计算也会加速。这里作者考虑到triplet的选取质量,一般使用的mini-batch大小为1800.

2.3 网络结构

实验时作者设置α\alpha值为0.2。

尝试了两种网络结构,第一种是添加了1 * 1卷积的ZFNet,有140million的参数,每幅图像前向计算量为1.6Billion次浮点运算。这个模型部署在数据中心进行推理,网络结构如下图所示:
在这里插入图片描述
第二种网络是部署在移动式设备上的网络,用的是GoogleNet,参数相比第一种网络少了20倍,计算量相比第一种网络少了五倍。作者定义了NNS1 ~ NNS4四种小网络。
在这里插入图片描述
在这里插入图片描述

3 数据集和评价指标

在LFW和YTF数据集上进行人脸验证任务的评价。

人脸验证任务,就是对同一人的一对图像PsameP_{same}和不同人的一对图像PdiffP_{diff},一对图像的特征欧式距离表示为D(xi,xj)D(x_i,x_j)
定义:
True accept:TA(d)={(i,j)Psame,withD(xi,xj)d}TA(d) = \{(i,j) \in P_{same},with D(x_i,x_j) \leq d\}
False accept:FA(d)={(i,j)Pdiff,withD(xi,xj)d}FA(d) = \{(i,j) \in P_{diff},with D(x_i,x_j) \leq d\}

验证准确率VAL(d)为:
在这里插入图片描述
一般都是比较在FAR为较小值(1e-3,…,1e-6)的情况下VAL的值,越大表示人脸验证越准确。计算过程就是根据FAR等于指定值时得到距离阈值d,然后再计算得到VAL值(或TAR)值。

4 实验

训练集是私有的规模为800万人的1~2亿张图像的数据集。先进行人脸检测,然后对检测到的人脸子块缩放到9696 到 224224的范围去训练人脸特征提取模型。

4.1 准确率和计算量的折中

如图4所示,给出的是在FAR为1e-3情况下各模型准确率和计算量的曲线。可以看到,模型的计算量越大,人脸验证准确率越高。但图上也可以看到NN1和NN2计算量相当,人脸验证的准确率也相当,但是NN1的参数量是NN2的20倍。

4.2 人脸验证的结果

在这里插入图片描述在这里插入图片描述

4.3 图像质量对准确率的影响

在这里插入图片描述
图像质量越高,分辨率越大,人脸验证效果越好。

4.4 输出特征维度的选择

在这里插入图片描述
128维的输出特征效果最好。

4.5 训练集规模的影响

在这里插入图片描述
训练集规模越大越好。

在LFW和YTF数据集上取得了在当时远超其他算法的验证准确率。

triplet loss是一个比较创新的点,没有公布训练所用的数据集。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!