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. Volley源码分析(一)RequestQueue分析

    Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...

  2. Kafka--基础知识

  3. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...

  4. ethereum/EIPs-170 Contract code size limit

    eip title author type category status created 170 Contract code size limit Vitalik Buterin Standards ...

  5. MP实战系列(十六)之性能分析插件

    性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...

  6. Ubuntu16.04之开发环境构建

    Ubuntu软件安装相对于centos而言,那真的是要愉快的多啊! 以下安装步骤,本人在公司的测试环境和开发环境以及之前个人虚拟机的测试或生产环境都测验过,基本没有问题,只要按照步骤来,即可马到成功! ...

  7. C++箴言:理解typename的两个含义 nested dependent name(嵌套依赖名字)

    template<class T> class Widget; // uses "class"template<typename T> class Widg ...

  8. 【js】AddFavorite/SetHome提醒用户自行操作加入收藏/设置主页

    除了老版本的ie, 就已经没有浏览器能支持js添加收藏夹和设置首页, 浏览器没有开放这个权限了,external.addFavorite这个给禁了. 不过AddFavorite可以起到提醒用户自行操作 ...

  9. 20155206 Exp5 MSF基础应用

    20155206 Exp5 MSF基础应用 基础问题 . 用自己的话解释什么是exploit,payload,encode . exploit:这个词本身只是利用,但是它在黑客眼里就是漏洞利用.有漏洞 ...

  10. 20155210 Exp9 Web安全基础实践

    Exp9 Web安全基础实践 实验过程 开启webgoat 输入java -jar webgoat-container-7.1-exec.jar,来运行webgoat 在浏览器输入localhost: ...