FaceNet论文阅读

FaceNet简介

  提出一种紧欧式空间度量反映人脸相识度的映射方法,直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、验证和聚类等。
  

人脸任务对应的技术

  基于embedding提取,人脸相关任务发生改变:

  • 人脸验证 –> 两个embeddings间距离的阈值判断
  • 人脸识别 –> K-NN分类
  • 人脸检索 –> k-means等聚类技术
      

FaceNet特点

  1. 直接训练很深的神经网络来获得embedding
  2. 三元组(anchor、pos、neg)设计、筛选、训练方法
  3. 对每张人脸产生128bytes的特征

传统模型的问题
  传统人脸识别需要先训练一个分类器,把网络某一层输出导入分类器获取识别信息,因此存在间接低效的缺点,即模型产生的特征泛化能力不高且维数达上千维。有的方法采用PCA降维,但PCA是一种线性变换方法,本身对高层神经网络的改善不大,甚至会影响网络的功能。
FaceNet的模型
  FaceNet用一个完整的模型输出128维特征,使用Triplet loss,添加一个distance margin来保证同一身份的目标和不同身份的目标之间差距足够大,人脸缩略图没有使用2D、3D转换,但有比例和翻转变化。
  因此FaceNet可以直接输入人脸图像,即可得到特征向量,是一个end-to-end的系统,不需要人为添加额外的处理(即自身有很强泛化能力,对于光照、拍摄角度均可实现同一身份目标的高聚类低耦合)
FaceNet论文阅读_第1张图片
  如图所示,不同光照、拍摄角度下,相同身份的对象阈值<1.1,不同身份的对象阈值>1.1
  

FaceNet的具体设计

1、模型设计
FaceNet模型结构
  图中Batch即为输入的图像(更确切的说是三元组图像),中间deep architecture实现对三元组图像提取特征矩阵,然后通过L2范数进行归一化,然后embedding成128维特征,通过Triplet loss进行训练。
  FaceNet使用深度卷积网络,基于ZF-Net和Inception,主要的区别在于参数和计算复杂度:

  • ZF-Net总共22层,作者加了一些卷积层进去,称为NN1
  • Inception(一堆数据,总之比第一个少,这里就不转述了),有多种不同的规格对应不同的使用场景(原始NN2、减少输入NN3、进一步减小输入的NN4、减小模型的NNS1、进一步减小模型的NNS2),重点发现5*5的卷积层移除后准确率下降不大

2、Triplet loss
三元组结构
  Triplet loss被作者认为更适合做人脸验证,但没有和其它损失函数进行具体比较,只是提了思路相似的文献14(损失函数是当两者相同距离越小越好,两者不同时距离越接近(甚至超过)m越好。):

