DeepID人脸识别算法之三代

转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205

DeepID,眼下最强人脸识别算法。已经三代。

现在,深度学习方兴未艾。大数据风起云涌,各个领域都在处于使用深度学习进行强突破的阶段。人脸识别也不例外。香港中文大学的团队使用卷积神经网络学习特征,将之用于人脸识别的子领域人脸验证方面,取得了不错的效果。尽管是今年7月份才出的成果,但连发三箭。皆中靶心,使用的卷积神经网络已经改进了三次,破竹之势节节高。故而在这里将DeepID神经网络的三代进化史总结一下,以期相互讨论,互有增益。

在说明具体的结论之前,我先进行总结式的几段文字,然后再做具体的技术说明,以防有些过来寻求科普的人看到一坨坨的公式便拂袖远去,没看到什么干货。

1. 问题引入及算法流程

DeepID所应用的领域是人脸识别的子领域——人脸验证,就是推断两张图片是不是同一个人。人脸验证问题非常easy就能够转成人脸识别问题,人脸识别就是多次人脸验证。

DeepID达到的效果都是在LFW数据集上,该数据集是wild人脸数据集。即没有经过对其的人脸,背景变化比較大。

该数据集太小。非常多identities都仅仅有一张人脸。5000个人仅仅有13000张图片。所以DeepID引入了外部数据集CelebFaces和CelebFaces+,每次模型更新都会使用更大的数据集,这在后面介绍DeepID时再细说。

卷积神经网络在DeepID中的作用是是学习特征,即将图片输入进去,学习到一个160维的向量。然后再这个160维向量上,套用各种现成的分类器,就可以得到结果。

DeepID之所以有效,首先在于卷积神经网络学习到的特征的区分能力比較强,为了得到比較强的结果,DeepID採取了眼下最经常使用的手法——增大数据集。仅仅有大的数据集才干使得卷积神经网络训练的更加的充分。

增大数据集有两种手法,第一种手法,就是採集好的数据,即CelebFaces数据集的引入。另外一种手法。就是将图片多尺度多通道多区域的切分。分别进行训练,再把得到的向量连接起来。得到最后的向量。DeepID的算法流程例如以下:

在上述的流程中。DeepID能够换为Hog。LBP等传统特征提取算法。

Classifier能够是SVM,Joint Bayes,LR。NN等随意的machine learning分类算法。

在引入外部数据集的情况下。训练流程是这种。首先,外部数据集4:1进行切分,4那份用来训练DeepID,1那份作为训练DeepID的验证集;然后,1那份用来训练Classifier。这样划分的原因在于两层模型不能使用同一种数据进行训练。easy产生过拟合。

如此。想必大家对DeepID的应用场景已经熟悉了,以下開始讲三代DeepID的进化。

2. DeepID

在这里。我假定大家对卷积神经网络已经有了主要的认识。假设没有的话,出门左转看我这篇blog:卷积神经网络http://blog.csdn.net/stdcoutzyx/article/details/41596663。

2.1 DeepID网络结构

DeepID是第一代,其结构与普通的卷积神经网络差点儿相同。结构图例如以下:

该结构与普通的卷积神经网络的结构相似。可是在隐含层,也就是倒数第二层,与Convolutional layer 4和Max-pooling layer3相连,鉴于卷积神经网络层数越高视野域越大的特性,这种连接方式能够既考虑局部的特征,又考虑全局的特征。

2.2 DeepID实验设置

实验中,人脸图片的预处理方式,也就是切分方式的样比例如以下:

在DeepID的实验过程中。使用的外部数据集为CelebFaces+,有10177人,202599张图片。8700人训练DeepID,1477人训练Joint Bayesian分类器。

切分的patch(也就是上图这种数据)数目为100,使用了五种不同的scale。每张图片最后形成的向量长度为32000,使用PCA降维到150。

如此,达到97.20的效果。使用某种Transfer Learning的算法后。达到97.45%的终于效果。

2.3 实验结论

  • 使用multi-scale patches的convnet比仅仅使用一个仅仅有整张人脸的patch的效果要好。
  • DeepID自身的分类错误率在40%到60%之间震荡,尽管较高。但DeepID是用来学特征的。并不须要要关注自身分类错误率。

  • 使用DeepID神经网络的最后一层softmax层作为特征表示,效果非常差。

  • 随着DeepID的训练集人数的增长,DeepID本身的分类正确率和LFW的验证正确率都在添加。

这就是DeepID第一代。

3 DeepID2

DeepID2相对于DeepID有了较大的提高。

其主要原因在于在DeepID的基础上加入了验证信号。详细来说。原本的卷积神经网络最后一层softmax使用的是Logistic Regression作为终于的目标函数,也就是识别信号;但在DeepID2中,目标函数上加入了验证信号。两个信号使用加权的方式进行了组合。

3.1 两种信号及训练过程

识别信号公式例如以下:

验证信号公式例如以下:

