faceNet

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34448345/article/details/94344790

2.faceNet人脸识别

考虑可以将待识别人脸,和已标注人脸进行特征对比获取相似度来判断是否是同一个人。比如传统的特征脸算法,将人脸映射到特征脸向量上,再根据映射权重计算距离进行分类。

按照同样的思路可以用深度学习来实现,我们可以找到一个特征空间,在特征空间中相同的人脸距离更小,不同的人脸距离更大,当出现一张新面孔时寻找空间中与之最近的人脸并判定为同一个人。

如何得到这个特征空间:
解决方案是训练一个深度卷积神经网络。每一次训练需要2个人的3张图片。分别为
固定影像A1(Anchor Face)
反例影像B(Negative Face )
正例影像A2(Positive Face)

首先初始化一个function,计算d(A1-A2)和d(A1-B),算法根据自己为这三张人脸生成的编码值计算欧氏距离再计算triplets loss,然后调整神经网络使得d(A1-A2)更小,使得d(A1-B)更大。

特征空间的意义:

类似于矩阵可以用特征向量去表示一样,当两张人脸可以用相同(相似)的方式映射到特征空间时,可以将两张人脸判定为同一个人。人大脑会从某一些角度去观测和对比,例如我们会因为看到面部布局、表情相似就觉得可能是同一个人(实际上并不是):

研究表明,人类更加侧重的那些能看见的明显测量值(眼睛颜色、鼻梁大小)对于计算机来说并没有太大意义。最准确的方法是让计算机自己去找出观测角度,且这些角度能够很好的表达人脸的信息,特征空间表达的是人脸的观测角度(如眼睛),而不是人脸的观测角度测量值(如眼睛大小),因此特征空间只需要训练一次。“嵌入空间”的好处在于,传统神经网络输出层通常是分类层在numClasses庞大时效率低且不直观,即便VGG-16/19等经典的分类网络也只在1000个类别时变现良好。

faceNet是谷歌发表于CVPR2015的人脸识别算法,在LFW上准确率99.63%,YouTubeFacesDB上准确率95.12%,论文选择了两种cnn网络:
Zeiler&Fergus架构:

 

GoogleNet-Inception架构:

 

faceNet选择的损失函数有center-loss+softmax-loss和tripletloss两种:
Triplet-loss:

拿到人脸特征编码后计算欧氏距离,α为正负例边界(间隔,类似于svm),则loss函数为:

优化函数为:

三元组的选择对收敛影响巨大,三元组选择太多,困难三元组才能学习到有效信息。因为本身就长得不像的两个人很容易就能判断他们不是同一个人所以不能学习到有效信息。正例样本xp,负例样本xn分别选择为:

真实训练过程中跨越所有样本去寻找xp和xn显然不现实,不仅十分耗时,而且容易受到异常数据的影响,解决办法有两种。一种是每n步去计算argmax和argmin然后寻找xp和xn,另一种是,取mini-batch=1800,固定同类样本40个和随机负样本,在线生成和选取mini-batch里的hard pos/neg 样例,并按照距离公式添加约束:

Center-loss/softmax-loss:

展开阅读全文

没有更多推荐了,返回首页