aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

人脸识别-人脸识别合集 | 1 DeepFace解析(Facebook CVPR2014)

DeepFace是Facebook CVPR2014年发表,主要用于人脸验证,是深度学习人脸识别的奠基之作,超过了非深度学习方法Tom-vs-Pete classifiers、high-dim LBP、TL Joint Bayesian等

DeepFace: Closing the Gap to Human-Level Performance in Face Verification


主要思想

  • 人脸识别的流水线包括四个阶段:检测⇒对齐⇒表示⇒分类。
  • 3D人脸对齐:采用显式的3D人脸建模并应用分段仿射变换,并实现人脸正面化。DeepID和FaceNet并没有这种对齐,DeepID的解决方案是将一个人脸切成很多部分,每个部分都训练一个模型,然后模型聚合,FaceNet则是直接以数据量大和特殊的目标函数取胜。
  • 人脸表示(人脸识别):利用9层深度神经网络导出人脸表示,还使用了3个无权重共享的局部连接层。人脸表示特征向量是4096维,Softmax分类。开了先河,后面再也不用LBP了。
  • 人脸验证:无监督(两个向量的内积);有监督(卡方相似度或孪生网络)。
  • 将基于模型的精确对齐与大型人脸数据库相结合的学习表示方法可以很好地推广到无约束环境下的人脸。在人脸数据集Facebook的SFC 上训练网络模型。LFW达到97.35%的准确度,YTF上91.4%,将当前技术水平的误差减少了27%以上,接近人类水平的表现。

人脸对齐(Face Alignment)

  • 人脸对齐仍然被认为是难以解决的问题,特别是在无约束的环境下
  • DeepFace是将检测的人脸投射到3维模型上,再对齐到正脸。这个方法比较复杂,后面不用它也能取得很好的效果。

对齐流水线(Alignment pipeline)

对齐的步骤是:找6个landmarks–>进行2D对齐–>重新找6个landmarks–>重新进行2D对齐……直到收敛–>找67个landmarks–>3D-2D映射建模–>逐段仿射变换变成正脸。

  • (a)检测人脸及检测6个初始基准点:由训练有素支持向量回归器(Support Vector Regressor)+LBP 来检测剪切块内的6个基准点,其中眼睛中心2个,鼻尖1个和嘴部位置 3个。
  • (b)2D对齐的剪切块:6个基准点用于通过缩放、旋转和平移将图像转换成6个锚点位置,然后在新的warped图像上迭代直到没有显著变化,最终构成2D相似性变换,生成了2D对齐的剪切块。然而,相似变换不能补偿平面外旋转,这在无约束条件下尤为重要。
  • (c)在2D剪切块上定位67个基准点并做相应的Delaunay三角剖分:为了对齐经平面外旋转的人脸,使用通用的3D形状模型并注册3D仿射相机,相机用于将2D剪切曲线扭曲到3D形状的图像平面。使用第二个SVR在2D对齐的剪切块中定位另外的67个基准点。在轮廓上添加了三角形以避免不连续。
  • (d)将三角化后的人脸转换成3D形状:手动在3D参考形状(USF Human-ID数据库的3D扫描的平均值)上放置67个锚点,并且以这种方式实现基准点与3D参考点之间的完全对应。
  • (e)相对于拟合的3D-2D相机的三角形可视图:然后使用广义最小二乘解和一个已知协方差矩阵Σ来拟合一个仿射3D到2D的相机P,大小为2×4的仿射相机P由8个未知数的向量P->表示。较暗的三角形能见度低。
  • (f)分段仿射变换:最后的正面化是通过由67个基准点衍生的Delaunay三角剖分引导的分段仿射变换(piece-wise affine warping)实现的
  • (g)最终的正面化的剪切块
  • (h)由3D模型生成的新视图(在论文中没有用到)。

人脸表示的网络模型

