人脸识别系列(一)

人脸识别简介

人脸识别最新趋势

人脸识别论文

DeepFace(2014, FaceBook)

DeepFace是FaceBook提出来的,后续有DeepID和FaceNet出现。而且在DeepID和FaceNet中都能体现DeepFace的身影,所以DeepFace可以谓之CNN在人脸识别的奠基之作。
在人脸识别中,通常经过四个步骤:检测、对齐、表示、分类。DeepFace主要在对齐表示这两个步骤上提出了新的方法,
对齐方面主要使用了3D人脸模型来对齐人脸,表示方面使用了9层的CNN,CNN使用了局部卷积,卷积权重不共享。

基本框架

人脸对齐 (face alignment)

已经存在一些人脸数据库的对齐版本(比如LFW-a),但是对齐人脸仍然是一件很困难的事,由于受到姿态(人脸的非平面性),非刚性表情等因素的影响。已经有很多方法成功用于人脸对齐,论文使用的方法是基于基准点的3D建模方法,把人脸转为3D的正脸。主要步骤为:

  • 1.用LBP+SVR的方法检测出人脸的6个基准点,眼镜两个点,鼻子一个点,嘴巴三个点,如下图(a); LBP特征参考图像特征提取之LBP特征
  • 2.通过拟合一个对基准点的转换(缩放,旋转,平移)对图像进行裁剪,得到下图(b)
  • 3.对图像定位67个基准点,并进行三角剖分,得到下图(c)
  • 4.用一个3D人脸库USF Human-ID得到一个平均3D人脸模型(正脸),如图(d)
  • 5.学习一个3D人脸模型和原2D人脸之间的映射P,并可视化三角块,如图(e)
  • 6.通过相关的映射,把原2D人脸中的基准点转换成3D模型产生的基准点,得到如图(f)所示,最后的正脸就是图(g)。

人脸表示

经过3D对齐以后,形成的图像都是152×152的图像,送入CNN,其结果如下:

  • 1.如下图所示,训练了一个DNN来提取人脸图像的特征表示
  • 2.C1和C3表示卷积层,M2表示最大池化层,“32x11x11x3@142x142”表示使用32个大小为11x11x3的卷积核,输出feature map的大小为142x142。前三层主要提取低水平特征,其中最大池化可以使输出对微小的偏移更加鲁棒(可能人脸对齐歪了一些也没关系),因为最大池化会损失信息所有没有使用太多。
  • 3.L4,L5,L6是局部卷积层,对于feature map上每个位置,学到不同的卷积核(即一张feature map上的卷积核参数不共享),因为人脸的不同区域会有不同的统计特征,比如眼睛和眉毛之间的区域比鼻子和嘴巴之间的区域具有更高的区分能力。局部卷积层会导致更大的参数量,需要很大的数据量才能支撑的起。
  • 4.F7和F8是全连接层,用来捕捉(不同位置的)特征的相关性,比如眼睛的位置和形状,和嘴巴的位置和形状。F7层的输出提取出来作为人脸特征,和LBP特征对比。F8层的特征喂给softmax用于分类
  • 5.对F7层的输出特征进行归一化(除以训练集上所有样本中的最大值),得到的特征向量值都为0到1之间。
    1. 具体参数:
      C1:卷积层,卷积核尺寸1111,共32个卷积核
      M2:池化层,最大池化3
      3,即stride = 2
      C3:卷积层,卷积核尺寸99 ,共16个卷积核
      L4: 卷积层,卷积核尺寸9
      9 ,共16个卷积核。L表示local,意思是卷积核的参数不共享
      L5: 卷积层,卷积核尺寸77 ,共16个卷积核。
      L6: 卷积层,卷积核尺寸5
      5 ,共16个卷积核。
      F7: 全连接,4096个神经元
      F8: 全连接,4030个神经元
  • 7.使用参数不共享,有如下原因:
    • a.对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失
    • b.不共享的卷积核并不增加抽取特征时的计算量,不会增加训练时的计算量
    • c.使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件本文刚好满足。

验证度量

  • 验证就是输入两个实例,判断它们是不是属于同一类。用监督学习来进行人脸验证被广泛研究。但是有监督学习中训练数据和测试数据的不一致会导致很差的泛化能力,如果将模型拟合在小的数据集则会大大减小它泛化到其它数据集的能力。无监督度量是直接对两个特征向量做内积,而有监督度量有卡方相似度和孪生网络
  • 卡方相似度: $$ χ^2(f_1,f_2)= \sum_i w_i(f_1[i]−f_2[i])^2 / (f_1[i]+f_2[i]) $$
    其中$f_1$和$f_2$为DeepFace特征表示,在前面的阶段“人脸表示”得到。$w$用一个线性SVM学到,
    SVM的变量为$ (f_1[i]−f_2[i])^2 / (f_1[i]+f_2[i]) $。
  • 孪生网络 (Siamese network)
    把上面那个网络,复制两份,两个人脸分别输入两个小网络,两个小网络共享参数,最后计算两个输出的特征向量的距离,用一个全连接层映射为一个逻辑单元(相同还是不相同)。
    网络的参数和上面那个一致,为了防止过拟合,训练的时候只训练最高两层。特征的度量公式为$d(f_1,f_2)=\sum_i α| f_1[i]−f_2[i] | $。网络结构可参考下图所示。

总体上说,使用3D模型来将人脸对齐,从而使CNN发挥最大的效果。神经网络能work的一部分原因在于,一旦人脸对齐,人脸区域的特征就固定在某些像素位置上了。
这篇14年的文章,很多实现方法没有告知,而且没有code支撑,效果难以复现。

DeepID (商汤科技)

GaussianFace (科大讯飞)

Face++ (旷视科技)

FaceNet (Google)

VGG-Face (牛津大学)

FR+FCN

SphereFace

NormFace

ArcFace

MobileFaceNets

参考文献

0%