人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID

发布于 2019-09-26 作者 风铃 23次 浏览 版块 前端

DeepFace--Facebook的人脸识别

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

连续看了DeepID和FaceNet后,看了更早期的一篇论文,即FB的DeepFace。这篇论文早于DeepID和FaceNet,但其所使用的方法在后面的论文中都有体现,可谓是早期的奠基之作。因而特写博文以记之。

DeepFace基本框架

人脸识别的基本流程是:

detect -> aligh -> represent -> classify

人脸对齐流程

img

分为如下几步:

a. 人脸检测,使用6个基点 
b. 二维剪切,将人脸部分裁剪出来 
c. 67个基点,然后Delaunay三角化,在轮廓处添加三角形来避免不连续 
d. 将三角化后的人脸转换成3D形状 
e. 三角化后的人脸变为有深度的3D三角网 
f. 将三角网做偏转,使人脸的正面朝前。 
g. 最后放正的人脸 
h. 一个新角度的人脸(在论文中没有用到)

总体上说,这一步的作用就是使用3D模型来将人脸对齐,从而使CNN发挥最大的效果。

人脸表示

img

经过3D对齐以后,形成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下:

  • Conv:32个11×11×3的卷积核

  • max-pooling: 3×3, stride=2

  • Conv: 16个9×9的卷积核

  • Local-Conv: 16个9×9的卷积核,Local的意思是卷积核的参数不共享

  • Local-Conv: 16个7×7的卷积核,参数不共享

  • Local-Conv: 16个5×5的卷积核,参数不共享

  • Fully-connected: 4096维

  • Softmax: 4030维

前三层的目的在于提取低层次的特征,比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的Max-pooling层,因为太多的Max-pooling层会使得网络损失图像信息。

后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因:

  • 对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失

  • 不共享的卷积核并不增加抽取特征时的计算量,而会增加训练时的计算量

  • 使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件本文刚好满足。

全连接层将上一层的每个单元和本层的所有单元相连,用来捕捉人脸图像不同位置的特征之间的相关性。其中,第7层(4096-d)被用来表示人脸。

全连接层的输出可以用于Softmax的输入,Softmax层用于分类。

人脸表示归一化

对于输出的4096-d向量:

  • 先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值。

  • 每个向量进行L2归一化

分类

得到表示后,使用了多种方法进行分类:

  • 直接算内积

  • 加权的卡方距离

  • 使用Siamese网络结构

加权卡方距离计算公式如下:

img

其中,加权参数由线性SVM计算得到。

Siamese网络结构是成对进行训练,得到的特征表示再使用如下公式进行计算距离:

img

其中,参数alpha是训练得到。Siamese网络与FaceNet就很像了。

实验评估

数据集

  • Social Face Classification Dataset(SFC): 4.4M张人脸/4030人

  • LFW: 13323张人脸/5749人 
    • restricted: 只有是/不是的标记

    • unrestricted:其他的训练对也可以拿到

    • unsupervised:不在LFW上训练


  • Youtube Face(YTF): 3425videos/1595人

Training on SFC

  • 训练使用的人数不同(1.5K/3.3K/4.4K)

  • 训练使用的照片数目不同(10%/20%/50%)

  • 使用的网络不同(去掉第三层/去掉第4、5层/去掉第3、4、5层)

img

Results on LFW

img

Results on YTF

img

总结

DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,使用了对齐方法。论文认为神经网络能够work的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,此时,可以用卷积神经网络来学习特征。

针对同样的问题,DeepID和FaceNet并没有对齐,DeepID的解决方案是将一个人脸切成很多部分,每个部分都训练一个模型,然后模型聚合。FaceNet则是没有考虑这一点,直接以数据量大和特殊的目标函数取胜。

在DeepFace论文中,只使用CNN提取到的特征,这点倒是开后面之先河,后面的DeepID、FaceNet全都是使用CNN提取特征了,再也不谈LBP了。

参考文献

