快捷搜索:
您的位置:bv1946伟德入口 > 科学 > 人脸识别新突破,即使只露出半张脸

人脸识别新突破,即使只露出半张脸

2019-10-12 18:10

图片 1

在两个实验中,鼻子、脸颊、前额或嘴巴等面部单独部位的识别率都很低。

首先介绍一下下面正文要写的东西,由于干货非常多所以可能会看着看着就乱了,所以给出框架图:

基于VGGF的特征提取过程

本文转自前瞻网。转载目的在于传递更多信息,并不代表赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们将在第一时间删除内容!

自动人脸识别的经典流程分为三个步骤:人脸检测、面部特征点定位(又称Face Alignment人脸对齐)、特征提取与分类器设计。一般而言,狭义的人脸识别指的是”特征提取 分类器”两部分的算法研究。

面部是人类生命中视觉系统中绘制得最多的图片,所以大部分人类拥有卓越的面部识别能力。一般来说,我们不需要像面部识别AI那样必须正视别人的正脸才能识别出对方,通常对于我们只要一瞥即可分辨。

图片 2

1、DeepFace

顺着这个逻辑,研究团队使用有遮挡的不完整人脸照片作为测试集,下面是一个测试集的示例图片,以及计算机对不完整人脸照片的识别过程。

他们使用的数据集包含了来自巴西大学的200名学生和工作人员的多张照片,共计2800张,男女人数相同。

如果知道了点的位置做一下位置驱动的变形,脸就成正的了,如何驱动变形不是本节的重点,在此省略。

两个向量间的余弦值可以通过使用欧几里得点积公式求出:

“在从大量人脸中识别一张人脸方面,电脑已经比人类表现得更好,所以我们想看看他们是否也能在部分人脸识别方面表现得更好。”

使用triplet loss进行特征再学习

对于网络的输出分数向量$phi ({l_t}) in {R^D}$,对其进行$l_2$归一化,然后使用affine投影将其投影为$_t} = W'phi ({l_t})/||phi ({l_t})|{|_2},W' in {R^{L times D}}$,$W'$通过triplet loss损失进行求解:

