DeepFace: Closing the Gap to Human-Level Performance in Face Verification
最早将深度学习用于人脸验证的开创性工作。Facebook AI实验室出品。动用了百万级的大规模数据库。典型的识别信号提特征+验证信号refine的两步走。
在现代人脸识别中,传统的管道包括四个阶段:检测⇒ 对齐⇒编码⇒ 分类
人脸检测的目的是寻找图片中人脸的位置。当发现有人脸出现在图片中时,不管这个脸是谁,都会标记出人脸的坐标信息,或者将人脸切割出来。
- 可以使用方向梯度直方图(HOG)来检测人脸位置。先将图片灰度化,接着计算图像中像素的梯度。通过将图像转变成HOG形式,就可以获得人脸位置。
人脸对齐是将不同角度的人脸图像对齐成同一种标准的形状。
- 先定位人脸上的特征点,然后通过几何变换(仿射、旋转、缩放),使各个特征点对齐(将眼睛、嘴等部位移到相同位置)。
人脸编码,人脸图像的像素值会被转换成紧凑且可判别的特征向量,这也被称为模板(template)。理想情况下,同一个主体的所有人脸都应该映射到相似的特征向量。
人脸匹配构建模块中,两个模板会进行比较,从而得到一个相似度分数,该分数给出了两者属于同一个主体的可能性。
为应用分段仿射变换,通过使用显式三维人脸建模重新讨论对齐步骤和表示步骤,并从九层深度神经网络中导出了人脸表示 。
深度网络涉及超过1.2亿个参数,使用多个locally connected layers,而不是标准的卷积层,没有权重共享。
使用数据集:包含400万张面部图像的身份标记数据集,属于4000多个身份。
将基于模型的精确对齐与大型人脸数据库相结合的学习表示,即使使用简单的分类器,也能很好地推广到无约束环境中的人脸。
DeepFace系统在无约束人脸识别现在已经接近人类水平的准确度。系统产生了极其紧凑的人脸表示,与2014年那个时间段的其他系统向成千上万的外观特征转变形成了鲜明对比。
人脸识别
人脸识别的目的就是要判断图片和视频(视频是由图片构成的)中人脸的身份是什么。人脸识别是身份识别的一种,它跟身份证识别、指纹识别、虹膜识别都是相似的。
人脸识别和其他身份识别相比,有4个特点:
- 便捷性。人脸是生物特征,不需要携带类似身份证的东西。
- 非强制性。识别的过程甚至不需要对象的配合,只要拍摄到人脸就可以进行识别,无感,但需要对信息的管控加强。
- 非接触性。不用和设备直接接触,相比指纹更加安全,疫情之下接触增大风险,陌生人之间接触可能也会有所不适。
- 并行处理。一张照片里有多个人脸时可以一起处理相对容易一些,不像指纹和虹膜的高效实现比较难,成本会提升。
人脸图像在现实世界中的呈现具有高度的可变性。所以人脸识别也是最有挑战性的生物识别方法之一,也是研究方向。
- 头部姿势
- 年龄,老化
- 遮挡
- 光照条件
- 人脸表情
机器学习阶段,人脸识别也经历了3个重要的阶段:
- 几何特征阶段
- 表象特征阶段
- 纹理特征阶段
- 基于高层特征的几何参数,包括面部器官的几何特性,如双眼间距、头宽、鼻高,和面部关键特征点的相对几何关系,如两眼角和鼻尖的距离比等
- 人脸关键点(特征点)的精确定位本身就是一个比较困难的问题,容易受到姿态和表情等变化的影响,从而导致特征很不稳定;直到现在,人脸特征点定位仍然是人脸算法最重要的一个研究方向。
- 同时提取到的几何特征过于简单,丢失了大量的图象鉴别信息,降低了不同人之间的可分性。所以基于几何特征的算法鲁棒性很差,总体识别准确率不高,不可能构建有实际应用价值的人脸识别系统。
- 从图象中抽取底层物理特征,典型的底层特征包括图象灰度特征、图象变换系数或滤波系数(如离散余弦变换、小波变换、Gabor 变换)、局部纹理描述 (如 LBP、HGPP、LGBP、HOG)等。表象原始特征的空间维数很高,不利于训练和识别;并且提取的原始特征大多是从精细描述的角度出发,保留了对识别不利的噪声干扰。因此需要进行进一步的特征降维,使鉴别信息得以集中。
- 基于子空间分析的方法也在人脸识别的研究中。子空间分析主要研究的是特征分析与分类算法,企图在提取到的人脸特征中,通过特征降维、变换等多种手段,提升特征的鉴别能力。从实际角度而言,基于传统机器学习算法的人脸识别通常会将基于表象特征和子空间分析的方法结合起来,共同提升人脸识别的性能。
深度学习阶段,算法的发展也同样经历了3个阶段:
从最开始的 VGG 网络到 Inception 网络再到 Resnet 网络,网络模型总体上呈现出更深,更宽的趋势。
旷视、商汤为代表的在学术公开竞赛中取得好成绩的这些厂商,开始发展实际业务为起点,通过不断扩大他们的实际数据集合,算法性能也在逐渐的提升。
进一步增加数据量以提升算法性能以外,与第一阶段相反,大家开始在不降低识别性能的基础上,研究网络的轻量化。轻量化的主要目的有两个,一个是提升算法的速度,甚至能够部署到移动端;另外一个就是便于硬件实现,从而将人脸识别算法直接做成一个硬件模块。
普遍的思路就是利用 CNN 网络建立的高维模型,直接从输入的人脸图像上提取有效的鉴别特征,直接计算余弦距离来进行人脸识别,算法结构趋同。
人脸识别的发展应当仍然分成上述两个方向,一个方向从有效挖掘海量人脸数据的角度出发,进一步提升模型性能;另外一个方向则是将人脸识别模型轻量化以便实现移动端部署或者做成一个芯片模组。
传统的机器学习方法,如支持向量机、主成分分析和线性判别分析,利用大量数据的能力有限,深度神经网络显示出更好的伸缩特性。
对于人脸,深度学习网络能否以稳健的方式成功捕获人脸外观在很大程度上取决于非常快速的3D对齐步骤。Deepface网络架构基于这样的假设:一旦完成对齐,每个面部区域的位置在像素级固定。可以从原始像素RGB值中学习,而无需像在许多其他网络中一样应用几层卷积。
本文主要工作
- 开发了一种有效的深层神经网络(DNN)体系结构和学习方法,利用一个非常大的标记人脸数据集,以获得能够很好地推广到其他数据集的人脸表示;
- 基于面部显式三维建模的有效面部对齐系统;
- 在LFW数据集中的标记人脸方面显著提高了技术水平,接近人类表现;数据集(YTF),将错误率降低了50%以上。
- 提供了一种新的体系结构,通过整合3D对齐、定制对齐输入的体系结构,进一步推动了这些网络可实现的极限,将网络扩展近两个数量级,并在非常大的标记数据集上训练网络后,演示一种简单的知识转移方法。
- 度量学习方法大量用于人脸验证,通常与任务特定目标结合使用
Face Alignment
几个人脸数据库的现有对齐版本(如LFW-a)通过提供标准化输入帮助改进识别算法 ,然而,在无约束场景中对齐人脸仍然被认为是一个困难的问题,必须考虑许多因素,例如姿势(由于人脸的非平面性)和非刚性表情,这些因素很难与具有身份的人脸形态学解耦。
已有的解决非约束情况下的人脸对齐问题
- 使用面部的三维分析模型
- 从外部数据集中搜索相似的基准点配置以进行推断
- 寻找像素相似性变换的无监督方法
虽然对齐被广泛采用,但在无约束人脸验证的背景下,目前还没有完整的物理正确的解决方案。
三维模型已不受欢迎,尤其是在无约束环境中。但是,由于人脸是3D对象,本论文认为只要操作正确,便是正确的选择。本文提出了一个系统,该系统包括基于fiducial points的人脸分析三维建模,用于将检测到的人脸裁剪扭曲为三维正面模式(正面化)。
本文的校准基于使用基准点检测器来指导校准过程。
- 使用一个相对简单的人工点检测器,但在多次迭代中应用它来优化其输出。
- 在每次迭代中,通过训练以从图像描述符预测点配置的支持向量回归器(SVR)提取基准点。
- 使用图像描述符基于LBP直方图,但也可以考虑其他特征。通过使用诱导相似矩阵T将图像转换为新图像,可以在新的特征空间上再次运行基准检测器并细化定位。
2D Alignment
通过检测检测裁剪内的6个基准点开始对齐过程,以眼睛中心、鼻尖和嘴的位置为中心。
Alignment pipeline.
(a)检测到的人脸,具有6个初始基准点;
(b)诱导的2D剪切目标图像;
© 67二维对齐裁剪上的基准点及其相应的Delaunay三角剖分,我们在轮廓上添加三角形以避免不连续;
(d)转换为二维对齐裁剪图像平面的参考三维形状;
(e)配备3D-2D摄像机的三角可视性;较暗的三角形不太可见;(w.r.t:with respect to的缩写,意思是关于、谈到、涉及等。)
(f)由3D模型诱导的67个基准点,用于指导分段仿射扭曲;
(g)最后的正面化的剪切图片;
(h)由三维模型生成的新视图(本文中未使用)。
通过拟合 T 2 d i : = ( s i , R i , t i ) T_{2d}^i:=(s_i,R_i,t_i) T2di:=(si,Ri,ti)将图像大致缩放、旋转和平移到六个定位点定位到图a中的位置,其中 x a n c h o r j : = s i [ R i ∣ t i ] ∗ x s o u r c e j x_{anchor}^j:=s_i[R_i|t_i]*x_{source}^j xanchorj:=si[Ri∣ti]∗xsourcej,表达式中j={1…6},然后经过在新扭曲的图像上迭代,直到没有实质性变化,最终构成最终的2D相似性变换: T 2 d : = T 2 d 1 ∗ . . ∗ T 2 d 6 T_{2d}:=T_{2d}^1*..*T_{2d}^6 T2d:=T2d1∗..∗T2d6。该聚合变换生成2D对齐裁剪得到图b。
这种对齐方法与LFW-a中采用的方法类似,LFW-a经常用于提高识别精度。然而,相似变换无法补偿平面外旋转,这在无约束条件下尤为重要。
3D Alignment
为了对齐进行平面外旋转的面,使用一个通用的三维形状模型并配备一个三维仿射摄影机,用于将二维对齐裁剪扭曲到三维形状的图像平面。 生成一个裁剪的三维对齐版本图g。
得到图g是通过再次使用SVR定位2D对齐裁剪图c中的额外67个基准点 x 2 d x_{2d} x2d来实现的。 (a second实际上又等于again.)
作为一个3D通用形状模型,我们只需从USF HUMAN-ID数据库中获取3D扫描的平均值,这些扫描经过后处理,表示为对齐的顶点 v i = ( x i , y i , z i ) i = 1 n v_i=(x_i,y_i,z_i)_{i=1}^n vi=(xi,yi,zi)i=1n。
在3D形状上手动放置67个定位点,并以这种方式实现67个检测基准点与其3D参考之间的完全对应。然后,使用已知协方差矩阵∑的线性系统 x 2 d = X 3 d P ^ x_{2d}=X_{3d}\hat{P} x2d=X3dP^的广义最小二乘解拟合仿射三维到二维摄像机P,即,使以下损失最小化的 P ^ \hat{P} P^:
l o s s ( P ^ ) = r T Σ − 1 r , 其 中 r = ( x 2 d − X 3 d P ^ ) loss(\hat{P})=r^T\varSigma^{-1}r,其中r=(x_{2d}-X_{3d}\hat{P}) loss(P^)=rTΣ−1r,其中r=(x2d−X3dP^)
r是残差向量, X 3 d X_{3d} X3d是一个(67*2)*8的矩阵,由2*8个矩阵 [ x 3 d T ( i ) , 1 , 0 , 0 , x 3 d T ( i ) , 1 ] [x_{3d}^T(i),1,0,0,x_{3d}^T(i),1] [x3dT(i),1,0,0,x3dT(i),1]堆叠而成,其中0表示每个参考基准点 x 3 d ( i ) x_{3d}(i) x3d(i)的四个零的行向量。
大小为2×4的仿射相机P由8个未知量的向量P表示。利用∑的Cholesky分解,将问题转化为普通最小二乘法,可使损失最小化。
- 当 A 是一个SPD (real Symmetric positive definite matrix)的时候, A = A T , x T A x > 0 ( x ≠ 0 ) A=A^T,x^TAx>0(x\neq0) A=AT,xTAx>0(x=0),就可以分解成 lower triangle 矩阵 L 和它的转置也就是 upper triangle L T L^T LT.
- 当A正定时,由 A = L L T A=LL^T A=LLT.使用 Cholesky分解 会比 LU分解 更加高效,更加数值稳定。
如,由于面部轮廓上的检测点往往更嘈杂,因为它们的估计位置在很大程度上受相对于相机角度的深度的影响,因此我们使用(67∗ 2)×(67∗ 2) 协方差矩阵∑由基准点误差的估计协方差给出。
Frontalization
- 由于未对全透视投影和非刚性变形进行建模,因此配套相机P仅为近似值。 为了减少这些重要的身份承载因素对最终扭曲的破坏,我们将r中相应的残差添加到每个参考基准点 x 3 d x_{3d} x3d的x-y分量中,我们将其表示为 x 3 d ~ \widetilde{x_{3d}} x3d 。
- 这种松弛对于扭曲2D图像的目的来说是合理的,对身份的扭曲较小。 如果没有它,人脸将在3D中warping成相同的形状,失去重要的辨别因素。
- 最后,在67个基准点导出的Delaunay三角剖分的指导下,通过从 x 2 d x_{2d} x2d(源)到 x 3 d ~ \widetilde{x_{3d}} x3d (目标)的分段仿射变换T实现正面化。
- 对于相机P来说,不可见的三角形可以使用图像与对称三角形的混合来替换。
Representation
描述符在应用于人脸识别时,大多对人脸图像中的所有位置使用相同的算子。
随着越来越多的数据可用,基于学习的方法开始优于工程特性,因为学习方法可以发现和优化特定任务的特性。
通过一个大的深层网络学习面部图像的一般表示。
DNN Architecture and Training
对DNN进行多类人脸识别任务的训练,即对人脸图像的身份进行分类。
单个卷积池的前端,在整流输入端上进行卷积滤波,然后是三个局部连接层和两个完全连接层。颜色说明在每个图层上生成的要素贴图。网络包括超过1.2亿个参数,其中95%以上来自本地和完全连接的层。
- 尺寸为152×152像素的三维对齐3通道(RGB)人脸图像被提供给卷积层(C1),卷积层(C1)具有尺寸为11x11x3的32个滤波器(我们用32x11x11x3@152x152).
- 将生成的32个特征图送至最大池层(M2),该层以2的跨步分别为每个通道获取3x3个空间邻域的最大值。
- 另一个卷积层(C3),它有16个大小为9x9x16的滤波器。
- 这三层的目的是提取底层特征,如简单的边缘和纹理。 最大池层使卷积网络的输出对本地转换更加健壮。当应用于对齐的人脸图像时,它们使网络对小的配准错误更加鲁棒。
- 然而,多个级别的共享将导致网络丢失有关详细面部结构和微观纹理的精确位置的信息。 因此,这篇论文仅将最大池应用于第一个卷积层。将这些第一层解释为前端自适应预处理阶段。 虽然负责大部分的计算,但持有参数很少。这些层只是将输入扩展为一组简单的局部特征。
随后的层(L4、L5和L6)是局部连接的,就像卷积层一样,它们应用过滤器组,但特征图中的每个位置都学习一组不同的过滤器。由于对齐图像的不同区域具有不同的局部统计信息,卷积的空间平稳性假设无法成立。
如,眼睛和眉毛之间的区域显示出非常不同的外观,并且与鼻子和嘴之间的区域相比具有更高的辨别能力。换句话说,通过利用输入图像对齐的事实来定制DNN的体系结构。
使用局部层不会影响特征提取的计算负担,但会影响需要训练的参数数量。
- 如,L6的输出受输入端的74x74x3面片的影响,对齐面中如此大的面片之间几乎没有任何统计共享。
最后,上面两层(F7和F8)完全连接:每个输出单元连接到所有输入。这些层能够捕获在面部图像的遥远部分捕获的特征之间的相关性,例如眼睛的位置和形状以及嘴的位置和形状。
- 网络中第一个完全连接层(F7)的输出将用作本文中的原始人脸表示特征向量。
- 在表示方面,这与文献中提出的现有基于LBP的表示形成对比,LBP通常汇集非常局部的描述符(通过计算直方图),并将其用作分类器的输入。
最后一个完全连接的层的输出被送到K-way softmax(其中K是类的数量),其在类标签上产生分布。
- 用 o k o_k ok表示给输入网络的第k个输出,则分配给第k类的概率是softmax的输出: p k = e o k ∑ h e h p_k=\frac{e^{o_k}}{\sum_he_h} pk=∑heheok。
训练的目标是最大限度地提高正确类别的概率(face id)。通过最小化每个训练样本的交叉熵损失来实现这一点。
如果k是给定输入的真实标签的索引,则损失为: L = − l o g ( p k ) L=-log(p_k) L=−log(pk)。
通过计算L关于参数的梯度,并通过使用**随机梯度下降(SGD)**更新参数,使损失最小化。通过误差的标准反向传播计算梯度。
- 随机梯度下降(SGD)是一种简单但非常有效的方法,多用用于支持向量机、逻辑回归等凸损失函数下的线性分类器的学习。并且SGD已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。
如何理解随机梯度下降(stochastic gradient descent,SGD)? - 知乎 (zhihu.com){原文整体很好,但有点与我不和地方,已经自调整}
大多机器学习或深度学习算法都涉及某种形式的优化。 优化指的是改变x以最小化或最大化某函数 f ( x ) f(x) f(x)的任务。 通常以最小化 f ( x ) f(x) f(x)指代大多数最优化问题。 最大化可经由最小化算法最小化 − f ( x ) -f(x) −f(x) 来实现。
把要最小化或最大化的函数称为目标函数或准则。 当对其进行最小化时,也把它称为代价函数、损失函数或误差函数。
假设一个损失函数 J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ) − y ) 2 J(\theta)=\frac{1}{2}\sum_{i=1}^m{(h_{\theta}(x)-y)^2} J(θ)=21∑i=1m(hθ(x)−y)2其中 h θ ( x ) = θ 0 + θ 1 ∗ x 1 + . . + θ n ∗ x n h_{\theta}(x)=\theta_0+\theta_1*x_1+..+\theta_n*x_n hθ(x)=θ0+θ1∗x1+..+θn∗xn,求最小值。
求这个函数最小值按道理可以求导,然后导数等于0求解。这样求导方式太难求解,然后在高维的时候,可能不可解,但机器学习或深度学习中,很多都是超高维的,所以也一般不用那种方法。总之,梯度下降是另一种优化的不错方式,比直接求导好很多。
梯度下降:曲面上方向导数的最大值的方向就代表了梯度的方向,因此在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解。这个 θ j \theta_j θj的更新过程可以描述为:
θ j = θ j − α ⋅ ∂ J ( θ ) ∂ θ j [ α 表 示 的 是 步 长 或 者 说 是 学 习 率 ( l e a r n i n g r a t e ) ] ∂ J ( θ ) ∂ θ j = ∂ 1 2 ( h θ ( x ) − y ) 2 ∂ θ j = 2 ⋅ 1 2 ( h θ ( x ) − y ) ⋅ ∂ ( h θ ( x ) − y ) ∂ θ j = ( h θ ( x ) − y ) ⋅ ∂ ( ∑ i = 0 n ( θ i ⋅ x i − y ) ) ∂ θ j = ( h θ ( x ) − y ) ⋅ x i \theta_j=\theta_j-\alpha·\frac{\partial{J(\theta)}}{\partial{\theta_j}}[\alpha表示的是步长或者说是学习率(learning rate)]\\ \frac{\partial{J(\theta)}}{\partial{\theta_j}}=\frac{\partial{\frac{1}{2}(h_{\theta}(x)-y)^2}}{\partial{\theta_j}}\\ =2·\frac{1}{2}(h_{\theta}(x)-y)·\frac{\partial{(h_{\theta}(x)-y)}}{\partial{\theta_j}}\\ =(h_{\theta}(x)-y)·\frac{\partial{(\sum_{i=0}^{n}(\theta_i·x_i-y))}}{\partial{\theta_j}}\\ =(h_{\theta}(x)-y)·x_i θj=θj−α⋅∂θj∂J(θ)[α表示的是步长或者说是学习率(learningrate)]∂θj∂J(θ)=∂θj∂21(hθ(x)−y)2=2⋅21(hθ(x)−y)⋅∂θj∂(hθ(x)−y)=(hθ(x)−y)⋅∂θj∂(∑i=0n(θi⋅xi−y))=(hθ(x)−y)⋅xi
在直观上,可以这样理解,看下图,一开始的时候随机取一个点,把看成一座山,每一步,都以下降最多的路线来下山,那么,在这个过程中到达山底(最优点)是最快的,而上面的 α \alpha α,它决定了“向下山走”时每一步的大小,过小的话收敛太慢,过大的话可能错过最小值。这是一种很自然的算法,每一步总是寻找使J下降最“陡”的方向(就像找最快下山的路一样)。
从数学的角度,先想在低维的时候,比如二维,要找到最小值,具体化到一元函数中时,梯度方向首先是沿着曲线的切线的,然后取切线向上增长的方向为梯度方向,二元或者多元函数中,梯度向量为函数值f对每个变量的导数,该向量的方向就是梯度的方向,当然向量的大小也就是梯度的大小。现在假设我们要求函数的最值,采用梯度下降法,结合如图所示:
- 假设函数是 y = x 2 + 1 y=x^2+1 y=x2+1 ,对x求导,得到 y ′ = 2 x y'=2x y′=2x,然后用梯度下降的方式,如果初始值是(0的左边)负值,那么这是导数也是负值,用梯度下降的公式,使得 y ′ y' y′更加的靠近0,如果是正值的时候同理。注意:这里的梯度也就是一元函数的导数,高维的可以直接类推之。
梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。
批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。当样本数目 m 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
θ j : = θ j + α ⋅ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j+\alpha·\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θj+α⋅m1i=1∑m(hθ(x(i))−y(i))xj(i)
随机梯度下降:在每次更新时用一个样本,随机是用样本中的一个例子来近似所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,**对于最优化问题,凸问题,**虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是可以接受的,所以这个方法用的也比上面的多。其更新公式:
L o o p { f o r i = 1 t o m { θ j : = θ j + α ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) ( f o r e v e r y j ) } } Loop\{\\ for\space i=1\space to\space m\{\\ \theta_j:=\theta_j+\alpha(y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)}\space (for\space every\space j)\\ \}\\ \} Loop{for i=1 to m{θj:=θj+α(y(i)−hθ(x(i)))xj(i) (for every j)}}
随机梯度下降一般来说效率高,收敛到的路线曲折,但一般得到的解是我们能够接受的,在深度学习中,用的比较多的是mini-batch梯度下降。
- 由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
- 准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。可能会收敛到局部最优
- 不易于并行实现。
mini-batch梯度下降:在每次更新时用b个样本,其实批量的梯度下降就是一种折中的方法,用了一些小样本来近似全部的,其本质就是一个指不定不太准,那我用个多个样本那比随机的要准不少了吧,而且批量的话还是非常可以反映样本的一个分布情况的。在深度学习中,这种方法用的是最多的,因为这个方法收敛也不会很慢,收敛的局部最优也是更多的可以接受!
- L o o p { f o r i = 1 t o m { θ j : = θ j + α ⋅ 1 b ∑ k = i i + b − 1 ( h θ ( x ( k ) ) − y ( k ) ) x j ( k ) [ 其 中 j ∈ ( 0 : n ) ] i + = b } } Loop\{\\ for\space i=1\space to\space m\{\\ \theta_j:=\theta_j+\alpha·\frac{1}{b}\sum_{k=i}^{i+b-1}(h_{\theta}(x^{(k)})-y^{(k)})x_j^{(k)}[其中j\in(0:n)]\\ i+=b\\ \}\\ \} Loop{for i=1 to m{θj:=θj+α⋅b1k=i∑i+b−1(hθ(x(k))−y(k))xj(k)[其中j∈(0:n)]i+=b}}
通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。可实现并行化。
每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
batch_size的不当选择可能会带来一些问题。梯度下降、随机梯度下降与批梯度下降算法之间的比较 - 知乎 (zhihu.com)
在合理地范围内,增大batch_size的好处:
内存利用率提高了,大矩阵乘法的并行化效率提高。
跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大batch_size的坏处:
内存利用率提高了,但是内存容量可能撑不住了。
跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
各种梯度下降进行对比
在鞍点情况下的梯度下降
该网络产生的特征的一个有趣特性是非常稀疏。平均而言,最顶层中75%的要素组件完全为零。 这主要是由于使用了ReLU激活功能: m a x ( 0 , x ) max(0,x) max(0,x)。这种软阈值非线性在每次卷积、局部连接和完全连接层(最后一层除外)后应用,使得整个级联产生高度非线性和稀疏特征。
稀疏性还受到一种称为**“dropout”的正则化方法**的增强,该方法在训练期间将随机特征组件设置为0。
给定图像I,然后使用所述前馈网络计算表示G(I)。 任何具有L层的前馈神经网络都可以看作是函数 g ϕ l g_{\phi}^l gϕl的组合 。representation的表达式为: G ( I ) = g ϕ F 7 ( g ϕ L 6 ( . . g ϕ C 1 ( T ( I , θ T ) ) . . ) ) G(I)=g_{\phi}^{F_7}(g_{\phi}^{L_6}(..g_{\phi}^{C_1}(T(I,\theta_T))..)) G(I)=gϕF7(gϕL6(..gϕC1(T(I,θT))..))。网络参数 ϕ = C 1 , . . , F 7 {\phi}={C_1,..,F_7} ϕ=C1,..,F7和 θ T = x 2 d , P ^ , r ^ θ_T={x_{2d},\hat{P},\hat{r}} θT=x2d,P^,r^可查看网络结构图。
Normaliaztion
- 作为最后阶段,将特征归一化为0到1之间,以降低对光照变化的敏感性:特征向量的每个分量除以其在整个训练集中的最大值。
- 然后是L2规范化: f ( I ) : = G ˉ ( I ) ∣ ∣ G ˉ ( I ) ∣ ∣ 2 f(I):=\frac{\bar{G}(I)}{||\bar{G}(I)||_2} f(I):=∣∣Gˉ(I)∣∣2Gˉ(I),其中 G ˉ ( I ) i = G ( I ) i m a x ( G i , ε ) \bar{G}(I)_i=\frac{G(I)_i}{max(G_i,\varepsilon)} Gˉ(I)i=max(Gi,ε)G(I)i。 采用了ReLU激活,系统对图像强度的重新缩放并不是不变的。 如果DNN中没有偏差,完全相同的变化是可以实现的。
Verification Metric
- 在无约束人脸识别领域,验证两个输入实例是否属于同一类(身份)已经得到了广泛的研究,有监督的方法比无监督的方法表现出明显的性能优势。
- 通过在目标域的训练集上进行训练,可以精确调整特征向量(或分类器),以便在数据集的特定分布中表现得更好。
- 不同领域分布中的训练和测试会严重影响性能,需要进一步调整表示(或分类器),以提高其泛化和性能。
- 将模型拟合到相对较小的数据集会降低其对其他数据集的泛化。这项工作目标是学习一种能够很好地推广到多个数据集的无监督度量。 这篇论文的无监督相似性只是两个标准化特征向量之间的内积。还试验了监督度量、χ2相似性和Siamese network。
Weighted χ2 distance
- 归一化的DeepFace特征向量与基于直方图的特征有一些相似之处,例如LBP:
- 它包含非负值,非常稀疏, 其值介于[0,1]之间。
- 与LBP相似,使用加权-χ2相似性: χ 2 = ( f 1 , f 2 ) = ∑ i w i ( f 1 [ i ] − f 2 [ i ] ) 2 f 1 [ i ] + f 2 [ i ] χ^2=(f_1,f_2)=\sum_i\frac{w_i(f_1[i]-f_2[i])^2}{f_1[i]+f_2[i]} χ2=(f1,f2)=∑if1[i]+f2[i]wi(f1[i]−f2[i])2其中 f 1 f_1 f1和 f 2 f_2 f2都是deepface表示。使用线性支持向量机学习权重参数,应用于元素向量 ( f 1 [ i ] − f 2 [ i ] ) 2 f 1 [ i ] + f 2 [ i ] \frac{(f_1[i]-f_2[i])^2}{f_1[i]+f_2[i]} f1[i]+f2[i](f1[i]−f2[i])2。
Siamese network
- 一种端到端的度量学习方法,称为Siamese network,一旦学习,人脸识别网络(没有顶层)将复制两次(每个输入图像一个),并使用特征直接预测两个输入图像是否属于同一个人。
- 通过以下方式实现的:a)获取特征之间的绝对差异,b)映射到单个物流单元(相同/不相同)的顶部完全连接层。该网络的参数数量与原始网络大致相同,因为大部分参数在两个副本之间共享,但需要两倍的计算。
- 为了防止人脸验证任务中的过度拟合,仅为最顶层的两个层启用训练。
- Siamese network 的感应距离为: d ( f 1 , f 2 ) = ∑ i α i ∣ f 1 [ i ] = f 2 [ i ] ∣ d(f_1,f_2)=\sum_i\alpha_i|f_1[i]=f_2[i]| d(f1,f2)=∑iαi∣f1[i]=f2[i]∣,其中 α i \alpha_i αi是可训练参数,Siamese network的参数通过标准交叉熵损失和误差反向传播进行训练。
Experiments
- 通过学习在线收集的大规模标记人脸数据集上的人脸表示来评估建议的DeepFace系统。在本节中,首先介绍实验中使用的数据集,然后介绍与最新技术的详细评估和比较,以及一些关于学习和转移深面部表征的见解和发现。
Datasets
The proposed face representation是从Facebook的大量照片中学习的,称为社交人脸分类(SFC)数据集。
- SFC数据集包括来自4030人的440万张贴有标签的脸,每个人有800到1200张脸,其中每个身份的最新5%的脸图像被排除在测试之外(这是根据图像的时间戳进行的,以便通过老化模拟连续识别)。
- 每个人拥有大量的图像为学习人脸识别核心问题所需的不变性提供了一个独特的机会。
- 已经使用几种自动方法验证了用于训练的身份与下列数据集中的任何身份都不相交,方法是检查其名称标签。
将表示应用于the Labeled Faces in the Wild database (LFW)中的标记人脸,该数据库是无约束环境中人脸验证的事实基准数据集。
由5749位名人的13323张网络照片组成,这些照片分为10个部分,共6000张脸对。
性能通过使用平均识别精度来衡量
- 受限协议,训练中只有相同和不相同的标签可用;
- 无限制协议,在训练中可以访问额外的训练对;
- 在无监督的环境中,不对LFW图像进行任何训练。
YouTube人脸(YTF)数据集,该数据集的建模类似于LFW,但侧重于视频剪辑。
- 收集了1595个主题(LFW中名人的子集)的3425个YouTube视频。这些视频分为5000个视频对和10个分割,用于评估视频级别的人脸验证。
Training on the SFC
-
首先使用基于GPU的引擎在SFC上将深度神经网络训练为多类分类问题,通过动量随机梯度下降(SGD)(设置为0.9)在前馈网络上实现标准反向传播。
-
小批量大小为128,已将所有可训练层的同等学习率设置为0.01,这是手动降低的,每次验证误差停止减小后,都会降低一个数量级,最终速率为0.0001。
-
根据σ=0.01的零均值高斯分布初始化每层中的权重,并将偏差设置为0.5。对整个网络进行了大约15次扫描的训练,共花了3天时间。
-
以5%的SFC数据作为测试集,根据分类误差评估了DNN的不同设计选择。 这验证了使用大规模人脸数据集和深层架构的必要性。首先通过使用SFC中的人员子集来改变训练/测试数据集的大小。 使用大小为1.5K、3K和4K人的子集(分别为1.5M、3.3M和4.4M的面)。
- 使用网络架构,训练了三个网络,分别表示为DF-1.5K、DF-3.3K和DF-4.4K。分类误差仅从1.5K人的7.0%略微增长到3K人分类时的7.2%,这表明网络的容量能够很好地适应3M训练图像的规模。
- 比较SFC 关于训练数据集大小和网络深度的分类错误。对于4K用户和4.4M图像,错误率上升到8.7%,表明网络可以轻松扩展到更多用户。
- 还将SFC的全球样本数量分别更改为10%、20%、50%,将身份号保留在适当位置,由DF10%、DF-20%、DF-50%表示。观察到测试误差上升到20.7%,这是因为在减少的训练集上进行了过度拟合。由于4M图像的性能不会饱和,这表明网络将受益于更大的数据集。
- 还通过切断C3层、两个本地L4和L5层或所有这三个层(分别称为DF-sub1、DF-sub2和DFsub3)来改变网络的深度。 在使用4.4M面训练此类网络时,分类误差在几个时期后停止下降,并保持在比深度网络更高的水平。
- 如,DFsub3中只保留了四个可训练层,与上文网络图中所建议网络的9个层相比,DFsub3是一个相当浅的结构。
- 这验证了在大型人脸数据集上进行训练时网络深度的必要性。
Results on the LFW dataset
由于LFW中的老化效应、较大的照明和面部姿势变化,在一些非常困难的情况下,对最先进技术的任何改进都是非常显著的,系统必须由高度优化的模块组成。 任何进展现在都需要大量努力来减少最先进方法的错误数量。
DeepFace将基于前馈的大型模型与精细3D对齐相结合。关于每个组成部分的重要性:
- 无正面化:仅使用二维对齐时,获得的精度“仅”94.3%。如果完全没有对齐,即使用人脸检测的中心裁剪,准确率为87.9%,因为部分面部区域可能会从裁剪中脱落。
- 无学习:当仅使用那个阶段前沿和简单的LBP/SVM组合时,准确率为91.4%,考虑到此类分类器的简单性,这一点已经非常显著。
所有LFW图像在用在SFC数据集上进行训练的同一管道中进行处理,表示为DeepFace-single。 为了单独评估人脸表征的辨别能力,采用无监督设置直接比较一对归一化特征的内积。 这达到了95.92%的平均精度,这几乎是与那个时间段通过监督转移学习所达到的最佳性能相一致的。
按照受限协议,在χ2距离向量的基础上学习一个SVM核(C=1),即每个分割只有5400对标签可用于SVM训练。这实现了97.00%的准确度。
- 与LFW数据集上的那个时间段表现比较好的技术进行比较。
Ensembles of DNNs
通过向DNN送入不同类型的输入来训练的多个网络组合起来(数据增强)
- 基于3D对齐RGB输入的上述网络DeepFace single;
- 灰度图像加上图像梯度的大小和方向;
- 2D对齐RGB图像。
使用非线性SVM(C=1)和简单的幂CPD核组合这些距离:
K C o m b i n e d : = K s i n g l e + K g r a d i e n t + K a l i g n 2 d , 其 中 K ( x , y ) : = − ∣ ∣ x − y ∣ ∣ 2 K_{Combined}:=K_{single}+K_{gradient}+K_{align2d},其中K(x,y):=-||x-y||_2 KCombined:=Ksingle+Kgradient+Kalign2d,其中K(x,y):=−∣∣x−y∣∣2
根据受限协议,准确率达到97.15%。
无限制协议为操作员提供了有关训练集中身份的知识,因此能够生成更多的训练对以添加到训练集中。 进一步实验训练Siamese Network ,通过Siamese Network (共享)预训练的特征提取器来学习验证度量。 按照此过程,观察到训练数据存在严重的过度拟合。
- 使用LFW训练数据生成的训练对是冗余的,因为它们是从大约9K张照片中生成的,这些照片不足以可靠地估计超过120M的参数。
- 为了解决这些问题,按照与SFC相同的流程收集了一个额外的数据集,其中包含额外的100K个新身份,每个数据集仅包含30个样本,用于生成相同和不相同的对。 然后,在其上训练Siamese Network,然后在LFW无限制训练分割上进行2次训练,以纠正一些依赖于数据集的偏差。
- 将Siamese Network 合并到上述合奏中, K C o m b i n e d + = K S i a m e s e K_{Combined}+=K_{Siamese} KCombined+=KSiamese在无限制协议下,准确率为97.25%。
- 通过向集合中添加四个额外的DeepFace-single网络,每个网络使用不同的随机数从头开始训练, K C o m b i n e d + = ∑ K D e e p F a c e − S i n g l e K_{Combined}+=\sum{K_{DeepFace-Single}} KCombined+=∑KDeepFace−Single。获得了97.35%的准确度。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-imNN4Uc4-1642066230097)(C:/Users/23105/AppData/Roaming/Typora/typora-user-images/image-20220113105313535.png)]
- 各种DeepFace-single网络和组合Siamese Network的性能。
各种方法关于平均精度和ROC曲线,包括裁剪人脸的人类表现。所提出的DeepFace方法提高了最新技术水平,在人脸验证中接近人类的表现。与LFW数据集上的最新技术进行比较。
Results on the YTF dataset
- 在视频级人脸验证数据集上进一步验证了DeepFace。YouTube视频帧的图像质量通常比web照片差,主要是由于运动模糊或观看距离。
- 通过为每对训练视频创建50对帧(每个视频一对帧),直接使用DeepFace-single表示,并根据视频训练对将这些帧标记为相同或不相同。
- 然后学习加权χ2模型,给定一个测试对,从每个视频中随机抽取100对帧,并使用学习到的加权相似性的平均值。
Computational efficiency
- 高效地实现了一个基于CPU的前馈运算符,它利用CPU的单指令多数据(SIMD)指令及其缓存,利用内核和映像中浮点计算的局部性。
- 使用单核Intel 2.2GHz CPU,操作需要0.18秒从原始输入像素中提取特征。采用高效的warping技术进行校准;仅对准一次大约需要0.05秒。总的来说,DeepFace以每幅图像0.33秒的速度运行,包括图像解码、人脸检测和对齐、前馈网络和最终分类输出。
Conclusion
- 一个理想的人脸分类器能够准确地识别出只有人类才能匹配的人脸。 底层人脸描述符需要对姿势、照明、表情和图像质量保持不变。它也应该具有通用性的,因为它可以应用于各种人群,只要稍加修改(如果有的话)。此外,短描述符更可取,如果可能,稀疏特征也更可取。
- 快速计算时间也是一个问题。这项工作与最近使用更多功能和使用更强大的度量学习技术的趋势不同,它解决了这一挑战,填补了绝大多数性能差距。
- 将基于三维模型的对准与大容量前馈模型相结合可以有效地从许多示例中学习,以克服以前方法的缺点和局限性。在人脸识别方面表现出显著改善的能力,证明了这种耦合在其他视觉领域也具有重要的潜力。
拓展
-
人脸识别算法发展
-
人脸识别数据库