[1]. Taigman Y, Yang M, Ranzato M A, et al. Deepface: Closing the gap to human-level performance in face verification[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1701-1708.

=================================完美分割线====================================

 

FaceNet--Google的人脸识别

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

引入

随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席。特贡献出FaceNet再次刷新LFW上人脸验证的效果记录。

本文是阅读FaceNet论文的笔记,所有配图均来自于论文。 
转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/46687471

FaceNet

与其他的深度学习方法在人脸上的应用不同,FaceNet并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。

FaceNet算法有如下要点:

  • 去掉了最后的softmax,而是用元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用128位足矣。

  • 元组的选择非常重要,选的好可以很快的收敛。

先看具体细节。

网络架构

大体架构与普通的卷积神经网络十分相似:

img

如图所示:Deep Architecture就是卷积神经网络去掉sofmax后的结构,经过L2的归一化,然后得到特征表示,基于这个特征表示计算三元组损失。

目标函数

在看FaceNet的目标函数前,其实要想一想DeepID2和DeepID2+算法,他们都添加了验证信号,但是是以加权的形式和softmax目标函数混合在一起。Google做的更多,直接替换了softmax。

img

所谓的三元组就是三个样例,如(anchor, pos, neg),其中,x和p是同一类,x和n是不同类。那么学习的过程就是学到一种表示,对于尽可能多的三元组,使得anchor和pos的距离,小于anchor和neg的距离。即:

img

所以,变换一下,得到目标函数:

img

目标函数的含义就是对于不满足条件的三元组,进行优化;对于满足条件的三元组,就pass先不管。

三元组的选择

很少的数据就可以产生很多的三元组,如果三元组选的不得法,那么模型要很久很久才能收敛。因而,三元组的选择特别重要。

当然最暴力的方法就是对于每个样本,从所有样本中找出离他最近的反例和离它最远的正例,然后进行优化。这种方法有两个弊端:

  • 耗时,基本上选三元组要比训练还要耗时了,且等着吧。

  • 容易受不好的数据的主导,导致得到的模型会很差。

所以,为了解决上述问题,论文中提出了两种策略。

  • 每N步线下在数据的子集上生成一些triplet

  • 在线生成triplet,在每一个mini-batch中选择hard pos/neg 样例。

为了使mini-batch中生成的triplet合理,生成mini-batch的时候,保证每个mini-batch中每个人平均有40张图片。然后随机加一些反例进去。在生成triplet的时候,找出所有的anchor-pos对,然后对每个anchor-pos对找出其hard neg样本。这里,并不是严格的去找hard的anchor-pos对,找出所有的anchor-pos对训练的收敛速度也很快。

除了上述策略外,还可能会选择一些semi-hard的样例,所谓的semi-hard即不考虑alpha因素,即:

img

网络模型

论文使用了两种卷积模型:

  • 第一种是Zeiler&Fergus架构,22层,140M参数,1.6billion FLOPS(FLOPS是什么?)。称之为NN1。

  • 第二种是GoogleNet式的Inception模型。模型参数是第一个的20分之一,FLOPS是第一个的五分之一。

  • 基于Inception模型,减小模型大小,形成两个小模型。 
    • NNS1:26M参数,220M FLOPS。

    • NNS2:4.3M参数,20M FLOPS。


  • NN3与NN4和NN2结构一样,但输入变小了。 
    • NN2原始输入:224×224

    • NN3输入:160×160

    • NN4输入:96×96


其中,NNS模型可以在手机上运行。

其实网络模型的细节不用管,将其当做黑盒子就可以了。

数据和评测

在人脸识别领域,我一直认为数据的重要性很大,甚至强于模型,google的数据量自然不能小觑。其训练数据有100M-200M张图像,分布在8M个人上。

当然,google训练的模型在LFW和youtube Faces DB上也进行了评测。

下面说明了多种变量对最终效果的影响

网络结构的不同

img

img

图像质量的不同

img

最终生成向量表示的大小的不同

img

训练数据大小的不同

img

对齐与否

在LFW上,使用了两种模式:

  • 直接取LFW图片的中间部分进行训练,效果98.87左右。

  • 使用额外的人脸对齐工具,效果99.63左右,超过deepid。

总结

  • 三元组的目标函数并不是这篇论文首创,我在之前的一些Hash索引的论文中也见过相似的应用。可见,并不是所有的学习特征的模型都必须用softmax。用其他的效果也会好。

  • 三元组比softmax的优势在于 
    • softmax不直接,(三元组直接优化距离),因而性能也不好。

    • softmax产生的特征表示向量都很大,一般超过1000维。


  • FaceNet并没有像DeepFace和DeepID那样需要对齐。

  • FaceNet得到最终表示后不用像DeepID那样需要再训练模型进行分类,直接计算距离就好了,简单而有效。

  • 论文并未探讨二元对的有效性,直接使用的三元对。

参考文献

[1]. Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[J]. arXiv preprint arXiv:1503.03832, 2015.

=================================完美分割线====================================

 

DeepID人脸识别算法之三代


Taily老段的微信公众号,欢迎交流学习

https://blog.csdn.net/taily_duan/article/details/81214815


 

 

 

收藏
暂无回复