$$E(^'}) = sumlimits_{(a,p,n) in T} {max { 0,alpha - || a} - n}||_2^2 || a} - _p}|| 2^2} }$$

上式中p是正样本,n是负样本,通过对该式进行优化,即可得到投影矩阵$W$。下表显示了在YFW人脸数据库上不进行特征再学习和进行特征在学习后的识别结果(特征再学习在下表中为Embedding learning):图片 3从上表可以看到,Embedding learning将原来的91.6%的识别率提高到了97.3%。说明对网络输出的特征进行在学习(跟特征的fine-tune差不多的意思),可以提高精度。 另外在 VGG Face Descriptor 项目主页上作者贴出了LFW和YFW两个人脸图像库上的识别率。图片 4

目前最流行和广泛应用于人脸识别的是VGGF模型,由Oxford Visual Geometry Group开发。该模型在一个超过2.6 K个体的2.6M面部图像的巨大数据集上进行训练。

“我们的实验现在需要在更大的数据集上进行验证。然而,在未来,用于面部识别的图像数据库很可能也需要包括部分人脸图像,这样,即使有些人脸图像不是全部可见,也可以对模型进行正确的训练来识别人脸。”

 

线性SVM

但如果面部只有一半区域可见,人们还能识别出眼前的面孔吗?近日,布拉德福德大学的研究人员的新发现表明,人工智能可以做到。

4.4 适度稀疏与二值化

DeepID2 有一个性质,即对每个人,最后的DeepID层都大概有半数的单元是激活的,半数的单元是抑制的。而不同的人,激活或抑制的单元是不同的。基于此性质。使用阈值对最后输出的512维向量进行了二值化处理,发现效果降低有限。

图片 5

二值化后会有好处,即通过计算汉明距离就可以进行检索了。然后精度保证的情况下,可以使人脸检索变得速度更快,更接近实用场景。

在LFW数据集上,分别使用SVM和CS两种分类器对训练中未使用/使用的人脸各部分进行识别

在使用部分面部图像对模型进行训练后,他们又进行了一次实验。这一次,对于下半张脸,对于只有眼睛和鼻子的人脸,甚至对于看不见眼睛和鼻子的人脸,电脑的得分都有了显著的提高,达到了90%左右的正确识别率。

这篇论文早于DeepID和FaceNet,但其所使用的方法在后面的论文中都有体现,可谓是早期的奠基之作。因而特写博文以记之。

在LFW数据库上,基于SVM和CS分类器的图像缩放识别率

哈桑教授说,研究结果很有希望:“我们现在已经证明,从只显示脸部部分的图像中进行非常精确的面部识别是可能的,我们已经确定了哪些部分最有用。这为安全或预防犯罪技术的使用开辟了更大的可能性。”

图片 6

图片 7

在第一个实验中,研究小组只使用完整的面部图像来训练模型,然后他们进行了一个实验,看看计算机识别人脸的能力有多强,即使只显示其中的一部分。

人脸检测(detection)在opencv中早就有直接能拿来用的haar分类器,基于Viola-Jones算法。但是毕竟是老掉牙的技术,Precision/Recall曲线渣到不行,在实际工程中根本没法给boss看,作为MSRA脑残粉,这里介绍一种MSRA在14年的最新技术:Joint Cascade Face Detection and Alignment(ECCV14)。这篇文章直接在30ms的时间里把detection和alignment都给做了,PR曲线彪到很高,时效性高,内存占用却非常低,在一些库上虐了Face 和Google Picasa,正好契合这篇想讲的东西。可以作为本节的主线。

在FEI数据集上显示面旋转

研究小组使用了一种被称为“卷积神经网络”的机器学习技术,利用了一种名为VGG的特征提取模型。

好了,兜了一大圈该回来了,刚才讲的是两个uniform的model来做detection和shape regression的。接下来该讲作者是怎么边detection边regression shape的了!

图片 8

通过使用人工智能技术,该团队对四分之三和一半人脸的识别率都达到了100%。这项研究发表在《未来世代计算机系统》(Generation Computer Systems)杂志上,是第一次使用机器学习来测试人脸不同部位识别率的试验。

图片 9

余弦相似度

在进化中,人类的大脑已经学会了对人类的面孔格外敏感,有时人们从一些非人事物中也能看出“人脸”形状就是这种能力的表现之一。

网络结构与训练

在文章中,作者将其视为一个N=2622的分类问题,即每一个identity都是一类,选用的网络结构是vggNet,网络的最后一层是分类器$(W,b)$,分类的误差用softmax log-loss来计算。一旦学习过程完成后,就可以把分类器$(W,b)$去除,分数向量$phi ({l_t})$便可以作为特征通过计算欧式距离进行人脸校验。 上面得到的分数向量能够进一步得到改善,通过在欧式空间里面使用"triplet loss"的方式进行训练。其实这里所说使用"triplet loss"的方式进行训练,是对特征的进一步精炼,使用的"triplet loss"学习方非常的常见,是度量学习里面的一种,下面具体讲一下这个特征再学习过程。

这里的Ai和Bi分别代表向量A和B的各分量。

实验结果证明,电脑能够百分之百地识别完整的人脸,但对四分之三的人脸以及只有上半部分或右半部分人脸的识别也取得了百分之百的成功。然而,电脑识别人脸下半部分的准确率只有60%,识别眼睛和鼻子的准确率只有40%。

2007年以来,LFW数据库成为事实上的真实条件下的人脸识别问题的测试基准。LFW数据集包括来源于因特网的5,749人的13,233张人脸图像,其中有1680人有两张或以上的图像。LFW的标准测试协议包括6000对人脸的十折确认任务,每折包括300对正例和300对反例,采用十折平均精度作为性能评价指标。

本次实验需要计算CS以通过使用Eqs找到测试图像和训练图像之间的最小距离。如图8所示:

首席研究员、布拉德福德大学的哈桑·尤格里(Hassan Ugail)教授说:“人类识别人脸的能力令人惊叹,但研究表明,当我们只能看到人脸的一部分时,这种能力就会开始减弱。”

作者建立了一个叫post classifier的分类器,方法如下:

图片 10

分类

得到表示后,使用了多种方法进行分类:

  • 直接算内积
  • 加权的卡方距离
  • 使用Siamese网络结构

加权卡方距离计算公式如下:

图片 11

其中,加权参数由线性SVM计算得到。

Siamese网络结构是成对进行训练,得到的特征表示再使用如下公式进行计算距离:

图片 12

其中,参数alpha是训练得到。Siamese网络与FaceNet就很像了。

SVM是一个二元分类算法,线性分类和非线性分类都支持。经过演进,现在也可以支持多元分类,同时经过扩展,也能应用于回归问题。在本实验中,研究团队对两种SVM都进行了测试,发现当使用部分面部作为测试集的时候,线性SVM能够获得更好的效果。

图片 13

图片 14

detection

识别过程

2. DeepID

在这里,我假定大家对卷积神经网络已经有了基本的认识,如果没有的话,出门左转看我这篇blog:卷积神经网络

使用CS进行正确匹配的结果,对于嘴的部分

1.样本准备:首先作者调用opencv的Viola-Jones分类器,将recal阀值设到99%,这样能够尽可能地检测出所有的脸,但是同时也会有非常多的不是脸的东东被检测出来。于是,检测出来的框框们被分成了两类:是脸和不是脸。这些图片被resize到96*96。

2.特征提取:接下来是特征提取,怎么提取呢?作者采用了三种方法:

第一种:把window划分成6*6个小windows,分别提取SIFT特征,然后连接着36个sift特征向量成为图像的特征。

第二种:先求出一个固定的脸的平均shape(27个特征点的位置,比如眼睛左边,嘴唇右边等等),然后以这27个特征点为中心提取sift特征,然后连接后作为特征。

第三种:用他们组去年的另一个成果Face Alignment at 3000 FPS via Regressing Local Binary Features (CVPR14) ,也就是图中的3000FPS方法,回归出每张脸的shape,然后再以每张脸自己的27个shape points为中心做sift,然后连接得到特征。

3.分类:将上述的三种特征分别扔到线性SVM中做分类,训练出一个能分辨一张图是不是脸的SVM模型。

图片 15

图像质量的不同

图片 16

图片 17

训练数据大小的不同

图片 18

图片 19

数据集

  • Social Face Classification Dataset(SFC): 4.4M张人脸/4030人
  • LFW: 13323张人脸/5749人 
    • restricted: 只有是/不是的标记
    • unrestricted:其他的训练对也可以拿到
    • unsupervised:不在LFW上训练
  • Youtube Face(YTF): 3425videos/1595人

本次实验中,研究团队使用了余弦相似度和线性SVM分类器。做出这样的选择基于两个原因:首先,团队测试了其他分类器后发现CS和线性SVM的效果最好;其次,通过实验和分析,团队发现这两个分类器能够更准确地分离数据。

2.3 实验结论

  • 使用multi-scale patches的convnet比只使用一个只有整张人脸的patch的效果要好。
  • DeepID自身的分类错误率在40%到60%之间震荡,虽然较高,但DeepID是用来学特征的,并不需要要关注自身分类错误率。
  • 使用DeepID神经网络的最后一层softmax层作为特征表示,效果很差。
  • 随着DeepID的训练集人数的增长,DeepID本身的分类正确率和LFW的验证正确率都在增加。

这就是DeepID第一代。

图片 20

FaceNet

与其他的深度学习方法在人脸上的应用不同,FaceNet并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。

FaceNet算法有如下要点:

  • 去掉了最后的softmax,而是用元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用128位足矣。
  • 元组的选择非常重要,选的好可以很快的收敛。

先看具体细节。

遮掉半张脸,准确率也能高达100%!

总结

DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,使用了对齐方法。论文认为神经网络能够work的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,此时,可以用卷积神经网络来学习特征。

针对同样的问题,DeepID和FaceNet并没有对齐,DeepID的解决方案是将一个人脸切成很多部分,每个部分都训练一个模型,然后模型聚合。FaceNet则是没有考虑这一点,直接以数据量大和特殊的目标函数取胜。

在DeepFace论文中,只使用CNN提取到的特征,这点倒是开后面之先河,后面的DeepID、FaceNet全都是使用CNN提取特征了,再也不谈LBP了。

 

2、DeepID

DeepID,目前最强人脸识别算法,已经三代。

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

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

应用前景

图片 21

团队主要研究面部的不同部分如何有利于识别,以及在机器学习场景中如何在对面部照片进行不同程度旋转、缩放的识别。实验使用基于CNN的架构以及预训练的VGG-Face模型来提取特征。然后使用两个分类器,即余弦相似度和线性SVM来测试识别率。下图表现了特征提取步骤的概述:

知道了CRT怎么建立,那就直接就看算法细节吧!边测试是不是脸边做特征点回归的算法如下:

图片 22

Results on YTF

图片 23

图片 24

需要指出的是,虽然深度学习强调特征学习,但学习特征并不是DL的专利。在前DL时代,利用浅层模型从图像中直接学习表示和基于人造描述子学习语义表示(例如学习中层属性表示的Attributes and Simile Classifier和学习高层语义表示的Tom-vs-Pete)的工作都见于相关文献。

研究团队负责人Hassan Ugail教授表示这个结果展示了不完整面部识别的美好前景:“现在已经证明,可以从仅显示部分脸部的图像中,获得非常准确的面部识别率,并且已经确定哪些部分的识别准确率更高,这为该技术应用于安防或预防犯罪等方面,开辟了更大的可能性。”

图片 25

在这项工作中,已经进行了许多遮挡设置,以验证该方法可以处理正常和遮挡的面部识别任务。为此,进行了两组主要的实验:一组不使用局部,旋转和缩放的面部作为训练面部数据的一部分,另一部分使用部分,旋转和缩放的面部作为训练的一部分。

2014年,Facebook发表于CVPR14的工作DeepFace将大数据(400万人脸数据)与深度卷积网络相结合,在LFW数据集上逼近了人类的识别精度。其中DeepFace还引入了一个Local Connected卷积结构,在每个空间位置学习单独的卷积核,缺点是会导致参数膨胀,这个结构后来并没有流行起来。

用于测试FEI数据集上识别率的面部部分

这么渣的效率可咋办呢?以上内容已经证明了alignment确实对detection的preciseness有帮助,这就够啦,对下面的工作也是个启发——能不能在做detection的同时把alignment做了呢?alignment的中间结果是否能给detection带来一些帮助呢?后面慢慢讲。先说两个通用的面部检测和矫正的模型:

为了确定VGGF模型中用于面部特征提取的最佳层,通常必须进行一些试验和错误实验。在本实验中,团队发现最好的结果来自第34层。值得注意的是,该层是完全连接的层,位于神经网络的末端,这意味着提取的特征代表代表了全脸。

1.级联检测分类器(bagging):不失一般性,一个简单的级联分类器是这样的:

图片 26

图中的Ci代表的是第i个弱分类器。x代表的是特征向量,f代表分类得分。每个Ci会根据自己的分类方法对x输出一个分类结果,比如是一张脸或者不是一张脸,而fn(n=1~N)都会对应一个thresholdΘi,让任意一个fn小于对应的Θi的时候,样本就会被拒绝。通常不是一张脸的图片在经过前几个弱分类器的判断后就会被拒绝,根本不用做后面的判断,所以速度很快。

2.级联回归校准(我这翻译… _ ):这里介绍的是另一个人在10年发的文章:Cascaded Pose Regression​ (CVPR10),给图像一个初始shape(通常采用平均shape),然后通过一次一次的回归把shape回归到正确的地方。算法结构很简单,但是效果确实非常好:

图片 27

回归过程如下:首先提取特征,原作者采用的是Pose-Indexed point features,然后根据特征训练回归函数(可以用线性回归,CART,随机森林等等),原作者采用了一个叫Random Fern Regressor的东西,这里翻译成随机蕨好了(这名字…),回归出这一阶段的偏移量,然后shape加上这个偏移量,反复这一过程,直到迭代上限或者shape错误率不再下降。随机蕨的算法过程和随机森林类似,他是一个半朴素贝叶斯模型。首先选取M组每组K个特征建立M个蕨(弱分类器),然后假设蕨内特征是相关的,蕨间特征是独立的,这样从统计学上随机蕨是一个完整的把朴素贝叶斯分类器,让计算变得简单:

图片 28

式中C代表分类,ci代表第I类,M代表蕨数量。

综上,这样回归的过程可以总结成如下形式:

图片 29

S代表shape,St代表在回归第t阶段的shape,他等于上一阶段的shape加上一个偏置,这个偏置就是上述回归方法之一搞定的。比如随机森林或者随机蕨,或者线性回归。

现在再说说怎么训练得到这个回归Rt。

有两种思路:一种是像刚才随机蕨那样,每个每个蕨的叶子节点存储一个偏移量,计算训练的时候落入这个叶子节点的样本偏移之平均,然后作为最终的叶子节点偏移量。其实就是在优化一个如下目标函数:

图片 30

然而MSRA组在3000fps中采用的是另一种方法,形状的偏移量ΔδS为:

图片 31

目标函数是:

图片 32

其实也是同样的思路,Φ代表特征提取函数,论文中称Φ的输出为局部二值特征(LBF),W为线性回归参数矩阵,其实就是把提取出来的特征映射到一个二维的偏移量上,是一个2*lenth(特征空间维数)的变换矩阵。

首先讲Φ是怎么训练的:Φ其实就是一个随机森林。输入像素差特征(pixel-difference features),输出一个offest。训练的时候随机给每个根节点像素差特征中的一部分。非叶节点的分裂依据是从输入的pixel-difference features中找出能够做到最大的方差衰减的feature。在最后的叶子节点上写上落在叶子节点上的样本偏移量,这个偏移量在之前说到的fern里有用,但是在这里没啥用,因为作者最后不是用这个做回归的而是用LBF,详细的得往下看。如果有多个样本都落在这里,则求平均。这样训练出来的东西就是下面这个公式所表达的东西:

图片 33

可能有读者看到这就会不懂了,不用管这个公式,等下面的看完了就会懂了。

但是我只想要其中的Φ,于是这里给出了LBF(local binary feature)的定义,直接简单粗暴地统计所有树叶节点是否被该样本落入,如果落入了就记为1否则记为0,然后把所有的01串连起来就是LBF了。还是看图说话:

图片 34

先看b,随机森林的三棵树,样本经过三棵树后分别落在了第1,2,3个叶子节点上,于是三棵树的LBF就是1000,0100,0010.连接起来就是100001000010.然后看a,把27个特征点的lbf都连接起来形成总的LBF就是Φ了。

接下来是训练w:之前已经得到了wΦ(I,S)以及Φ(I,S),现在想求w,这还不容易吗,直接算呀。不过作者又调皮了,他说他不想求w,而是想求一个总的大W=[w1,w2,w3,…,w27].怎么求呢?得做二次回归。至于为什么要这么做下面会介绍。目标函数:

图片 35

后面加了个L2项,因为W是炒鸡sparse的,防止过拟合。做线性回归即可得到W。

现在解释一下为啥不直接用w1w2w3…而是要再回归出来一个W:原因有两个:

1. 再次回归W可以去除原先小wi叶子节点上的噪声,因为随机森林里的决策树都是弱分类器嘛噪声多多滴;

2.大W是全局回归(之前的一个一个小w也就是一个一个特征点单独的回归是local回归),全局回归可以有效地实施一个全局形状约束以减少局部误差以及模糊不清的局部表现。

这样一来,测试的时候每输入一张图片I,先用随机森林Φ求出它的LBF,然后在用W乘一下就得到了下一个stage的shape,然后迭代几次就得到了最终的shape。所以效率十分的快。

在FEI数据库中使用基于面部部分的SVM和CS分类器的面部识别率- 在训练中不使用/使用面部的面部部分

图片 36

使用CS测量的错误匹配的结果,对于嘴的部分

图片 37

13个卷积层

4 DeepID2

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

在VGGF中,其中13层是卷积网络,其他是ReLU、pooling的混合体,最后一层是softmax。

这个图从左到右依次是原始级联分类器得到的样本分类分布和第一种到第三种方法提取的特征得到的样本分类分布。可见做一下shape alignment可以得到一个更好的分类效果。但是问题来了:如果把所有的windows都做一下alignment,即使是3000 faces per second的速度一张图可能也要处理上1秒,这无法满足一般一秒30帧的实时需求。作者也说,用opencv分类器,参数设成99%的recall率将会带来很严重的效率灾难——一张图能找出来3000个框,处理一张图都要好几秒。

不过Hassan Ugail教授还表示,目前实验还需要在更大的数据集上进行验证。显然,将来很可能用于面部识别的图像数据库也需要包含不完整面部的图像。

图片 38

使用CNN和VGG-Face,利用两个分类器进行不完整人脸的识别

部分摘自其他博客,详见参考文献。

图片 39

人脸校准(alignment)是给你一张脸,你给我找出我需要的特征点的位置,比如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等点的位置。如果觉得还是不明白,看下图:

普遍认为大脑通过记住重要的细节,例如与眼睛,鼻子,前额,脸颊和嘴巴相对应的关键特征的形状和颜色,对面部进行区分。此外,人类大脑可以应对不同光线环境下、不同面部表情,以及远处面部的显著变化。

网络结构的不同

图片 40

图片 41

据悉,这是第一个使用机器学习来测试面部不同部位识别率的研究,论文已发表在Future Generation Computer Systems上。下面新智元对本次实验进行介绍。

图片 42

正确匹配的结果使用CS测量,为右脸颊

紧接着作者将以上三种方法做出的分类器和初始分类器进行比对,画了一个样本分布的图:

从FEI数据集中采样面部数据

实验评估

图片 43

基本概念

在具体到人脸识别方法之前,先对人脸识别中的Face detection, Face alignment, Face verification和Face identification(recognization)进行必要的讲解说明,以方便后续知识的展开。

  • 人脸检测(Face detection) :对图像中的人脸进行检测,并将结果用矩形框框出来。
  • 人脸校正(Face alignment) :对检测到的人脸进行姿态的校正,使其人脸尽可能的"正",通过校正可以提高人脸识别的精度。校正的方法有2D校正、3D校正的方法,3D校正的方法可以使侧脸得到较好的识别。目前校正在处理过程中完全可以达到实时性的要求,具体可以阅读Face Alignment at 3000 FPS via Regressing Local Binary Features这篇文章( 论文笔记)。在进行人脸校正的时候,会有检测特征点的位置这一步,这些特征点位置主要是诸如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等位置,知道了这些特征点的位置后,做一下位置驱动的变形,脸即可被校"正"了。下面两幅图像分别显示了原来的人脸和经过校正后了的人脸。图片 44图片 45
  • 人脸校验(Face verification) :人脸校验是基于pair matching的方式,所以它得到的答案是“是”或者“不是”。在具体操作的时候,给定一张测试图片,然后挨个进行pair matching,matching上了则说明测试图像与该张匹配上的人脸为同一个人的人脸。一般在 小型 办公室人脸刷脸打卡系统中采用的(应该)是这种方法,具体操作方法大致是这样一个流程:离线逐个录入员工的人脸照片(一个员工录入的人脸一般不止一张),员工在刷脸打卡的时候相机捕获到图像后,通过前面所讲的先进行人脸检测,然后进行人脸校正,再进行人脸校验,一旦match结果为“是”,说明该名刷脸的人员是属于本办公室的,人脸校验到这一步就完成了。在离线录入员工人脸的时候,我们可以将人脸与人名对应,这样一旦在人脸校验成功后,就可以知道这个人是谁了。上面所说的这样一种系统优点是开发费用低廉,适合小型办公场所,缺点是在捕获时不能有遮挡,而且还要求人脸姿态比较正(这种系统我们所有,不过没体验过)。下图给出了示意说明,不过那个“Am I SW?”应该改一下,改成“Am I the same to the seleted face image?”。图片 46
  • 人脸识别(Face identification或Face recognization) :人脸识别正如下图所示的,它要回答的是“我是谁?”,相比于人脸校验采用的pair matching,它在识别阶段更多的是采用分类的手段(。它实际上是对进行了前面两步即人脸检测、人脸校正后做的图像(人脸)分类。图片 47根据上面所介绍的这4个概念,人脸识别包括下面三个模块:图片 48

上面进行细拆分包括下图所示的几个步骤:图片 49

对上面的概念清楚了后,我们再接着讲一下在人脸识别里面的人脸图像数据库。

然而,与此相反,任何在光线、表情、姿势和即眼镜或胡子等等的变化,都可能对计算机的识别率产生巨大影响。不过,因为计算机处理海量数据的能力不断提高,可以认为机器算法至少在面部匹配方面拥有优异的表现。

1. 问题引入及算法流程

DeepID所应用的领域是人脸识别的子领域——人脸验证,就是判断两张图片是不是同一个人。人脸验证问题很容易就可以转成人脸识别问题,人脸识别就是多次人脸验证。DeepID达到的效果都是在LFW数据集上,该数据集是wild人脸数据集,即没有经过对其的人脸,背景变化比较大。该数据集太小,很多identities都只有一张人脸,5000个人只有13000张图片。所以DeepID引入了外部数据集CelebFaces和CelebFaces ,每次模型更新都会使用更大的数据集,这在后面介绍DeepID时再细说。

卷积神经网络在DeepID中的作用是是学习特征,即将图片输入进去,学习到一个160维的向量。然后再这个160维向量上,套用各种现成的分类器,即可得到结果。DeepID之所以有效,首先在于卷积神经网络学习到的特征的区分能力比较强,为了得到比较强的结果,DeepID采取了目前最常用的手法——增大数据集,只有大的数据集才能使得卷积神经网络训练的更加的充分。增大数据集有两种手法,第一种手法,就是采集好的数据,即CelebFaces数据集的引入。第二种手法,就是将图片多尺度多通道多区域的切分,分别进行训练,再把得到的向量连接起来,得到最后的向量。DeepID的算法流程如下:

图片 50

在上述的流程中,DeepID可以换为Hog,LBP等传统特征提取算法。Classifier可以是SVM,Joint Bayes,LR,NN等任意的machine learning分类算法。

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

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

图片 51

图片 52

这项工作提供了一组全面的实验,使用面部的不同部分进行面部识别。

人脸表示归一化

对于输出的4096-d向量:

  • 先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值。
  • 每个向量进行L2归一化

在FEI数据集上使用SVM和CS分类器的人脸识别率(基于训练集中没有和有旋转人脸图片)

人脸图像数据库

人脸图像这个东西因为受到安全隐私等限制,所以一般大规模的人脸数据库比较难拿到,目前我知道到的公开的人脸图像库有LFW(Labelled Faces in the Wild)和YFW(Youtube Faces in the Wild)。下面再列举一些大规模的人脸图像数据库:图片 53

一些来自LFW数据集的人脸图像样本

人脸表示

图片 54

经过3D对齐以后,形成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下:

  • Conv:32个11×11×3的卷积核
  • max-pooling: 3×3, stride=2
  • Conv: 16个9×9的卷积核
  • Local-Conv: 16个9×9的卷积核,Local的意思是卷积核的参数不共享
  • Local-Conv: 16个7×7的卷积核,参数不共享
  • Local-Conv: 16个5×5的卷积核,参数不共享
  • Fully-connected: 4096维
  • Softmax: 4030维

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

后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因:

  • 对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失
  • 不共享的卷积核并不增加抽取特征时的计算量,而会增加训练时的计算量
  • 使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件本文刚好满足。

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

全连接层的输出可以用于Softmax的输入,Softmax层用于分类。

特征分类:为什么使用余弦相似度和线性SVM

三、相关模型

实验表明,扫描整个面部的3/4、甚至1/2的识别准确率能够达到100%!除此之外,团队还研究了面部的某个独立的部位,比如鼻子、脸颊、前额或嘴巴的识别率,以及图像的旋转和缩放对面部识别主体的影响。结果发现,如果只针对面部的某个独立的部位,比如鼻子、脸颊、前额或嘴巴,识别率总是相对较低。

5 总结

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

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

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

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

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

 

3、SeetaFace

SeetaFace人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块(SeetaFace Detection)、面部特征点定位模块(SeetaFace Alignment)以及人脸特征提取与比对模块 (SeetaFace Identification)。

人脸检测模块SeetaFace Detection采用了一种结合传统人造特征与多层感知机(MLP)的级联结构,在FDDB上达到了84.4%的召回率(100个误检时),并可在单个i7 CPU上实时处理VGA分辨率的图像。面部特征点定位模块SeetaFace Alignment通过级联多个深度模型(栈式自编码网络)来回归5个关键特征点(两眼中心、鼻尖和两个嘴角)的位置,在AFLW数据库上达到state-of-the-art的精度,定位速度在单个i7 CPU上超过200fps。人脸识别模块SeetaFace Identification采用一个9层的卷积神经网络(CNN)来提取人脸特征,在LFW数据库上达到97.1%的精度(注:采用SeetaFace人脸检测和SeetaFace面部特征点定位作为前端进行全自动识别的情况下),特征提取速度为每图120ms(在单个i7 CPU上)。

下面对上述三个模块的情况做简要介绍,更详细的介绍请参考我们相应的学术论文。

人脸检测模块SeetaFace Detection

该模块基于我们提出的一种结合经典级联结构和多层神经网络的人脸检测方法实现,其所采用的漏斗型级联结构(Funnel-Structured Cascade,FuSt)专门针对多姿态人脸检测而设计,其中引入了由粗到精的设计理念,兼顾了速度和精度的平衡。

如图1所示,FuSt级联结构在顶部由多个针对不同姿态的快速LAB级联分类器构成,紧接着是若干个基于SURF特征的多层感知机(MLP)级联结构,最后由一个统一的MLP级联结构(同样基于SURF特征)来处理所有姿态的候选窗口,整体上呈现出上宽下窄的漏斗形状。从上往下,各个层次上的分类器及其所采用的特征逐步变得复杂,从而可以保留人脸窗口并排除越来越难与人脸区分的非人脸候选窗口。

图片 55

图1. SeetaFace人脸检测模块所采用的FuSt漏斗型级联结构

与SeetaFace Detection开源代码配套开放的是一个准正面人脸检测模型(使用了约20万人脸图像训练而来),可以实现准正面人脸的准确检测(旋转角度约45度以内,但对于姿态偏转较大的人脸也具备一定的检测能力)。图2给出了一些检测结果的示例(注:测试时图像金字塔下采样比例设置为0.8,滑动步长设置为4和2,最小人脸设置为20×20)。在人脸检测领域最重要的评测集FDDB上对SeetaFace Detector进行评测,在输出100个误检时(FPPI=0.035)召回率达到84.4%,输出1000个误检时召回率达到88.0%。

图片 56

图2. SeetaFace Detection人脸检测结果的示例

图3则给出了SeetaFace Detector在FDDB上的离散型得分ROC曲线,并与其它已发表的学术界公开结果(从FDDB官网获得)进行了对比。不难看出,尽管SeetaFace人脸检测器并非目前精度最高的,但在学术界公开的结果中仍然具有很强的竞争力,而且可以完全满足多数人脸识别系统的需求。

图片 57

图3. SeetaFace Detector在FDDB上的ROC曲线

此外,与其他算法相比,SeetaFace Detector在速度上有一定优势。对于640×480大小的VGA图像,检测速度的对比情况如表1所示。其中,SeetaFace的速度在单个3.40GHz的i7-3770 CPU上测得,Cascade CNN在CPU上的速度在2.0GHz的CPU上测得(引自原文)。而各方法在GPU上的速度在NVIDIA Titan Black GPU上测得。

图片 58

特征点定位模块SeetaFace Alignment

面部特征点定位(人脸对齐)在人脸识别、表情识别、人脸动画合成等诸多人脸分析任务中扮演着非常重要的角色。由于姿态、表情、光照和遮挡等因素的影响,真实场景下的人脸对齐任务是一个非常困难的问题。形式上,该问题可以看作是从人脸表观到人脸形状的复杂非线性映射。为此,SeetaFace Alignment采用的是我们提出的一种由粗到精的自编码器网络(Coarse-to-Fine Auto-encoder Networks, CFAN)来求解这个复杂的非线性映射过程。

如图 4所示,CFAN级联了多级栈式自编码器网络,其中的每一级都刻画从人脸表观到人脸形状的部分非线性映射。具体来说,输入一个人脸区域(由人脸检测模块得到),第一级自编码器网络直接从该人脸的低分辨率版本中快速估计大致的人脸形状S0。然后,提高输入人脸图像的分辨率,并抽取当前人脸形状S0(相应提升分辨率)各特征点位置的局部特征,输入到下一级自编码器网络来进一步优化人脸对齐结果。以此类推,通过级联多个栈式自编码器网络,在越来越高分辨率的人脸图像上逐步优化人脸对齐结果。

图片 59

图4. 基于由粗到精自编码器网络(CFAN)的实时人脸对齐方法

此次开源的SeetaFace Alignment基于上述CFAN方法实现了5个面部关键特征点(两眼中心,鼻尖和两个嘴角)的精确定位,训练集包括23,000余幅人脸图像(标注了5点)。需要注意的是,为加速之目的,在基本不损失精度的情况下,开源实现中将CFAN级联的数目减少到了2级,从而可在单颗Intel i7-3770 (3.4 GHz CPU)上达到每个人脸5ms的处理速度(不包括人脸检测时间)。

图5给出了一些用SeetaFace Alignment开源引擎定位面部5点的效果示例,可见其对表情、姿态、肤色等均具有较好的鲁棒性。在AFLW数据集上的量化评价和对比情况如图6所示,其中平均定位误差根据两眼中心距离做了归一化。不难看出,SeetaFace Alignment取得了state-of-the-art的定位结果。

图片 60

图5. SeetaFace Alignment定位结果示例

图片 61

图6. SeetaFace Alignment在AFLW数据集上的定位误差及对比情况
其中LE:左眼,RE:右眼,N:鼻尖,LM:左嘴角,RM:右嘴角

人脸特征提取与比对模块SeetaFace Identification

人脸识别本质上是要计算两幅图像中人脸的相似程度,其一为注册阶段(类比人的相识过程)输入系统的,另一幅为识别阶段(即再见时的辨认过程)的输入。为此,如图7所示,一套全自动的人脸识别系统在完成前述的人脸检测与人脸对齐两个步骤之后,即进入第三个核心步骤:人脸特征提取和比对。这个阶段也是深度学习风起云涌之后进步最大的模块,目前大多数优秀的人脸识别算法均采用卷积神经网络(CNN)来学习特征提取器(即图7中的函数F)。

图片 62

图7.人脸识别系统的核心流程

SeetaFace开源的人脸特征提取模块也是基于卷积神经网络的。具体地说,其实现的是深度卷积神经网络VIPLFaceNet:一个包含7个卷积层与2个全连接层的DCNN。其直接修改自Hinton教授的学生Alex Krizhevsky等于2012年设计的AlexNet(即引爆CNN在视觉中广泛应用的网络)。

如表2对比所示,与AlexNet相比,VIPLFaceNet将5×5的卷积核拆分为两层3×3的卷积核,从而增加了网络深度,而并没有增加计算量;VIPLFaceNet还减少了每个卷积层的kernel数目以及FC2层的节点数。同时,通过引入Fast Normalization Layer(FNL),加速了VIPLFaceNet的收敛速度,并在一定程度上提升了模型的泛化能力。测试表明,在相同训练集情况下,VIPLFaceNet在LFW测试集上识别错误率比AlexNet降低了40%,而训练和测试时间分别为AlexNet的20%和60%。

图片 63

与开源的SeetaFace Identification代码一起发布的人脸识别模型是使用140万人脸图像训练出来的,这些训练图像来自于约1.6万人,其中既有东方人也有西方人。人脸特征直接采用VIPLFaceNet FC2层的2048个结点的输出,特征比对可简单采用Cosine计算相似度,然后进行阈值比较(验证应用)或排序(识别应用)即可。

该引擎在多数人脸识别场景下均具有良好的性能,例如,在LFW standard Image-Restricted测试协议下,使用SeetaFace Detector与SeetaFace Alignment检测并对齐人脸,采用SeetaFace Identification进行特征提取和比对,可以达到97.1%的识别正确率(请注意:这是系统全自动运行的结果,对少量不能检到人脸的图像,截取中间区域输入人脸对齐模块即可)。速度方面,在单颗Intel i7-3770 CPU上,开源代码提取一张人脸之特征的时间约为120ms(不含人脸检测和特征点定位时间)。

开源网址

目前,SeetaFace开源人脸识别引擎已全部发布在Github上供国内外同行和工业界使用,项目网址为:

 

4、FaceNet

随着深度学习的出现,CV领域突破很多,甚至掀起了一股CV界的创业浪潮,当次风口浪尖之时,Google岂能缺席。特贡献出FaceNet再次刷新LFW上人脸验证的效果记录。

本文是阅读FaceNet论文的笔记,所有配图均来自于论文。 
转载请注明:

图片 64

2.1 DeepID网络结构

DeepID是第一代,其结构与普通的卷积神经网络差不多。结构图如下:

图片 65

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

众所周知,人脸识别在摄像头无法捕捉到完整面部图像的情况下很难获得理想的效果。最近布拉德福德大学的研究人员在不完整面部识别方面获得了突破性进展,实验表明,扫描整个面部的3/4、甚至1/2的识别准确率能够达到100%!

Deep Face Recognition

人脸识别按特征分类可以分成两种:一种是基于浅层特征的人脸识别,一种是基于深度学习的人脸识别方法。Deep Face Recognition这篇文章做了两件事:一是介绍了一种抓取网络上的图片并在有限的人力标注下得到一个大规模人脸图像的方法,二是测试了不同CNN网络结构下人脸校正以及度量学习对人脸识别的精度的影响。

浅层人脸识别方法首先提取人脸图像的局部特征,比如SIFT、LBP、HOG等特征,然后通过某种pooling机制将它们aggregate成全局人脸描述子,如Fisher Vector(可以参阅A compact and discriminative face track descriptor和Fisher Vector Faces in the Wild这两篇文章)。

基于深度学习的人脸识别方法通常使用CNN结构,比较典型的代码是DeepFace(Deep-Face:Closing the gap to human-level performance in the face verification),该方法使用一个深层的CNN网络结构,训练所使用的数据集数目为4百万,共包含4000个人的人脸。DeepFace在预处理的阶段使用了3D模型将人脸图像校准到典型姿态下。在当时DeepFace在LFW和在YFW人脸数据库上都取得了最好的结果。后来,文章的作者有对其工作进行了拓展(具体可以阅读Web-scale traing for face identification这篇文章),其训练图库比原来的图库大了两个量级,包括100万个人的脸(英文作identities),每个identity有50张图像,他们通过一种自举策略来选择identities进行网络的训练,并说明了可以通过控制全连接层的维数还提高网络的泛化能力。

DeepFace的工作后来被进一步拓展成了DeepId系列,具体可以阅读Y. Sun的4篇关于人脸识别的文章:

  • Deep learning face representation by joint identificationverification,在分类和验证(virification)的时候使用多任务学习。
  • Deep learning face representation from predicting 10,000 classes,将多个CNNs结构联合起来
  • Deeply learned face representations are sparse, selective, and robust,在全连接层前面使用不同的CNN结构。
  • Deepid3: Face recognition with very deep neural networks,使用更深的网络结构,大约用到了200个CNN结构,模型非常的复杂。

相比于DeepFace,DeepID没有使用3D的校准,而是使用了一种更简单的2D仿射校准,所用的训练图库是由CelebFaces和WDRef两个人脸图像库混合而成的。

在2015年谷歌的Facenet中,谷歌的研究人员使用了前面介绍的人脸图像库中的Google人脸数据库上去训练CNN网络,他们使用的是"triplet-based"损失,通过最小化类内差异和最大化类间差异,并在训练阶段将该损失应用在多层(不仅仅是最后一层),在LFW和YTF上获得了最好的识别成绩。

在每种情况下,使用两个分类器进行了14个涉及部分,旋转和缩小人脸的子实验。出于训练目的,使用了每个受试者70%的图像,这些图像也通过诸如填充和翻转之类的操作来增强。在每种情况下,剩余的30%的图像用于测试。

3 DeepID2

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

在LFW数据集上使用基于SVM和CS分类器的人脸旋转的人脸识别率(在没有和使用单个旋转面作为训练数据的情况下)

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如下:

图片 66

利用SVM和CS分类器对FEI中缩小后的人脸进行快速识别

最终生成向量表示的大小的不同

图片 67

示例图片

这个模型的训练方法如下:

一个在FEI数据集中缩小人脸的例子

一般而言,人脸识别的研究历史可以分为三个阶段。在第一阶段(1950s-1980s),人脸识别被当作一个一般性的模式识别问题,主流技术基于人脸的几何结构特征。在第二阶段(1990s)人脸识别迅速发展,出现了很多经典的方法,例如Eigen Face, Fisher Face和弹性图匹配,此时主流的技术路线为人脸表观建模。在第三阶段(1990s末期到现在),人脸识别的研究不断深入,研究者开始关注面向真实条件的人脸识别问题,主要包括以下四个方面的研究:1)提出不同的人脸空间模型,包括以线性判别分析为代表的线性建模方法,以Kernel方法为代表的非线性建模方法和基于3D信息的3D人脸识别方法。2)深入分析和研究影响人脸识别的因素,包括光照不变人脸识别、姿态不变人脸识别和表情不变人脸识别等。3)利用新的特征表示,包括局部描述子(Gabor Face, LBP Face等)和深度学习方法。4)利用新的数据源,例如基于视频的人脸识别和基于素描、近红外图像的人脸识别。

