【人脸识别】DeepFace: Closing the Gap to Human-Level Performance in Face Verification

人脸识别的一般流程是:detect -> aligh -> verification-> classify

Face detection, 对图像中的人脸进行检测,并将结果用矩形框框出来。

Face alignment,对检测到的人脸进行姿态的校正。

Face verification,人脸校验是基于pair matching的方式,所以它得到的答案是“是”或者“不是”。在具体操作的时候,给定一张测试图片,然后挨个进行pair matching,matching上了则说明测试图像与该张匹配上的人脸为同一个人的人脸。

Face identification或Face recognition:解决who am I?

Facebook的deepface应该是第一篇使用CNN使得识别水平接近人类的方法(非第一个使用CNN用于face recognition),所以先从精读这篇文章开始理解用CNN实现Face recongnition。

Face alignment分为如下几步:

a. 人脸检测,使用6个基点
b. 二维剪切,将人脸部分裁剪出来
c. 67个基点,然后Delaunay三角化,在轮廓处添加三角形来避免不连续
d. 将三角化后的人脸转换成3D形状
e. 三角化后的人脸变为有深度的3D三角网
f. 将三角网做偏转,使人脸的正面朝前。
g. 最后放正的人脸
h. 一个新角度的人脸(在论文中没有用到)

总体上说,这一步的作用就是使用3D模型来将人脸对齐,从而使CNN发挥最大的效果。

Deepface总体架构:

前三层的目的在于提取低层次的特征,比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的Max-pooling层,避免网络损失图像信息。

后面三层都是使用参数不共享的卷积核。

全连接层将上一层的每个单元和本层的所有单元相连,用来捕捉人脸图像不同位置的特征之间的相关性。其中,第7层(4096-d)被用来表示人脸。全连接层的输出可以用于Softmax的输入,Softmax层用于分类。

对于输出的4096-d向量:先每一维进行归一化,再进行L2归一化。

最后用CNN提取的特征进行Verification Metric ,Verifying whether two input instances belong to the same class (identity) or not 包括卡方距离学习和siamese network两种方法。Verification的loss function在之后有L-softmax,A-softmax等。

这篇14年的文章写的很虚,很多实现方法没有告知,而且没有code支撑,效果难以复现。从总体架构上了解,细节上没有太多值得学习的地方。

对于后续的Face recognition因为CNN的结构大家比较类似,创新的地方在于不同的特征提取方法和loss function。

编辑于 2017-10-07

文章被以下专栏收录