人脸检测与识别

人脸识别,必须先从视频或者图片中检测出人脸,然后才能进行下一步处理,得到一个特征向量与已知放在数据库中的人脸数据进行比较,输出预测结果,主要的步骤包括人脸检测与人脸识别,本文使用的人脸检测方法是使用Haar-like特征进行特征提取进行分类,人脸识别使用卷积神经网络抽取特征向量。

一、人脸检测

1 Haar-like 特征

Haar 特征分为四类:边缘特征、线特征、中心特征和对角线特征。Haar 特征值反映了图像的灰度变化情况,脸部比如眼睛、鼻子、嘴唇有明暗分别的部分。

不同的特征

特征值的计算:将黑色区域内的像素值的和减去白色像素的值的和。

以一个 24x24 的窗口为例,使用上面的(a)类特征矩形,宽高比为2:1,那么宽高可取的值为:1x2,1x4,…1x24;2x2,2x4,…2x24;…;24x24。使用不同的特征矩形在窗口中滑动得到一系列特征值,每种特征矩形产生的特征值的数量可由下面的公式计算出:

$$
XY(W+1-w\frac{X+1}{2} )(H+1-h\frac{Y+1}{2})
$$

其中 $W\times H$ 表示图片宽高,$w\times h$ 表示特征矩形的宽高,$X=\frac{W}{w},Y=\frac{H}{h}$ 表示缩放系数。

对于产生旋转的特征矩形,宽高会根据选择的角度变化:

旋转特征

新的计算公式为:

$$
XY(W+1-z\frac{X+1}{2} )(H+1-z\frac{Y+1}{2})
$$

其中 $z=w+h,X=\frac{W}{z},Y=\frac{H}{z}$

2 积分图

对于上面特征值的计算,每类矩阵的特征值数量都非常大,如果按照传统计算方法,计算量会非常大,积分图的使用可以明显的减少计算量。

积分图的每一点的值是原图中对应位置的左上角区域的所有值的和:

$$
I(x,y)=\sum_{x’\leq x \ y’\leq y}i(x’,y’)
$$

而且积分图可以只遍历一次就可以计算出来:

$$
I(x,y)=i(x,y)+I(x-1,y)+I(x,y-1)-I(x-1,y-1)
$$

得到积分图后,如果想要计算如下矩形区域所示像素值的和就可在常数时间内完成:

积分计算

$$
I=I(C)+I(A)-I(B)-I(D)
$$

而特征值为白色矩形减去黑色矩形的值,所以使用积分图可以减少许多计算量。

3 分类

在使用特征矩形通过积分图计算出一系列的特征值后,剩下的就需要通过训练,得出一个分类器可以根据特征值区分人脸和非人脸。

对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。

使用 Adaboost 算法,它包括两种权重:数据的权重、弱分类器的权重。数据的权重用于弱分类器寻找分类误差的最小的决策点,找到之后用这个最小误差计算弱分类器的权重,分类器权重越大说明该弱分类器在最终决策是拥有更大的发言权。

对于数据集 ${(x_1,y_1),(x_2,y_2),…(x_N,y_N)}$,$x_i$ 为上面求出的特征值为列向量,$y_i\in {+1,-1}$ 人脸或非人脸。

首先初始化样本权重:

$$
D_1=(w_{11},w_{12},…w_{1N}),w_{1i}=\frac{1}{N},i=1,2,…N
$$

对于 $m=1,2,…M$,重复一下步骤得到 $m$ 个弱分类器:

  1. 根据样本权重分布 $D_m$ 训练得到第 $m$ 个弱分类器:

$$
G_m(x):X\rightarrow {+1,-1}
$$

  1. 计算 $G_m(x)$ 在加权训练数据集上的分类误差率,$I()$ 为指示函数输出为1或0

$$
e_m=\sum_{i=1}^NP(G_m(x_i)\neq y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\neq y_i)
$$

  1. 计算 $G_m(x)$ 的系数

$$
a_m=\frac{1}{2}log\frac{1-e_m}{e_m}
$$

  1. 更新样本权重,其中 $Z_m=\sum_{i=1}^Nw_{mi}exp(-a_my_iG_m(x_i)),i=1,2,…N$

$$
w_{m+1,i}=\frac{w_mi}{Z_m}exp(-a_my_iG_m(x_i)),i=1,2,…N
$$

最终分类器为上述弱分类器的线性组合

$$
G(x)=sign(f(x))=sign(\sum_{i=1}^Ma_mG_m(x))
$$

二、人脸识别

人脸检测与人脸识别的区别是人脸检测需要将通过训练将具有脸部特征的图像识别出来,而人脸识别则是在检测出人脸的基础上对不同人面部特征进行分类。

1 训练过程

使用 LFW 人脸数据集,训练时需要输入三幅图像:一幅作为 anchor,另外两幅作为 positive 和 negative。包括同一个人的两张不同图片其他人的一张图片,训练的目地就是让同一类别样本的特征距离尽可能近,而不同类别样本的距离尽可能远离。而训练的目地就是让神经网络正确的抽取出特征向量,以满足识别要求。

loss的定义如下:

$$
l_{tri}=max(||x_a-x_p||-||x_a-x_n||+margin, 0)
$$

loss

2 网络结构

layer size-in size-out kernel params
convl 32x32x1 28x28x6 5x5x1 150
pool 28x28x6 14x14x6 3x3x6 0
conv2 14x14x6 10x10x16 5x5x6 2.4k
pool2 10x10x16 5x5x16 3x3x16 0
fc1 5x5x16 1x1x120 48k
fc2 1x1x120 1x1x84 10k
total 60.5k

使用LFW训练集,最高时的准确率为75%。

三、代码

Github