基于计算机的人脸识别已经成为一种成熟且可靠的机制,实际上已被应用于许多访问控制场景,不过目前面部识别或认证,主要使用全正脸面部图像的“完美”数据来执行。但实际上,有许多情况下比如闭路电视摄像机往往只能拍到脸的一侧,或者如果被拍摄者戴了帽子、口罩等遮挡物,就无法获得完整的正脸。因此,使用不完整面部数据的面部识别是一个亟待开发的研究领域。

实验结果

在文章中,作者在LFW人脸数据库上分别对Fisher Vector Faces、DeepFace、Fusion、DeepID-2,3、FaceNet、FaceNet Alignment以及作者的方法进行对比,具体的识别精度我们看下表。图片 68从上表可以看到,Deep Face Recognition这篇文章所提出的方法训练所用图库大小最小,但取得了跟其他方法具有可比性的结果。

图片 69

自从LFW发布以来,性能被不断刷新。2013年之前,主要技术路线为人造或基于学习的局部描述子 测度学习。2014年之后,主要技术路线为深度学习。

来自布拉德福德大学的研究团队的最新研究在不完整面部识别方面,取得了突破性进展,实验使用最先进的基于卷积神经网络的架构以及预先训练的VGG-Face模型,使用余弦相似度和线性支持向量机来测试识别率。团队在两个公开可用的数据集(受控的巴西FEI和不受控制的LFW)上进行了实验。