通过一个大型的深层网络学习面部图像的一般表示(Representation)。将DNN训练成一个多分类的人脸识别任务,即对人脸图像的身份进行分类。

  • 3D对齐后的152x152像素的3通道RGB人脸图像被送入具有32个11×11×3的滤波器的卷积层(C1)。
  • 然后将得到的32个特征图馈送到最大池化层(M2),对3×3空间邻域最大池化,步幅为2, 每个通道分别执行。
  • M2之后是具有16个9×9×32的滤波器卷积层(C3)。
  • 局部连接层(locally connected layers)(L4, L5和L6)应用类似卷积层的滤波器组,但是特征图中的每个位置都学习不同的滤波器组,Local的意思是卷积核的参数不共享。LCN不同于卷积层,LCN每个点的卷积核都不一样。
    • 这是因为对齐图像的不同区域具有不同的局部统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失。局部连接层的使用不会影响特征提取的计算负担,但会影响需要训练的参数数量。
  • F7和F8是全连接,能够捕获在人脸图像特征之间的较远部分的相关性,例如,眼睛的位置和形状以及嘴的位置和形状。
  • F7的输出将用作原始人脸表示特征向量,4096维。
    • 这与基于lbp的表示形成了对比,它通常汇集非常局部的描述符(通过计算直方图),并将其用作分类器的输入。
  • F8上人脸表示被送到了 K-way Softmax 来产生在类别标签上的概率分布,用于分类。4030维,是因为SFC训练数据集有4030个人,每个人具有800到1200张人脸图片。
    • 训练的目标是最大限度地提高正确类别(人脸id)的概率。最小化每个训练样本的交叉熵损失来实现,并使用随机梯度下降(SGD)更新参数,使各参数的损失最小化。使用了ReLU激活。
    • 只对第一个全连接层应用了dropout,由于训练集较大,我们在训练过程中没有观察到明显的过拟合。
  • 人脸表示归一化:将人脸表示特征归一化为0到1之间,以降低对光照变化的敏感度。对于F7输出的4096-d向量先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值;再对每个向量进行L2归一化。
    • 归一化后的DeepFace特征向量与传统的基于直方图的特征(如LBP)有相同之处:所有值均非负;非常稀疏;特征元素的值都在区间[0,1]之间。

人脸验证(Face Verification)

  • 人脸验证的目标是判断两个人脸图像是否属于同一个人的,1:1
  • 考虑无约束环境中的问题:分辨率不太高,视角可以侧脸和旋转,光照任意,遮挡可以有。

人脸验证指标

验证就是输入两个实例,判断它们是不是属于同一类。

  1. 无监督相似性指标:直接对两个归一化的特征向量做内积。
    DeepFace的目标是学习一种无监督的指标,它可以很好地泛化到几个数据集。
  2. 有监督度量指标: 卡方相似度或孪生网络。
    有监督的方法相对于无监督的方法表现出明显的性能优势。通过对目标域的训练集进行训练,可以对特征向量(或分类器)进行微调,从而更好地在数据集的特定分布范围内执行。但训练数据和测试数据的不一致会导致很差的泛化能力,如果将模型拟合在小的数据集则会大大减小它泛化到其它数据集的能力。

(1) 加权的χ2距离(Weighted χ2 distance)

(2) Siamese network (并使用加权L1距离)
把上面那个网络,复制两份,两个人脸分别输入两个小网络,两个小网络共享参数,最后计算两个输出的特征向量的距离,用一个全连接层映射为一个逻辑单元(相同还是不相同)。网络的参数和上面人脸表示网络的一致,为了防止过拟合,训练的时候只训练最高两层。
在Siamese网络中,以人脸验证为目标,特征提取和人脸识别是联合学习。


局部连接层

  • 全连接层(Fully-Connected Layer,):没有权重共享。判断方法如下:
    • filter size等于input size则是fully connected,整个patch只用一个大卷积核。
    • 点对点的连接都是fully connected.(这里其实就是MLP)
    • 当1x1不等于input size的时候,1x1的卷积核一样具备weights share的能力,此时不是全连接层。
  • 卷积层(Convolutional Layer,CNN):当数据集具有全局的局部特征分布时,也就是说局部特征之间有较强的相关性,适合用全卷积。每一个点都用同一个filter,权重共享。
    • 卷积层中的参数共享并不是每个场景下都合适的。有一些特定的场合,特别是当输入图像是一些明确的中心结构时候,我们不能把图片上的这些窗口数据都视作作用等同的。当图像的局部相似时,我们就应该期望在图片的不同位置学习到完全不同的特征。
  • 局部连接层(Locally Connected Layers,LCN):在不同的区域有不同的特征分布时,适合用local-Conv。每个点的卷积核都不一样,权重不共享。
    • 比如人脸识别中,通常就放松参数共享的限制。一般人的面部都集中在图像的中央,你可能期望不同的特征,比如眼睛特征或者嘴特征可能(也应该)会在图片的不同位置被学习。因此我们希望,数据窗口滑过这块区域的时候,权重和其他边缘区域是不同的。

