DeepFace--Facebook的人脸识别

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

DeepFace基本框架

本文的贡献

     DeepFace一文依旧是沿着“检测-对齐-人脸表示-分类”这一人脸识别技术路线来的,其贡献在于对人脸对齐和人脸表示环节的改进。1)在人脸对齐环节,引入了3D人脸模型对有姿态的人脸就行分片的仿射对齐。2)在人脸表示环节,利用一个9层的深度卷积在包含4000人、400万张人脸的数据集上学习人脸表示,这个9层的DCNN网络有超过1.2亿个参数。本文的模型在LFW数据集上取得了97.25%的平均精度(逼近了人类97.5%的极限),同时在Youtube数据集上取得了当前最好的结果,比之前的NO.1整整高出了12.7%。

人脸识别的基本流程是:

detect -> aligh -> represent -> classify

人脸对齐流程

人脸对齐是人脸特征抽取前的预处理步骤,在real-world条件下,受姿态和表情影响,人脸对齐是一个困难的任务。本文提出了一种借助3D模型的人脸稠密对齐方法, 见下图:

分为如下几步:

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

其基本步骤是:1. 检测六个面部关键点 2. 基于六个关键点进行人脸全局仿射变换。3. 检测67个面部关键点,并对人脸进行三角剖分。4. 将3D人脸转到当前对齐人脸同一视角并获得三角块的可见性。5. 利用3D模型产生新的67个关键点位置及其三角剖分 6. 分片仿射变换得到的正面人脸。

Details 1: 如何获得Figure 1 (d):
利用一个外部3D人脸库 USF Human-ID database我们可以获得一个平均3D人脸模型,进一步的我们可以计算相机投影矩阵P与2D坐标之间的对应关系,由此可以计算出这个相机投影矩阵P。显然的,这个平均3D模型投影到(c)当中时,会有一个残差r。

Details 2: 如何获得正面人脸
在Tom-versus-Pete一文中,特别提到了Indentiy-Perserved Alignment对齐的概念,其观点是将人脸严格对齐到同一个平均形状对于保持人的身份信息是不利的,因此Tom-versus-Pete一文利用Ref-set对面部关键点的位置进行校正。而本文的则在对齐的平均形状上加上残差r(见Details 1),从而保留了不同人的形状信息(宽鼻梁对齐后依旧是宽鼻梁)。最终的对齐就变成了对应三角块之间的仿射变换,不可见的三角块用对称的三角块来填充。

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

人脸表示

表示学习部分利用了深度卷积神经网络,技术细节需要注意的有两点:1. 激励函数使用的是ReLu , 优化目标是cross-entroy Loss,SGD算法优化。2. F7层的特征表示非常稀疏,75%的特征表示为0,为了提高对光照的鲁棒性,最终的特征还进行了二范数归一。

经过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归一化

分类

测度学习
最终每张人脸用F7层4096维的特征向量来表示,进一步的,本文学习了一对人脸表示的度量函数,采用了两种方法1)加权卡方距离,用线性SVM学习权重。 2)Siame网络。

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

  • 直接算内积
  • 加权的卡方距离
  • 使用Siamese网络结构

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

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

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

其中,参数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层)

Results on LFW

Results on YTF

最重要的结果:1. LFW上的最好结果是97.25%,惊天地泣鬼神了。 2. 如果不做步骤2那一通复杂的对齐,只用全局仿射变换,94.3%。 3. 如果直接用人脸检测的结果,87.9%。 4. 如果不用DCNN学表示,在步骤2的人脸对齐的基础上做LBP/SVM,91.4%。 这组结果说明,对齐和特征表示学习各自带来了3%的增益。

另外一些中间结果,如果直接用F7层归一化后的特征做内积,95.92%, 如果学一个加权的卡方距离,可以提升到97.00%。
计算复杂度
本文还讨论了计算复杂度问题,通过SIMD优化,DCNN网络提取一张图片特征的时间为0.18s,这个时间不算长也不算短,如果有GPU相信这个速度还能获得更大提升。

总结

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.

参考博客

http://blog.csdn.net/stdcoutzyx/article/details/46776415

http://blog.csdn.net/visionhack/article/details/21984495


你可能感兴趣的:(人脸,FaceNet)