3.3 实验结论

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

图片 70

可以发现,在lambda=0.05的时候,类间方差几乎不变,类内方差下降了很多。这样就保证了类间区分性,而减少了类内区分性。如果lambda为无穷大,即只有验证信号时,类间方差和类内方差都变得很小,不利于最后的分类。

  • DeepID的训练集人数越多,最后的验证率越高。
  • 对不同的验证信号,包括L1,L2,cosin等分别进行了实验,发现L2 Norm最好。

利用了两个流行的人脸数据集的人脸图像,即FEI和LFW数据集。使用级联物体检测器对两个数据库中的所有图像进行裁剪以尽可能地去除背景,以便提取面部和内部面部特征。但是,对于某些具有非常复杂背景的图像,如LFW数据库的情况,作者手动裁剪这些面部。

人脸数据库搜集

  1. 获取候选人名 。IMDB电影名人列表大约有500K个不同的人名,先从上面通过popularity排序获取到5k个人名,其中男女各一半。这些人名通过不断的筛选排除,最后得到了2622个人人名。
  2. 为每一个人名搜集图片 。借助Google和Bing图片搜索引擎,分别按 人名 和 人名 actor 的两种方式进行查询,每次查询选前面500张,这样可以为每个人名(后面将其称为identity)获取到2000张图像。
  3. 用自动filter提高纯度 。对于每一个基于Google查询的结果,将前50个样本作为正样本,其他identity查询的前50个结果作为负样本,用Fisher Vector描述子训练一个one-vs-rest线性分类器。用这个线性分类器对每一个identity的2000个下载结果进行排序,保留前1000个的结果。
  4. 删除近似样本 :对每一幅图像计算其VLAD描述子,并对每一个identity的1000张图像进行聚类,然后"retaining a single element per cluster",文章在这里没讲清楚。
  5. 最终的人工过滤 。这一步借助训练CNN网络来加速标注过程,最后获取得了982803张较好的图片。