因为验证信号的计算须要两个样本,所以整个卷积神经网络的训练过程也就发生了变化,之前是将所有数据切分为小的batch来进行训练。

如今则是每次迭代时随机抽取两个样本,然后进行训练。训练步骤例如以下:

在训练过程中,lambda是验证信号的加权參数。M參数时动态调整的,调整策略是使近期的训练样本上的验证错误率最低。

3.2 实验设置

首先使用SDM算法对每张人脸检測出21个landmarks,然后依据这些landmarks,再加上位置、尺度、通道、水平翻转等因素,每张人脸形成了400张patch,使用200个CNN对其进行训练,水平翻转形成的patch跟原始图片放在一起进行训练。

这样,就形成了400×160维的向量。

这样形成的特征维数太高,所以要进行特征选择,不同于之前的DeepID直接採用PCA的方式,DeepID2先对patch进行选取。使用前向-后向贪心算法选取了25个最有效的patch,这样就仅仅有25×160维向量,然后使用PCA进行降维。降维后为180维,然后再输入到联合贝叶斯模型中进行分类。

DeepID2使用的外部数据集仍然是CelebFaces+。但先把CelebFaces+进行了切分,切分成了CelebFaces+A(8192个人)和CelebFaces+B(1985个人)。首先,训练DeepID2。CelebFaces+A做训练集,此时CelebFaces+B做验证集;其次,CelebFaces+B切分为1485人和500人两个部分,进行特征选择,选择25个patch。最后在CelebFaces+B整个数据集上训练联合贝叶斯模型,然后在LFW上进行測试。在上一段描写叙述的基础上。进行了组合模型的加强,即在选取特征时进行了七次。第一次选效果最好的25个patch。第二次从剩余的patch中再选25个。以此类推。然后将七个联合贝叶斯模型使用SVM进行融合。终于达到了99.15%的结果。

当中,选取的25个patch例如以下:

3.3 实验结论

  • 对lambda进行调整。也即对识别信号和验证信号进行平衡,发现lambda在0.05的时候最好。使用LDA中计算类间方差和类内方差的方法进行计算。

    得到的结果例如以下:

能够发现,在lambda=0.05的时候,类间方差差点儿不变,类内方差下降了非常多。

这样就保证了类间区分性,而降低了类内区分性。

假设lambda为无穷大,即仅仅有验证信号时。类间方差和类内方差都变得非常小,不利于最后的分类。

  • DeepID的训练集人数越多,最后的验证率越高。

  • 对不同的验证信号,包含L1,L2,cosin等分别进行了实验,发现L2 Norm最好。

4 DeepID2+

DeepID2+有例如以下贡献,第一点是继续更改了网络结构;第二点是对卷积神经网络进行了大量的分析,发现了几大特征。包含:+ 神经单元的适度稀疏性,该性质甚至能够保证即便经过二值化后,仍然能够达到较好的识别效果;+ 高层的神经单元对人比較敏感,即对同一个人的头像来说。总有一些单元处于一直激活或者一直抑制的状态。+ DeepID2+的输出对遮挡很鲁棒。

4.1 网络结构变化

相比于DeepID2。DeepID2+做了例如以下三点改动:

  • DeepID层从160维提高到512维。
  • 训练集将CelebFaces+和WDRef数据集进行了融合。共同拥有12000人,290000张图片。
  • 将DeepID层不仅和第四层和第三层的max-pooling层连接,还连接了第一层和第二层的max-pooling层。

最后的DeepID2+的网络结构例如以下:

上图中,ve表示监督信号(即验证信号和识别信号的加权和)。FC-n表示第几层的max-pooling。

4.2 实验设置

训练数据共同拥有12000人,290000张图像。

当中2000人用于在训练DeepID2+时做验证集,以及训练联合贝叶斯模型。

4.3 实验结论

分别使用FC-n进行实验,比較的算法包含DeepID2+、仅仅有从FC-4反向传播下来进行训练的模型、使用少量数据的、使用小的特征向量的模型。结果例如以下:

DeepID2选取了25个patch。DeepID2+选取了相同的25个patch,然后抽取的特征分别训练联合贝叶斯模型。得到的结果是DeepID2+平均比DeepID2提高2%。

4.4 适度稀疏与二值化

DeepID2+有一个性质,即对每一个人,最后的DeepID层都大概有半数的单元是激活的,半数的单元是抑制的。而不同的人,激活或抑制的单元是不同的。基于此性质。

使用阈值对最后输出的512维向量进行了二值化处理,发现效果减少有限。

二值化后会有优点。即通过计算汉明距离就能够进行检索了。

然后精度保证的情况下,能够使人脸检索变得速度更快,更接近有用场景。

4.5 特征区分性

存在某个神经单元,仅仅使用普通的阈值法,就能针对某个人得到97%的正确率。

不同的神经单元针对不同的人或不同的种族或不同的年龄都有非常强的区分性。

在这里,对每一个单元的激活程度进行由高到低排序。能够得到下图所看到的:

上图仅仅是当中一张图示。还有针对种族、年龄等的激活分析。此处不赘述。

