前言
这是人脸识别系列的第5篇文章,前4篇文章可以在公众号的人脸识别栏里找到,这篇文章主要是解析CVPR 2014年的经典人脸识别论文DeepID1算法。论文的地址如下:http://mmlab.ie.cuhk.edu.hk/pdf/YiSun_CVPR14.pdf 。
题外话
前面4篇人脸识别系列推文中我们介绍了基于传统方法的人脸识别算法,代表性的就是特征脸法。传统人脸识别存在很多弊端,如侧脸,模糊图片,光照遮挡等都会对人脸识别过程造成影响。在基于深度学习的人脸识别技术没有出现以前,传统的人脸识别方法的性能都是很差的,难以实际应用到对安全系数要求很高的场景中。而自从基于深度学习的人脸识别技术一点点演进到今天,人脸识别结果已经可以和人工相比了,有的甚至还会由于人工识别的结果。这就使得人脸识别可以应用到对安全系数要求较为严格的场景,如门禁系统甚至是金融场景。同时,由于人脸识别非常方便,对信息采集设备的要求不是很高,可以通过云端进行识别,这样更推进了人脸识别技术的快速落地。然后基于深度学习的人脸识别方法主要分为两个大的类别,第一个是基于度量学习的方法,第二种是基于边界分类的方法。所谓度量学习(Metric Learning)是专门研究如何让一个算法更好的学习到一种度量的方向,如欧式距离,余弦相似度都是一种度量方法。
介绍
DeepID1是CVPR2014的论文,作者是著名的港中文大学和中科院高等技术研究所的汤晓鸥,王晓刚团队。这个算法以人脸识别的子领域人脸验证(Face Verification)为目标,算法并没有直接用二类分类CNN做人脸验证,而是通过学习一个多类(10000累,每个类大概有20个实例)人脸识别任务来学习特征,并把学习到的特征应用到人脸验证上。算法使用人脸图片的不同patch(也就是一张图片的子区域)训练多个单独的CovNet,每个ConvNet的最后一个隐层是提取到的特征,论文称为DeepID(Deep hidden IDentitiy feature)。最后将这些patch提取到的DeepID在通道上concat起来,构成一个整张人脸图片的特征向量送入Joint Bayesian分类器,做二分类就可以实现人脸验证了。
贡献
用多个不同的Face patch分别训练一个很难的分类任务的卷积网络,因为这里有10000个不同身份的人,然后得到一些分辨力很强的特征表示,最后再不需要严格对其的前提下在LFW上取得了97.45%的人脸对比精度。
算法原理
算法过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191126223533794.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVp dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1c3Rfc29ydA==,size_16,color_FFFFFF,t_70) 如上图所示,这是特征提取的示意图,实际上这篇文章核心点就是这个特征提取部分,验证部分直接做二分类就好。首先,从输入人脸扣出一部分patch(下面也称为块),然后把这些patch输入同一个结构不同参数的ConvNet提取160维的DeepID特征,最后把这些DeepID特征concat起来就是这个人脸的特征了。需要注意的是,每一个块对应了一个单独的ConvNet网络提取对应的DeepID特征,并且 DeepID特征是在最后一个隐层提取,而不是输出层,那个10000个节点的输出层,是训练时候才有的,最后多个块的DeepID连接层最后整个人脸的特征,所以最后一张人脸的特征长度是160*patch的个数。
网络结构
在这里插入图片描述
ConvNet特征提取网络的结构图如上面所示。一共有5层,越往后神经元个数越少,到最后只剩下160个神经元的输出,上面的人脸块是经过对齐后的人脸块,也就是说以左(右)眼为中心的人脸区域块,嘴角为中心的人脸区域块等等,这样就有多个不同的块输入到特定的ConvNet中,最后使用了Max pooling layer3 Conv layer4的输出作为特征。这里论文解释是不同层次的特征抽象程度不一样,而且经过连续的采样,Conv layer4所含的神经元太少,前面损失了太多的信息,所以加入Max Pooling layer3缓和一下。网络的输入图像有两种类型,即个人脸图像块和个图像块,其中代表图像的通道数,同时人脸还会使用3个尺度,激活函数用ReLU,使用随机梯度下降算法优化网络。
人脸的最后特征
在这里插入图片描述
如上图所示,每个人脸会提取3个尺度的10个patch(以鼻头,左眼,右眼,左嘴角,右嘴角为中心)然后彩色图加上灰度图,加上水平翻转数量又翻倍数量又翻倍,一共是:。然后将这120个输出图片分别送入到60个ConvNet(水平翻转和原图,用同一个Conv Net),提取了一共维度的特征向量,作为这个脸的最终特征送入联合贝叶斯分类器做分类。另外有些特例,两个以嘴角和两个眼球为中心的这四个patch,不做翻转操作,直接用他们的对称patch最为他们翻转图的特征。
训练
DeepID1的训练使用了CelebFaces ,有10177人,202599张图片;8700人训练DeepID,1477人训练Joint Bayesian分类器。切分的patch数目是100,使用了5种不同的scale。每张图片最后形成的向量长度为32000,使用PCA降维到150。训练ConvNet的时候使用10000类的交叉熵损失函数作为目标函数,最后论文在LFW上达到了97.45%的验证精度。
结论
论文通过实验证明使用Multi-scale patches的Conv Net比只使用一个只有整张人脸的patch的效果要好。DeepID1是2014年的论文距离今天快5年了,这5年人脸识别的准确率已经非常高了,但经典论文留给我们的思路仍然是值得借鉴的。毕竟,万丈高楼平地起。
代码实现
这里推荐一个Tensorflow版本的代码实现,代码结构简单易懂。使用了开放的 Youtube Aligned Face 数据集,在 8:1:1 的切分下达到了 95% 的识别精度。地址为:https://github.com/jinze1994/DeepID1
参考
https://zhuanlan.zhihu.com/p/82448662
欢迎关注我的微信公众号GiantPadaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。
欢迎在后台回复“交流群”加入GiantPandaCV交流群和我讨论算法哦,顺便看到这里的话在右下角点下在看哦。