下表使每个过程标注所花费的时间:图片 71

图片 72

对齐与否

在LFW上,使用了两种模式:

  • 直接取LFW图片的中间部分进行训练,效果98.87左右。
  • 使用额外的人脸对齐工具,效果99.63左右,超过deepid。

VGG-Face模型

1.CART(Classification And Regression Tree)
思想:递归地将输入空间分割成矩形
优点:可以进行变量选择,可以克服missing data,可以处理混合预测
缺点:不稳定

分类训练过程:

图片 73图片 74图片 75图片 76图片 77图片 78图片 79图片 80

就这样不断分割之后可以建立如下这样的决策树:

图片 81

 

2.Bagging (Breiman1996): 也称bootstrap aggregation
Bagging的策略:
– 从样本集中用Bootstrap采样选出n个样本
– 在所有属性上,对这n个样本建立分类器(CART or SVM or …)
– 重复以上两步m次,i.e.build m个分类器(CART or SVM or …)
– 将数据放在这m个分类器上跑,最后vote看到底分到哪一类
Fit many large trees to bootstrap resampled versions of the training data, and classify by majority vote.
下图是Bagging的选择策略,每次从N个数据中采样n次得到n个数据的一个bag,总共选择B次得到B个bags,也就是B个bootstrap samples.