但值得说的是,这样的分析方法对我们非常有启示。

卷积神经网络的输出的含义是什么,非常难解释,通过这样的方法。也许能够得到一些结论。

4.6 遮挡鲁棒性

在训练数据中没有遮挡数据的情况下。DeepID2+自己主动就对遮挡有了非常好的鲁棒性。

有两种方式对人脸进行多种尺度的遮挡,第一种是从下往上进行遮挡。从10%-70%。

另外一种是不同大小的黑块随机放,黑块的大小从10×10到70×70。

结论是遮挡在20%以内,块大小在30×#30下面,DeepID2+的输出的向量的验证正确率差点儿不变。

5 总结

至此,DeepID的三代进化史就讲完了。简单的说一下我的感受。

首先是卷积神经网络的作用。虽说之前听说过卷积神经网络既能够分类,也能够学习特征,但ImageNet上的卷积神经网络都是分类的。这次最终见到不关注分类错误率而关注特征的卷积神经网络。

其次,卷积神经网络的改进方式,无非例如以下几种:增大网络深度和宽度,添加数据,将网络隐含层连接到前面几层来,加入其它的信号。

再次,也是最重要的,就是DeepID在发展过程中对输出向量的分析。尤其是DeepID2+,神经网络的各个单元一直是无法解释的,但这次作者不仅试图去发现规律,还基于规律做出了一些修改。比方二值化。

最后,卷积神经网络的鲁棒性真的非常厉害。

6 參考文献

  • [1] Sun Y, Wang X, Tang X. Deep learning face representation from predicting 10,000 classes[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1891-1898.
  • [2] Sun Y, Chen Y, Wang X, et al. Deep learning face representation by joint identification-verification[C]//Advances in Neural Information Processing Systems. 2014: 1988-1996.
  • [3] Sun Y, Wang X, Tang X. Deeply learned face representations are sparse, selective, and robust[J]. arXiv preprint arXiv:1412.1265, 2014.

DeepID人脸识别算法之三代的更多相关文章

  1. DeepID人脸识别算法之三代(转)

    DeepID人脸识别算法之三代 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205 DeepID,目前最强人脸识别算法,已经三 ...

  2. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  3. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  4. Eigenface与PCA人脸识别算法实验

    简单的特征脸识别实验 实现特征脸的过程其实就是主成分分析(Principal Component Analysis,PCA)的一个过程.关于PCA的原理问题,它是一种数学降维的方法.是为了简化问题.在 ...

  5. Visual C++ 经典的人脸识别算法源代码

    说明:VC++ 经典的人脸识别算法实例,提供人脸五官定位具体算法及两种实现流程. 点击下载

  6. 总结几个简单好用的Python人脸识别算法

    原文连接:https://mp.weixin.qq.com/s/3BgDld9hILPLCIlyysZs6Q 哈喽,大家好. 今天给大家总结几个简单.好用的人脸识别算法. 人脸识别是计算机视觉中比较常 ...

  7. arcface和Dlib人脸识别算法对比

    我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

  8. NET 调用人脸识别算法

    以前有个OpenCV 移植版EMCV可以用作图像识别等 https://github.com/emgucv/emgucv 现在有各种接口 比如虹软SDK  https://ai.arcsoft.com ...

  9. 人脸识别算法准确率最终超过了人类 The Face Recognition Algorithm That Finally Outperforms Humans

    Everybody has had the experience of not recognising someone they know—changes in pose, illumination ...

随机推荐

  1. BZOJ3998:[TJOI2015]弦论(SAM)

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  2. OpenCV——霍夫变换(直线检测、圆检测)

    x #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namesp ...

  3. leetcode25—Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  4. Mac下用户名、计算机名、个人目录名修改

    1.修改mac用户名 [系统偏好设置]->[用户与群组]->点开左下方的小锁->解锁后再用户头像右击,进入到高级选项->进行设置即可 2.修改mac计算机名 [系统偏好设置]- ...

  5. js 对于jquery each 多层循环的问题和原生js多层循环问题

    一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each  两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...

  6. STM32 串口中断总结

    原文:https://blog.csdn.net/weixin_42480952/article/details/82981409 最近在学习使用dma传输方式进行串口通讯,感觉这个很详细,存一下 . ...

  7. css 常用单位

    em: 相对于应用在当前元素的字体尺寸,1em 等于当前的字体尺寸,2em 等于当前字体尺寸的两倍,一般浏览器字体大小默认为16px,则2em == 32px: W3原文:font size of t ...

  8. Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...

  9. kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml

    主机 系统版本      配置       ip Mater.Node,ansible CentOS 7.2                                             4 ...

  10. MB_SELECT_GR_BLOCKED_STOCK 读取物料收货冻结库存

    MMBE 查询物料的当前库存,有一列是收货冻结库存(GR Blocked Stock),但是没有明细. 通过函数 MB_SELECT_GR_BLOCKED_STOCK 可以查询物料收货冻结库存的明细. ...