提出一种紧欧式空间度量反映人脸相识度的映射方法,直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、验证和聚类等。
基于embedding提取,人脸相关任务发生改变:
传统模型的问题
传统人脸识别需要先训练一个分类器,把网络某一层输出导入分类器获取识别信息,因此存在间接低效的缺点,即模型产生的特征泛化能力不高且维数达上千维。有的方法采用PCA降维,但PCA是一种线性变换方法,本身对高层神经网络的改善不大,甚至会影响网络的功能。
FaceNet的模型
FaceNet用一个完整的模型输出128维特征,使用Triplet loss,添加一个distance margin来保证同一身份的目标和不同身份的目标之间差距足够大,人脸缩略图没有使用2D、3D转换,但有比例和翻转变化。
因此FaceNet可以直接输入人脸图像,即可得到特征向量,是一个end-to-end的系统,不需要人为添加额外的处理(即自身有很强泛化能力,对于光照、拍摄角度均可实现同一身份目标的高聚类低耦合)
如图所示,不同光照、拍摄角度下,相同身份的对象阈值<1.1,不同身份的对象阈值>1.1
1、模型设计
图中Batch即为输入的图像(更确切的说是三元组图像),中间deep architecture实现对三元组图像提取特征矩阵,然后通过L2范数进行归一化,然后embedding成128维特征,通过Triplet loss进行训练。
FaceNet使用深度卷积网络,基于ZF-Net和Inception,主要的区别在于参数和计算复杂度:
2、Triplet loss
Triplet loss被作者认为更适合做人脸验证,但没有和其它损失函数进行具体比较,只是提了思路相似的文献14(损失函数是当两者相同距离越小越好,两者不同时距离越接近(甚至超过)m越好。):
作者曾希望靠离线和在线相结合的方法减少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),但仍然是可区分的(反例大于正例):
统计模型输出为同一目标时,确为一个目标的数量、不为一个目标的数量,由此计算准确率、假正例率。从整个数据集中提取足够的数据来验证(论文中使用了1百万),保证验证数据和训练数据分布一致。将验证集分为5组,分别计算准确率和假正例率,然后求平均。
作者实验发现模型计算量上升时模型准确度也上升,但模型大小和参数对模型准确度的影响不清楚,因为有参数较少的NN2效果不比NN1差,但参数极度下降,性能确实下降了。
实验对比了参数在减少的情况下准确度的问题。通过实验发现之前说的两种网络结构的性能是差不多的,但Inception在降维情况下从头训练模型也实现了很好的性能。ROC曲线的下降点是在10−410−4之后,说明个别错误标签也会造成较大影响(如果ROC是光滑的没有出现很大的落差,也就不太可能被一个特征的值主导结果)。
同时得出的实验结论有:图像质量越高(>20)、图像像素越大(>120)、更大的训练样本量,准确率越高;embedding在128维特征的准确率最高(更大的维数要实现更好的性能需要更多的训练次数)。
训练中128维浮点向量可以被量化为128bytes而不损失精度,更少的维数可以在略微损失精度情况下实现在移动平台上。
LFW上的测试。用9次训练分割的数据选择L2距离阈值,用第10次分割的数据进行测试,选择的最佳阈值为1.242,除了第8次(1.256)。人脸对齐方面使用了两种方法(LFW中心、人脸对齐工具),在使用人脸对齐工具处理后效果超过deepid。
方法较以前有了很大的性能提升,对齐数量减少。相似变化对齐能提高性能,但相较于增加的复杂度还无法判断是否有价值。
论文使用了很多模型但基本结构相同,因此embedding可比较,因此可以使用一个模型的embedding帮助另一个模型生成新的embedding。让模型v1的embedding参与到模型v2的Triplet loss,提出了三种方式称为harmonic triplet loss:
将hard negative分别用v1、v2模型提特征,然后其余两项……
都用
论文: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翻译
解读视频和关注问题