流程图如下:

图片 82

3.随机森林:

随机森林,指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。简单来说,随机森林就是由多棵CART(Classification And Regression Tree)构成的。对于每棵树,它们使用的训练集是从总的训练集中有放回采样出来的,这意味着,总的训练集中的有些样本可能多次出现在一棵树的训练集中,也可能从未出现在一棵树的训练集中。在训练每棵树的节点时,使用的特征是从所有特征中按照一定比例随机地无放回的抽取的,根据Leo Breiman的建议,假设总的特征数量为M,这个比例可以是sqrt(M),1/2sqrt(M),2sqrt(M)。

因此,随机森林的训练过程可以总结如下:

(1)给定训练集S,测试集T,特征维数F。确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m

对于第1-t棵树,i=1-t:

(2)从S中有放回的抽取大小和S一样的训练集S(i),作为根节点的样本,从根节点开始训练

(3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;如果是回归问题,预测输出为当前节点样本集各个样本值的平均值。然后继续训练其他节点。如果当前节点没有达到终止条件,则从F维特征中无放回的随机选取f维特征。利用这f维特征,寻找分类效果最好的一维特征k及其阈值th,当前节点上样本第k维特征小于th的样本被划分到左节点,其余的被划分到右节点。继续训练其他节点。有关分类效果的评判标准在后面会讲。

(4)重复(2)(3)直到所有节点都训练过了或者被标记为叶子节点。

(5)重复(2),(3),(4)直到所有CART都被训练过。

利用随机森林的预测过程如下:

对于第1-t棵树,i=1-t:

(1)从当前树的根节点开始,根据当前节点的阈值th,判断是进入左节点(<th)还是进入右节点(>=th),直到到达,某个叶子节点,并输出预测值。

(2)重复执行(1)直到所有t棵树都输出了预测值。如果是分类问题,则输出为所有树中预测概率总和最大的那一个类,即对每个c(j)的p进行累计;如果是回归问题,则输出为所有树的输出的平均值。

注:有关分类效果的评判标准,因为使用的是CART,因此使用的也是CART的平板标准,和C3.0,C4.5都不相同。

对于分类问题(将某个样本划分到某一类),也就是离散变量问题,CART使用Gini值作为评判标准。定义为Gini=1-∑(P(i)*P(i)),P(i)为当前节点上数据集中第i类样本的比例。例如:分为2类,当前节点上有100个样本,属于第一类的样本有70个,属于第二类的样本有30个,则Gini=1-0.7×07-0.3×03=0.42,可以看出,类别分布越平均,Gini值越大,类分布越不均匀,Gini值越小。在寻找最佳的分类特征和阈值时,评判标准为:argmax(Gini-GiniLeft-GiniRight),即寻找最佳的特征f和阈值th,使得当前节点的Gini值减去左子节点的Gini和右子节点的Gini值最大。

对于回归问题,相对更加简单,直接使用argmax(Var-VarLeft-VarRight)作为评判标准,即当前节点训练集的方差Var减去减去左子节点的方差VarLeft和右子节点的方差VarRight值最大。

Random Forest与Bagging的区别在于:Bagging每次生成决策树的时候从全部的属性Attributes里面选择,而Random Forest是随机从全部Attributes的集合里面生成一个大小固定的子集,相对而言需要的计算量更小一些。

 

 

4.Boosting(Freund & Schapire 1996):
boosting在选择hyperspace的时候给样本加了一个权值,使得loss function尽量考虑那些分错类的样本(i.e.分错类的样本weight大)。
怎么做的呢?
– boosting重采样的不是样本,而是样本的分布,对于分类正确的样本权值低,分类错误的样本权值高(通常是边界附近的样本),最后的分类器是很多弱分类器的线性叠加(加权组合),分类器相当简单。

结构如图:

图片 83

AdaBoost和RealBoost是Boosting的两种实现方法。general的说,Adaboost较好用,RealBoost较准确。由于Boosting算法在解决实际问题时有一个重大的缺陷,即他们都要求事先知道弱分类算法分类正确率的下限,这在实际问题中很难做到。后来 Freund 和 Schapire提出了 AdaBoost 算法,该算法的效率与 Freund 方法的效率几乎一样,却可以非常容易地应用到实际问题中。AdaBoost 是Boosting 算法家族中代表算法,AdaBoost 主要是在整个训练集上维护一个分布权值向量 D( x) t ,用赋予权重的训练集通过弱分类算法产生分类假设 Ht ( x) ,即基分类器,然后计算他的错误率,用得到的错误率去更新分布权值向量 D( x) t ,对错误分类的样本分配更大的权值,正确分类的样本赋予更小的权值。每次更新后用相同的弱分类算法产生新的分类假设,这些分类假设的序列构成多分类器。对这些多分类器用加权的方法进行联合,最后得到决策结果。这种方法不要求产生的单个分类器有高的识别率,即不要求寻找识别率很高的基分类算法,只要产生的基分类器的识别率大于 015 ,就可作为该多分类器序列中的一员。
寻找多个识别率不是很高的弱分类算法比寻找一个识别率很高的强分类算法要容易得多,AdaBoost 算法的任务就是完成将容易找到的识别率不高的弱分类算法提升为识别率很高的强分类算法,这也是 AdaBoost 算法的核心指导思想所在,如果算法完成了这个任务,那么在分类时,只要找到一个比随机猜测略好的弱分类算法,就可以将其提升为强分类算法,而不必直接去找通常情况下很难获得的强分类算法。通过产生多分类器最后联合的方法提升弱分类算法,让他变为强的分类算法,也就是给定一个弱的学习算法和训练集,在训练集的不同子集上,多次调用弱学习算法,最终按加权方式联合多次弱学习算法的预测结果得到最终学习结果。包含以下2点:

样本的权重

AdaBoost 通过对样本集的操作来训练产生不同的分类器,他是通过更新分布权值向量来改变样本权重的,也 就是提高分错样本的权重,重点对分错样本进行训练。
(1) 没有先验知识的情况下,初始的分布应为等概分布,也就是训练集如果有 n个样本,每个样本的分布概率为1/ n。(2) 每次循环后提高错误样本的分布概率,分错的样本在训练集中所占权重增大,使得下一次循环的基分类器能够集中力量对这些错误样本进行判断。

弱分类器的权重

最后的强分类器是通过多个基分类器联合得到的,因此在最后联合时各个基分类器所起的作用对联合结果有很大的影响,因为不同基分类器的识别率不同,他的作用就应该不同,这里通过权值体现他的作用,因此识别率越高的基分类器权重越高,识别率越低的基分类器权重越低。权值计算如下: 基分类器的错误率: e = ∑( ht ( x i) ≠yi) Di (1) 基分类器的权重:W t = F( e) ,由基分类器的错误率计算他的权重。2.3 算法流程及伪码描述 算法流程描述 算法流程可用结构图 1 描述,如图 1 所示 AdaBoost重复调用弱学习算法(多轮调用产生多个分类器) ,首轮调用弱学习算法时,按均匀分布从样本集中选取子集作为该次训练集,以后每轮对前一轮训练失败的样本,赋予较大的分布权值( Di 为第i 轮各个样本在样本集中参与训练的概率) ,使其在这一轮训练出现的概率增加,即在后面的训练学习中集中对比较难训练的样本进行学习,从而得到 T个弱的基分类器, h1 , h2 , …, ht ,其中 ht 有相应的权值 w t ,并且其权值大小根据该分类器的效果而定。最后的分类器由生成的多个分类器加权联合产生。 

图片 84

 

图片 85

人脸对齐流程

图片 86

分为如下几步:

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

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

给定两个属性向量, A 和B,其余弦相似性θ由点积和向量长度给出,如下所示:

这样就算完了吗?不,既然要实现,就要细看一下以上用到的各类算法细节:

图片 87

图片 88

例如,对于右脸颊,线性SVM的识别准确率达到了24.44%,而具有径向基函数的非线性SVM的识别率仅为2.77%。

Training on SFC

  • 训练使用的人数不同(1.5K/3.3K/4.4K)
  • 训练使用的照片数目不同(10%/20%/50%)
  • 使用的网络不同(去掉第三层/去掉第4、5层/去掉第3、4、5层)

图片 89

人类可以不受环境影响的识别人脸,那么计算机也可以吗?

在前DL时代,以VIPL实验室三代半SDK为例,关键技术点包括1)分块人脸特征融合:Gabor特征 LPQ特征。 2)子空间学习进行特征降(PCA LDA)。3)融合多尺度的人脸归一化模板。SDK3.5的相关技术在FRGC实验4上取得了0.1%错误接受率条件下96%的确认率,至今依然是FRGC数据集上最好结果。