数据集

  • 本文提出的人脸表示是从SFC数据集训练,然后将表示应用于LFW,以及YouTube Faces(YTF)数据集。
  • 新收集的数据集:社交人脸分类(Social Face Classification , SFC)数据集。 SFC数据集来自Facebook的大量照片,包括4030个人的440万张标记人脸,每个人具有800到1200张人脸图片。
  • LFW数据集:由5,749个名人的13,323张网络照片组成,这些照片在10个分组中分为6,000个人脸对。这是在无约束环境中进行人脸验证的基准数据集。
  • YouTube Faces(YTF)视频数据集:收集了3,425个1,595个主题的YouTube视频,分为5,000个视频对和10个分组,用于评估视频级人脸验证。

训练表示网络

我们首先使用一个基于gpu的引擎将SFC上的深度神经网络训练成一个多类分类问题,通过动量(设置为0.9)的随机梯度下降(SGD)在前馈网络上实现标准的反向传播。mini-batch=128,并将所有可训练层的平均学习率设置为0.01,当验证错误停止下降时,手动将学习率降低一个数量级,最终学习率为0.0001。我们在每一层初始化权重从零均值高斯分布和σ=0.01和偏见设置为0.5。我们对整个网络进行了大约15次扫描(epoch),耗时3天。最后提取了全连通层F7的响应作为人脸表示。


实现效果

我们以5%的SFC数据作为测试集,根据分类误差对DNN的不同设计方案进行了评价。从1.5K人到4.4k人,参与训练的人数越多分类效果越好;数据集样本数量越多误差越小,太少容易过拟合;网络层越深误差越小。

LFW上测试,无监督不如有监督性能好,集成学习性能更好,在LFW数据集达到了97.35%的准确度,将当时技术水平的误差减少了27%以上,接近人类水平的表现。

  • DeepFace-single:LFW图像与SFC训练数据集上用同一种处理方法,记为DeepFace-single。无监督的验证方法达到95.97%,直接比较归一化之后的特征对的内积。有监督的χ2-distance方法在5400对带标记的LFW人脸对上测试,达到了达到97%,都远远高于当时水平。
  • DeepFace-ensemble:集成效果,结合了多个训练的网络,通过将不同类型的输入输入到DNN(基于三维对齐的RGB输入的DeepFace-single;灰度图加上图像梯度大小和方向;2d对齐的RGB图像)。
    • 使用基于CPD核的非线性SVM来将这些距离度量结合起来,有限制97.15%:
  • 无监督(unrestricted)协议在训练集上为运算符提供有关恒等式的知识,因此,可以生成更多的训练对来添加到训练集中。通过微调孪生网络(共享)预先训练的特征提取器来学习验证指标过程中,有大量的训练数据过拟合。使用LFW训练数据生成的训练对是冗余的,因为它们是从大约9K张照片中生成的,不足以可靠地估计超过1.2亿个参数。所以我们收集了一个与SFC相同程序的附加数据集,包含额外的10万个新人物,每个人物有30个样本,可从中生成相同和不相同的对。然后我们在此基础上对孪生网络进行训练,然后在LFW无监督训练分割上进行两个训练阶段,以纠正一些数据集相关偏差。并将Siamese网络与上述网络结合起来,无监督97.25%:
  • 又额外增加了4个DeepFace-single到集成,每个都从零开始用不同的随机种子训练,无限制97.35%。
  • 另外仅使用二维对齐时,精度仅为94.3%。完全没有对齐,精度为87.9%,即采用中心裁剪的人脸检测的面部区域可能会脱落。没有学习,当只使用正面化和一个朴素的LBP/SVM组合时,准确率为91:4%。

TYF视频级人脸验证数据集上性能也好很多,ROC曲线上DeepFace在左上角,性能最好。我们通过为每对训练视频创建50对帧(每个视频一个帧)来直接使用DeepFace-Single表示,并根据视频训练对将这些帧标记为相同或不相同,然后训练网络。测试时,给出一个测试视频对后,从每段视频中随机选出100个视频帧对,将输出的结果取均值作为判断的依据。使用有监督weighted χ2验证。在YTF上91.4%,由于YTF库中有100个标注错误的视频对,经过改正后,达到了92.5%。这也证明我们的DeepFace方法,在其他领域也具有很好的泛化性能(视频人脸验证)。

计算速度:使用英特尔2.2GHz的单核心CPU,从原始输入像素中提取特征0.18秒,对齐要0.05秒。总的来说,DeepFace是每幅图像0.33秒,含图像解码、人脸检测与比对、前馈网络、最终分类输出。


参考资料

https://zhuanlan.zhihu.com/p/76513217
https://blog.csdn.net/stdcoutzyx/article/details/46776415