DeepFace知识点和想法笔记
DeepFace背景介绍
回顾
人脸识别技术发展非常迅速,微信支付、电脑解锁和智能门禁识别等地方随处可见。DeepFace是Facebook在2014年的CVPR上提出来的,后续出现的DeepID和FaceNet也都体现DeepFace的身影,可以说DeepFace是CNN在人脸识别的奠基之作,目前深度学习在人脸识别中也取得了非常好的效果。本次记录DeepFace算法学习知识点和心得笔记。
文章背景
此文章的写作背景是:人脸识别技术需要克服有约束、需要对图像进行多层卷积运算和大量数据集的条件。因此,此前许多的人脸识别技术结果并不理想,甚至低于人类识别水平。
本文提出了一个系统 DeepFace,它已经填补了最流行的无约束人脸识别基准中剩余的大部分差距,已经接近人类水平的准确性。它的训练对象是大量的人脸数据集,这些人脸数据来自于与构建评估基准的人群有很大差异的人群。
提出的系统与该领域的大多数贡献不同之处在于,它使用深度学习(DL)框架,适合处理大型训练集。特别是在人脸方面,学习过的网络能否成功地以稳健的方式捕捉面部外观高度依赖于非常快速的3D对齐步骤。该网络架构基于这样一个假设:一旦校准完成,每个面部区域的位置就固定在像素级别。因此从原始像素RGB值中学习是可能的,而不需要像在许多其他网络中那样应用几层卷积。
文章做出了以下贡献:
(1)开发了一种有效的深度神经网络(DNN)架构和学习方法,利用一个非常大的标记人脸数据集,以获得一个可以很好地推广到其他数据集的人脸表示;
(2)基于面部显式三维建模的有效面部对齐系统;
(3)显著提高野外标记面孔基准(LFW)的技术水平,接近人类性能;在YouTube Faces数据集(YTF)上实验,将错误率降低50%以上。
DeepFace内容综述
算法核心
DeepFace在进行人脸识别的过程中采用的是检测 → \to →对齐 → \to →提取 → \to →分类的过程。
算法基础和人脸检测
过去的20年里,当识别在持续控制(约束)环境下拍摄的静态图像中的正面人脸时,人脸识别错误率下降了3个数量级。许多供应商为边境控制和智能生物识别应用部署了复杂的系统。
然而,这些系统已经被证明对各种因素非常敏感,如光照、表情、遮挡和老化,这些因素大大降低了它们在这种不受限制的环境中识别人的性能。也就是说,有约束人脸识别是急需克服的难题。
上图分别是有约束识别和无约束识别的初始图片,可以看出考虑无约束环境中的问题:分辨率不太高,视角可以侧脸和旋转,光照任意,存在遮挡情况等。无约束对应的情况更加普遍,实用性更强!
在无约束区域,Huang et al. [16]输入LBP特征,与传统方法结合后改进算法。在本文的方法中,使用原始图像作为底层表示。
LBP特征
这里因为提到了LBP特征,所以简单补充一下其基本知识。
LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,由于LBP特征计算简单、效果较好,因此LBP特征在计算机视觉的许多领域都得到了广泛的应用。
LBP特征比较出名的应用是用在人脸识别和目标检测中,在计算机视觉开源库Opencv中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法。
由上图可以看出,原始的LBP算子定义在像素3
×
\times
× 3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3
×
\times
× 3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有28种可能,因此LBP值有256种。中心像素的LBP值反映了该像素周围区域的纹理信息。
由此可以得到:
LBP算子具有灰度不变性: 对整张图做不同的光照变化,都不会改变中心像素与邻域像素之间的相对像素的大小比较。
最后大概就将图片处理成这个样子:
DeepFace问世时最成功的系统是使用标记人脸的大型数据集采用了一种聪明的转移学习技术,将联合贝叶斯模型(Joint Bayesian model) 从一个包含2995个不同主题的99,773张图像的数据集中学习到LFW图像域。
联合贝叶斯(Joint Bayesian)模型
先看一下Joint Bayesian出现之前,业界广泛使用的经典Bayesian Face,算法描述如下:
两张人脸分别表示为
x
1
x_1
x1 和
x
2
x_2
x2 ,
H
I
H_I
HI 表示情况:两张人脸属于同一个人;
H
E
H_E
HE 表示两张人脸属于不同人。人脸检验就变成了验证在
Δ
=
x
1
−
x
2
\Delta= x_1-x_2
Δ=x1−x2 的情况下,
H
I
H_I
HI 和
H
E
H_E
HE 的概率大小。这样想是不是就和贝叶斯公式联系起来了?
也就是比较概率 P ( H I ∣ Δ ) P(H_I|\Delta) P(HI∣Δ) 和 P ( H E ∣ Δ ) P(H_E|\Delta) P(HE∣Δ) 的大小。
由贝叶斯公式可得:
P
(
H
I
∣
Δ
)
=
P
(
Δ
∣
H
I
)
×
P
(
H
I
)
P
(
Δ
)
P(H_I|\Delta) = \frac{P(\Delta|H_I) \times P(H_I)}{P(\Delta)}
P(HI∣Δ)=P(Δ)P(Δ∣HI)×P(HI)
P
(
H
E
∣
Δ
)
=
P
(
Δ
∣
H
E
)
×
P
(
H
E
)
P
(
Δ
)
P(H_E|\Delta) = \frac{P(\Delta|H_E) \times P(H_E)}{P(\Delta)}
P(HE∣Δ)=P(Δ)P(Δ∣HE)×P(HE)
可以由统计数据得到
P
(
Δ
)
、
P
(
H
I
∣
Δ
)
、
P
(
H
E
∣
Δ
)
、
P
(
H
I
)
、
P
(
H
E
)
P(\Delta)、P(H_I|\Delta)、P(H_E|\Delta)、P(H_I)、P(H_E)
P(Δ)、P(HI∣Δ)、P(HE∣Δ)、P(HI)、P(HE),因此将公式作比取对数可以得到:
r
(
x
1
,
x
2
)
=
l
o
g
(
P
(
Δ
∣
H
I
)
P
(
Δ
∣
H
E
)
)
r(x_1,x_2)= log(\frac{P(\Delta|H_I)}{P(\Delta|H_E))}
r(x1,x2)=log(P(Δ∣HE))P(Δ∣HI)
这样就能很直观的看出,当
P
(
Δ
∣
H
I
)
P(\Delta|H_I)
P(Δ∣HI) 大于
P
(
Δ
∣
H
E
)
P(\Delta|H_E)
P(Δ∣HE) 时,
r
(
x
1
,
x
2
)
r(x_1,x_2)
r(x1,x2) 大于0,即两张图片是同一个人的概率大。
但是经典bayesian从2维投射到1维时,会丧失一些分区信息,导致在2维平面上可分的目标,在1维平面上变得不可区分。
从上图中可以看到,2-D的数据通过差分
X
−
Y
X-Y
X−Y 映射到1-D上。O附近的点交错在一起, 使得在O附近的
C
l
a
s
s
1
Class 1
Class1和
C
l
a
s
s
2
Class 2
Class2无法区分开来。这就是经典Bayesian Face的缺陷。
针对经典Bayesian Face出现的问题,2012年提出Joint Bayesian方法。经典Bayesian Face研究对象是 Δ = x 1 − x 2 \Delta= x_1-x_2 Δ=x1−x2 ,而 Joint Bayesian将 x 1 x_1 x1 和 x 2 x_2 x2 联合建模,最后的问题就变成了比较 P ( x 1 , x 2 ∣ H I ) P(x_1,x_2|H_I) P(x1,x2∣HI) 和 P ( x 1 , x 2 ∣ H E ) P(x_1,x_2|H_E) P(x1,x2∣HE) 的大小。
人脸对齐
在无约束场景下的人脸对齐被认为是一个难题,因为它需要考虑许多因素,如姿势(由于人脸的非平面性)和非刚性表情,这些因素使得测试集很难与具有身份的面部形态解耦。最近的方法显示通过使用复杂的校准技术来补偿这些困难的成功方法。这些方法可以使用以下一种或多种方法:
(1).使用人脸的分析3D模型。
(2).从外部数据集中搜索相似的基准点配置。
(3).寻找像素相似性转换的无监督方法。
与许多对准文献内容相似,文章的对准方法是基于使用基准点探测器来指导对准过程。使用一个相对简单的基准点检测器,但将其应用于几次迭代以优化其输出。在每次迭代中,通过训练支持向量回归器(SVR)从图像描述符中预测点配置来提取基准点。图像描述符基于LBP直方图,但也可以考虑其他特征。通过使用诱导相似矩阵 T T T 将图像转换为新的图像。
2D人脸对齐
通过检测检测作物内的6个基点开始校准过程,以眼睛中心、鼻尖和嘴的位置为中心(下图中蓝色点的位置),如图所示。它们用于通过拟合
T
2
d
i
:
=
(
s
i
,
R
i
,
t
i
)
T_{2d}^{i} :=(s_i,R_i,t_i)
T2di:=(si,Ri,ti) 来近似缩放、旋转并将图像转换为6个锚点位置,其中
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] \ast x_{source}^j
xanchorj:=si[Ri∣ti]∗xsourcej 对于点
j
=
1...6
j = 1...6
j=1...6,在新的扭曲图像上迭代,直到没有实质性变化,最终组成最终的2D相似度变换:
T
2
d
:
=
T
2
d
1
∗
T
2
d
2
∗
.
.
.
∗
T
2
d
k
T_{2d}:=T_{2d}^1 \ast T_{2d}^2\ast...\ast T_{2d}^k
T2d:=T2d1∗T2d2∗...∗T2dk。
这里我理解为将“
∗
\ast
∗ ”记为新的特征空间上的矩阵乘法,这个聚合转换生成一个
2
D
2D
2D对齐作物,如上图所示。这种对准方法类似于
L
F
W
−
a
LFW-a
LFW−a中所使用的方法,该方法经常用于提高识别精度。然而,相似变换不能补偿平面外旋转,这在无约束条件下尤为重要。
3D人脸对齐
为了对齐经过平面外旋转的面,我们使用一个通用的3D形状模型和配准一个3D仿射相机,用于将2d对齐部分裁剪到3D形状的图像平面上。这将生成作物的3d对齐版本。
这是通过使用第二个SVR在2d对齐的裁剪中定位额外的67个基点
x
2
d
x_{2d}
x2d 来实现的。作为一个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参考点之间的完全对应,如下图所示。
然后使用一个
3
d
→
2
d
3d\to2d
3d→2d仿射相机
P
P
P 广义最小二乘解的线性系统
x
2
d
=
X
3
d
P
⃗
x_{2d}=X_{3d} \vec P
x2d=X3dP 与一个已知协方差矩阵
Σ
\Sigma
Σ 。
也就是说, P ⃗ \vec P P 最小化以下损失: L o s s ( P ⃗ ) = r T Σ − 1 r Loss(\vec P)=r^T\Sigma^{-1}r Loss(P)=rTΣ−1r,其中 r = ( x 2 d − X 3 d P ⃗ ) r = (x_{2d}−X_{3d}\vec P) r=(x2d−X3dP) 是残余向量,矩阵 X 3 d ( d i m : ( 67 ∗ 2 ) × 8 ) X_{3d} (dim:(67\ast2)\times8) X3d(dim:(67∗2)×8) 由 ( 2 × 8 ) (2×8) (2×8) 矩阵叠加生成,其结构为 ( x 3 d T ( i ) , 1 , 0 ⃗ 0 ⃗ , x 3 d T ( i ) , 1 ) {x_{3d}^T(i),1,\vec 0 \choose \vec 0,x_{3d}^T(i),1} (0,x3dT(i),1x3dT(i),1,0) ,其中 0 ⃗ \vec 0 0 表示一个四维元素全为0的行向量。大小为 2 × 4 2×4 2×4 的仿射摄像机 P P P 用8个未知数 P ⃗ \vec P P 的向量表示。
损失可以通过协方差矩阵
Σ
\Sigma
Σ 的
C
h
o
l
e
s
k
y
Cholesky
Cholesky 分解最小化,将问题转化为普通的最小二乘问题。由于人脸轮廓上的检测点往往噪声更大,因为它们的估计位置在很大程度上受相机角度的深度影响,因此我们使用由基点误差的估计协方差给出的
(
67
∗
2
)
×
(
67
∗
2
)
(67\ast2)×(67\ast2)
(67∗2)×(67∗2)协方差矩阵
Σ
\Sigma
Σ。
上图为安装的
3
d
→
2
d
3d\to2d
3d→2d相机(Camera)的三角能见度;较暗的三角形不太明显。最后由三维模型诱导的67个基点,指导分段仿射变换。
由于没有建模全透视投影和非刚性变形,因此建立的照相机(Camera) P P P 只是一个近似。为了减少这些重要的承载身份的因素对最终变形效果的破坏,我们在每个参考基准点 x 3 d x_{3d} x3d 的 x − y x-y x−y 分量上加上 r r r 中相应的残差,我们将其记为 x ^ 3 d \hat x_{3d} x^3d 。
这样的放松是合理的,目的是用较小的失真来扭曲二维图像的身份。如果没有它,人脸就会在3D中被扭曲成相同的形状,失去重要的辨别因素。最后,通过从
x
2
d
(
s
o
u
r
c
e
)
x_{2d}(source)
x2d(source) 到
x
^
3
d
(
t
a
r
g
e
t
)
\hat x_{3d}(target)
x^3d(target) 的分段仿射变换
T
T
T 实现正面化,由67个基点1派生的
D
e
l
a
u
n
a
y
Delaunay
Delaunay 三角剖分指导。
上图为最后的正面作物,这样和原图进行比较就能看出是正脸。右图为3D模型生成的∠45°新视图(本文未使用)。
总结一下:3D对齐技术可以将图像从2D空间,映射到3维空间,得到人脸特征3维空间的分布,进而可以得到人脸在2D空间下,各种角度的特征分布。
Recongnition任务中,正面照片的分辨效果最好,左图输出人脸的正面图片用来做识别的input,右图输出人脸在45度角下的2D图,用来展示3D对齐的在各个角度下的2D的输出样例。
人脸识别(表示)
通过一个大型的深层网络学习面部图像的一般表示(Representation)。将DNN训练成一个多分类的人脸识别任务,即对人脸图像的身份进行分类。
这里挂一张原文中的深度学习流程图,看得比较清晰~
3D对齐后将大小为 152
×
\times
× 152 像素的3d对齐的3通道(RGB)人脸图像放入具有32个大小为 11
×
\times
× 11
×
\times
× 3 的滤波器(filter)的卷积层(C1)。然后,生成的32个特征图被馈送到最大池化层(M2),该层对 3
×
\times
× 3 的邻域最大池化,步幅为2,每个通道分别执行。接下来是另一个卷积层(C3),它有16个大小为 9
×
\times
× 9
×
\times
× 16 的过滤器。这三层的目的是提取低级特征,如简单的边缘和纹理。
最大池层使卷积网络的输出对局部转换更加稳健。当应用于对齐的面部图像时,它们使网络对小的配准误差更健壮。然而,多个级别的池化会导致网络丢失详细的面部结构和微纹理的精确位置信息。因此,我们只对第一个卷积层应用最大池化。我们将这些第一层解释为前端自适应预处理阶段。
随后的层(L4、L5和L6)则是局部连接层(locally connected layers),就像卷积层一样,它们应用一个滤波器组,但特征图中的每个位置都学习一组不同的滤波器。由于对齐图像的不同区域具有不同的局部统计量,卷积的空间平稳性假设不成立。Local的意思是卷积核的参数不共享。LCN不同于卷积层,LCN每个点的卷积核都不一样。
例如,眼睛和眉毛之间的区域表现出非常不同的外观,与鼻子和嘴巴之间的区域相比,具有更高的辨别能力。换句话说,我们通过利用我们的输入图像是对齐的这一事实来定制DNN的架构。局部层的使用不会影响特征提取的计算负担,但会影响需要训练的参数数量。仅仅因为我们有一个大的标记数据集,我们可以负担三个大的本地连接层
使用局部连接层(没有权值共享)也可以通过这样一个事实来证明,即局部连接层的每个输出单元都受到输入的一个非常大的补丁的影响。例如,L6的输出受到输入端的74x74x3补丁的影响,在对齐面的这样大的补丁之间几乎没有任何统计上的共享。
最后,最上面的两层(F7和F8)是完全连接的:每个输出单元都连接到所有输入。这些层次能够捕捉到人脸图像远处部分特征之间的相关性,例如,眼睛的位置和形状,以及嘴的位置和形状。网络中第一个全连接层(F7)的输出将在本文中用作我们的原始人脸表示特征向量,F7的输出将用作原始人脸表示特征向量,4096维。在表示方面,这与文献中提出的现有基于 LBP 的表示形成对比,后者通常汇集非常局部的描述符(通过计算直方图),并将其用作分类器的输入。
F8上人脸表示被送到了 K-way Softmax 来产生在类别标签上的概率分布,用于分类。4030维,是因为SFC训练数据集有4030个人,每个人具有800到1200张人脸图片。
训练的目标是最大限度地提高正确类别(人脸id)的概率。最小化每个训练样本的交叉熵损失来实现,并使用随机梯度下降(SGD) 更新参数,使各参数的损失最小化。使用了ReLU激活。只对第一个全连接层应用了dropout,由于训练集较大,我们在训练过程中没有观察到明显的过拟合。
最后一个全连接层的输出被馈送到一个 K-way softmax (其中 K 是类的数量),它产生在类标签上的分布。如果我们用
o
k
o_k
ok 表示网络在给定输入上的第
k
k
k 个输出,那么分配给第
k
k
k 个类的概率就是 softmax 函数的输出:
p
k
=
e
x
p
(
o
k
)
/
∑
1
h
e
x
p
(
o
h
)
p_k = exp(o_k)/\sum_1^h exp(o_h)
pk=exp(ok)/1∑hexp(oh)人脸表示归一化:将人脸表示特征归一化为0到1之间,以降低对光照变化的敏感度。对于F7输出的4096维向量先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值;再对每个向量进行L2归一化。
人脸验证
在人脸识别领域,有监督方法比无监督方法表现出明显的性能优势。通过在目标域的训练集上进行训练,可以对特征向量(或分类器)进行微调,以在数据集的特定分布中更好地执行。在这项工作中,本文的目标是学习一个无监督度量,它可以很好地推广到多个数据集。本文的无监督相似度就是两个归一化特征向量的内积。此外,还对有监督的度量、χ2相似度和Siamese网络进行了实验。
卡方相似度
本文方法中的归一化DeepFace特征向量与基于直方图的特征有几个相似之处,如LBP:
(
1
)
.
(1).
(1). 包含非负值,
(
2
)
.
(2).
(2). 它非常稀疏,
(
3
)
.
(3).
(3). 它的值在[0,1]之间。
因此,类似于上述,使用加权的
χ
2
\chi^2
χ2 相似度:
χ
2
(
f
1
,
f
2
)
=
∑
i
w
i
(
f
1
[
i
]
−
f
2
[
i
]
)
2
/
(
f
1
[
i
]
−
f
2
[
i
]
)
\chi^2(f_1,f_2)= \sum_iw_i(f_1[i]-f_2[i])^2/(f_1[i]-f_2[i])
χ2(f1,f2)=i∑wi(f1[i]−f2[i])2/(f1[i]−f2[i])其中
f
1
f_1
f1 和
f
2
f_2
f2 是DeepFace表示。权重参数使用线性支持向量机学习,应用于元素的向量
(
f
1
[
i
]
−
f
2
[
i
]
)
2
/
(
f
1
[
i
]
+
f
2
[
i
]
)
(f_1[i]−f_2[i])^2/(f_1[i] + f_2[i])
(f1[i]−f2[i])2/(f1[i]+f2[i])。
Siamese网络
本文还测试了一种端到端度量学习方法,称为
S
i
a
m
e
s
e
Siamese
Siamese 网络:
一旦学习,人脸识别网络(没有顶层)复制两次(每个输入图像一次),并使用特征直接预测两张输入图像是否属于同一个人。这可以通过以下方式实现:
1.
1.
1. 取特征之间的绝对差异
2.
2.
2. 映射到单个逻辑单元(相同/不相同)的顶部完全连接层。
该网络的参数数量与原始网络大致相同,因为大部分参数在两个副本之间共享,但需要两倍的计算量。注意,为了防止人脸验证任务的过拟合,我们只对最顶层的两个层启用训练。
S
i
a
m
e
s
e
Siamese
Siamese 网络的诱导距离为:
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 为可训练的参数。通过标准交叉熵损失和误差的反向传播来训练
S
i
a
m
e
s
e
Siamese
Siamese 网络的参数。
上图为LFW数据集上的ROC曲线。
DeepFace算法原理总结
1. 1. 1. 人脸识别的流水线包括四个阶段:检测⇒对齐⇒表示⇒分类。
2. 2. 2. 3D人脸对齐:采用显式的3D人脸建模并应用分段仿射变换,并实现人脸正面化。DeepID和FaceNet并没有这种对齐,DeepID的解决方案是将一个人脸切成很多部分,每个部分都训练一个模型,然后模型聚合,FaceNet则是直接以数据量大和特殊的目标函数取胜。
3. 3. 3. 人脸表示(人脸识别):利用9层深度神经网络导出人脸表示,还使用了3个无权重共享的局部连接层。人脸表示特征向量是4096维,Softmax分类。开了先河,后面再也不用LBP了。
4.
4.
4. 人脸验证:无监督(两个向量的内积);有监督(卡方相似度或孪生网络)。
将基于模型的精确对齐与大型人脸数据库相结合的学习表示方法可以很好地推广到无约束环境下的人脸。
结语
DeepFace算法大致到这里就结束了,后续可能会对程序和实验内容以及其他文章进行补充,感谢各位垂阅~