图片 90

图片 91

遮挡脸部的示例图片

4.5 特征区分性

存在某个神经单元,只使用普通的阈值法,就能针对某个人得到97%的正确率。不同的神经单元针对不同的人或不同的种族或不同的年龄都有很强的区分性。在这里,对每个单元的激活程度进行由高到低排序,可以得到下图所示:

图片 92

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

但值得说的是,这种分析方法对我们很有启发。卷积神经网络的输出的含义是什么,很难解释,通过这种方法,或许可以得到一些结论。

来自LFW数据库的面部部分样本

=================================

图片 93

LDA等子空间学习方法和LPP等流行学习方法。在深度学习方法流行之后,代表性方法为从原始的图像空间直接学习判别性的人脸表示。

图片 94

三元组的选择

很少的数据就可以产生很多的三元组,如果三元组选的不得法,那么模型要很久很久才能收敛。因而,三元组的选择特别重要。

当然最暴力的方法就是对于每个样本,从所有样本中找出离他最近的反例和离它最远的正例,然后进行优化。这种方法有两个弊端:

  • 耗时,基本上选三元组要比训练还要耗时了,且等着吧。
  • 容易受不好的数据的主导,导致得到的模型会很差。

所以,为了解决上述问题,论文中提出了两种策略。

  • 每N步线下在数据的子集上生成一些triplet
  • 在线生成triplet,在每一个mini-batch中选择hard pos/neg 样例。