Verif(fi,fj,yij)={12||fifj||22,12max(0,m||fifj||2)2,yij=1yij=1Verif(fi,fj,yij)={12||fi−fj||22,yij=112max(0,m−||fi−fj||2)2,yij=−1

  Triplet loss,将图像通过 f(x)f(x) 的embedding映射到特征空间,实现高内聚低耦合,这个embedding的映射空间是超球面的。因此,对于一张输入图像 xaixia (anchor),需要靠近相同身份的图像 xpixip (positive),远离不同身份的图像 xnixin (negative)。那么:
||f(xai)f(xpi)||22+α<||f(xai)f(xni)||22||f(xia)−f(xip)||22+α<||f(xia)−f(xin)||22

也就是说该图像与所有负例的L2距离要大于正例的L2距离,其中 αα 被称为Margin,指a-p和a-n间隔,保证间隔足够大,损失函数是:
minL=iN[||f(xai)f(xpi)||22||f(xai)f(xni)||22+α]minL=∑iN[||f(xia)−f(xip)||22−||f(xia)−f(xin)||22+α]

  对于不满足条件的三元组进行优化,满足的pass不管。

3、Triplet的选择
  很少的数据就可以产生很多的三元组,如果存在错误的样本可能会对模型训练造成很大的影响,那么模型要很久很久才能收敛。三元组可分为easy Triplet和hard Triplet,easy triplets指某些三元组能很轻松满足margin,因而不会帮助改善模型,造成损失值下降慢;hard triplets指区分困难的三元组,保证训练过程中难度不断上升,能帮助很快收敛。
  Triplet的选择可分为离线和在线两种方法:
  • 离线:训练一个模型中间暂停,基于模型找出两种数据,再进一步训练
  • 在线:训练过程中使用mini-batch找到两种数据

  作者曾希望靠离线和在线相结合的方法减少mini-batch的规模,但实验结论无法证明这是否有效。具体实验中是使用需要大量mini-batch的在线方法。少的mini-batch能加速模型训练,但前面Triplet的选择方法使mini-batch必须有足够量。
  实验中也没用挑选hard positive images,而是使用所有的positive images,因为实践中对训练的稳定和收敛的速度并没有明显影响。每个mini-batch有40个不同身份的人脸,然后随机抽取负样本到每个小批量中,这是因为如果一个mini-batch中一类样本太少,会造成三元组时某一两两组合一直是同一对。
  hardest negative images会导致局部最优让模型崩溃,因此必须保证a-n距离大于a-p距离,这样的反例被称为semi-hard,反例和正例距离很相似(小于margin),但仍然是可区分的(反例大于正例):

||f(xai)f(xpi)||22<||f(xai)f(xni)||22||f(xia)−f(xip)||22<||f(xia)−f(xin)||22

4、参数设置
  mini-batch约1800组(每组包含每个目标40张图像,以及一些随机反例),通过随机梯度下降训练卷积神经网络,开始的学习率是0.05,随机初始化, αα 值为0.2。
  

模型性能评估

  统计模型输出为同一目标时,确为一个目标的数量、不为一个目标的数量,由此计算准确率、假正例率。从整个数据集中提取足够的数据来验证(论文中使用了1百万),保证验证数据和训练数据分布一致。将验证集分为5组,分别计算准确率和假正例率,然后求平均。
FaceNet论文阅读_第2张图片
  作者实验发现模型计算量上升时模型准确度也上升,但模型大小和参数对模型准确度的影响不清楚,因为有参数较少的NN2效果不比NN1差,但参数极度下降,性能确实下降了。
FaceNet论文阅读_第3张图片
  实验对比了参数在减少的情况下准确度的问题。通过实验发现之前说的两种网络结构的性能是差不多的,但Inception在降维情况下从头训练模型也实现了很好的性能。ROC曲线的下降点是在10410−4之后,说明个别错误标签也会造成较大影响(如果ROC是光滑的没有出现很大的落差,也就不太可能被一个特征的值主导结果)。
FaceNet论文阅读_第4张图片
  同时得出的实验结论有:图像质量越高(>20)、图像像素越大(>120)、更大的训练样本量,准确率越高;embedding在128维特征的准确率最高(更大的维数要实现更好的性能需要更多的训练次数)。
  训练中128维浮点向量可以被量化为128bytes而不损失精度,更少的维数可以在略微损失精度情况下实现在移动平台上。
  LFW上的测试。用9次训练分割的数据选择L2距离阈值,用第10次分割的数据进行测试,选择的最佳阈值为1.242,除了第8次(1.256)。人脸对齐方面使用了两种方法(LFW中心、人脸对齐工具),在使用人脸对齐工具处理后效果超过deepid。
  

总结

  方法较以前有了很大的性能提升,对齐数量减少。相似变化对齐能提高性能,但相较于增加的复杂度还无法判断是否有价值。
  

附录-Harmonic Embedding

  论文使用了很多模型但基本结构相同,因此embedding可比较,因此可以使用一个模型的embedding帮助另一个模型生成新的embedding。让模型v1的embedding参与到模型v2的Triplet loss,提出了三种方式称为harmonic triplet loss:
FaceNet论文阅读_第5张图片
  将hard negative分别用v1、v2模型提特征,然后其余两项……
都用

  1. 新模型提特征
  2. 将输入图像用已训练模型提特征,postive用新模型提特征
  3. 将postive用已训练模型提特征,输入图像用新模型提特征
    FaceNet论文阅读_第6张图片
      可见较差的模型性能有了提高,但达不到最好模型的标准。作者认为其性能的提高源于对原模型的扰动可以使错误的数据被推到正确的位置,但这种方法的提高可能很有限。这种方法可以使用到移动端并与大型服务器端想结合,大概是让计算复杂度大的模型提高复杂度小的模型,使可移植到移动端的小模型也具有很好的性能。
      

参考

  论文:http://arxiv.org/abs/1503.03832
  代码:github(TensorFlow)https://github.com/davidsandberg/facenet
     github(Caffe)https://github.com/hizhangp/triplet
     github(Triplet)https://github.com/luhaofang/tripletloss
   FaceNet–Google的人脸识别
  谷歌人脸识别系统FaceNet翻译
  解读视频和关注问题

你可能感兴趣的:(人脸识别)