为了使mini-batch中生成的triplet合理,生成mini-batch的时候,保证每个mini-batch中每个人平均有40张图片。然后随机加一些反例进去。在生成triplet的时候,找出所有的anchor-pos对,然后对每个anchor-pos对找出其hard neg样本。这里,并不是严格的去找hard的anchor-pos对,找出所有的anchor-pos对训练的收敛速度也很快。

除了上述策略外,还可能会选择一些semi-hard的样例,所谓的semi-hard即不考虑alpha因素,即:

图片 95

4.2 实验设置

训练数据共有12000人,290000张图像。其中2000人用于在训练DeepID2 时做验证集,以及训练联合贝叶斯模型。

在深度学习出现以前,人脸识别方法一般分为高维人工特征提取(例如:LBP,Gabor等)和降维两个步骤,代表性的降维方法有PCA,

图片 96

Google发表于CVPR2015的工作FaceNet采用了22层的深层卷积网络和海量的人脸数据(800万人的2亿张图像)以及常用于图像检索任务的Triplet Loss损失函数。值得一提的是,由于人脸类别数达到800万类,如果使用softmax loss,输出层节点将达到800万个,需要至少32GB显存(假设上一个隐层节点1024个,采用单精度浮点数),而Triplet Loss则不需要额外占用显存。FaceNet在LFW数据集上十折平均精度达到99.63%,这也是迄今为止正式发表的论文中的最好结果,几乎宣告了LFW上从2008年到2015年长达8年之久的性能竞赛的结束。

一、综述

废话说了这么多,正文开始~

网络架构

大体架构与普通的卷积神经网络十分相似:

图片 97

如图所示:Deep Architecture就是卷积神经网络去掉sofmax后的结构,经过L2的归一化,然后得到特征表示,基于这个特征表示计算三元组损失。

4.1 网络结构变化

相比于DeepID2,DeepID2 做了如下三点修改:

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

最后的DeepID2 的网络结构如下:

图片 98

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

目标函数

在看FaceNet的目标函数前,其实要想一想DeepID2和DeepID2 算法,他们都添加了验证信号,但是是以加权的形式和softmax目标函数混合在一起。Google做的更多,直接替换了softmax。

图片 99

所谓的三元组就是三个样例,如(anchor, pos, neg),其中,x和p是同一类,x和n是不同类。那么学习的过程就是学到一种表示,对于尽可能多的三元组,使得anchor和pos的距离,小于anchor和neg的距离。即:

图片 100

所以,变换一下,得到目标函数:

图片 101

目标函数的含义就是对于不满足条件的三元组,进行优化;对于满足条件的三元组,就pass先不管。

数据和评测

在人脸识别领域,我一直认为数据的重要性很大,甚至强于模型,google的数据量自然不能小觑。其训练数据有100M-200M张图像,分布在8M个人上。

当然,google训练的模型在LFW和youtube Faces DB上也进行了评测。

下面说明了多种变量对最终效果的影响

图中红色框框就是在做detection,白色点点就是在做alignment。

DeepID家族可以看作是DL时代人脸识别领域的一组代表性工作。最早的DeepID网络包括四个卷积层,采用softmax损失函数。DeepID2在DeepID网络的基础上,同时考虑了分类损失(identity loss) 和确认损失(verification loss),这两种损失在Caffe深度学习框架中分别可以采用softmaxwithloss层和contrastive loss层来实现。DeepID2 网络则是在DeepID2的基础上,增加了每一层的辅助损失函数(类似Deep Supervised Network)。

图片 102

网络模型

论文使用了两种卷积模型:

  • 第一种是Zeiler&Fergus架构,22层,140M参数,1.6billion FLOPS(FLOPS是什么?)。称之为NN1。
  • 第二种是GoogleNet式的Inception模型。模型参数是第一个的20分之一,FLOPS是第一个的五分之一。
  • 基于Inception模型,减小模型大小,形成两个小模型。 
    • NNS1:26M参数,220M FLOPS。
    • NNS2:4.3M参数,20M FLOPS。
  • NN3与NN4和NN2结构一样,但输入变小了。 
    • NN2原始输入:224×224
    • NN3输入:160×160
    • NN4输入:96×96

其中,NNS模型可以在手机上运行。

其实网络模型的细节不用管,将其当做黑盒子就可以了。

Results on LFW

图片 103

总结

三元组的目标函数并不是这篇论文首创,我在之前的一些Hash索引的论文中也见过相似的应用。可见,并不是所有的学习特征的模型都必须用softmax。用其他的效果也会好。

三元组比softmax的优势在于 

softmax不直接,(三元组直接优化距离),因而性能也不好。

softmax产生的特征表示向量都很大,一般超过1000维。

FaceNet并没有像DeepFace和DeepID那样需要对齐。

FaceNet得到最终表示后不用像DeepID那样需要再训练模型进行分类,直接计算距离就好了,简单而有效。

论文并未探讨二元对的有效性,直接使用的三元对。

 

5、deep face recognition

3.1 两种信号及训练过程

识别信号公式如下:

图片 104

验证信号公式如下:

图片 105

由于验证信号的计算需要两个样本,所以整个卷积神经网络的训练过程也就发生了变化,之前是将全部数据切分为小的batch来进行训练。现在则是每次迭代时随机抽取两个样本,然后进行训练。训练过程如下:

图片 106

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

4.3 实验结论

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

图片 107

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

二、技术总结

2.2 DeepID实验设置

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

图片 108

在DeepID的实验过程中,使用的外部数据集为CelebFaces ,有10177人,202599张图片;8700人训练DeepID,1477人训练Joint Bayesian分类器。切分的patch(也就是上图这样的数据)数目为100,使用了五种不同的scale。每张图片最后形成的向量长度为32000,使用PCA降维到150。如此,达到97.20的效果。使用某种Transfer Learning的算法后,达到97.45%的最终效果。

DeepFace基本框架

人脸识别的基本流程是:

detect -> aligh -> represent -> classify

作者建立了一个分类回归树,就叫CRT好了。这个CRT在距离根节点比较近的几层偏重于分类,在接近叶子节点的几层偏重于回归,具体实现上,每个节点究竟用于回归还是分类呢?用一个概率p表示用于分类的概率,自然回归就是1-p了。而这个p随着深数的深度减小,作者采用了一个经验公式:

图片 109

2014年以来,深度学习 大数据(海量的有标注人脸数据)成为人脸识别领域的主流技术路线,其中两个重要的趋势为:1)网络变大变深(VGGFace16层,FaceNet22层)。2)数据量不断增大(DeepFace400万,FaceNet2亿),大数据成为提升人脸识别性能的关键。

4.6 遮挡鲁棒性

在训练数据中没有遮挡数据的情况下,DeepID2 自动就对遮挡有了很好的鲁棒性。有两种方式对人脸进行多种尺度的遮挡,第一种是从下往上进行遮挡,从10%-70%。第二种是不同大小的黑块随机放,黑块的大小从10×10到70×70。

图片 110

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

图片 111

图片 112

本文由bv1946伟德入口发布于科学,转载请注明出处:人脸识别新突破,即使只露出半张脸

关键词: