以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测、行人跟踪、甚至到了动态物体的跟踪。由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理。而且算法已经由以前的Adaboots、PCA等传统的统计学方法转变为CNN、RCNN等深度学习及其变形的方法。现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界、工业界和国家的支持。
之后的内容主要参考了下面的链接,这个链接详细总结了人脸识别算法的发展。
首先看看现在的研究现状。如上的发展趋势可以知道,现在的主要研究方向是利用深度学习的方法解决视频人脸识别。
主要的研究人员:
如下:中科院计算所的山世光教授、中科院生物识别研究所的李子青教授、清华大学的苏光大教授、香港中文大学的汤晓鸥教授、Ross B. Girshick等等。下面有一个连接主要是汇总了当前计算机视觉方向的牛人和实验室:计算机视觉研究人员汇总 。
主要开源项目:
主要软件API/SDK:
主要的人脸识别图像库:
目前公开的比较好的人脸图像库有LFW(Labelled Faces in the Wild)和YFW(Youtube Faces in the Wild)。现在的实验数据集基本上是来源于LFW,而且目前的图像人脸识别的精度已经达到99%,基本上现有的图像数据库已经被刷爆。下面是现有人脸图像数据库的总结:
现在在中国做人脸识别的公司已经越来越多,应用也非常的广泛。其中市场占有率最高的是汉王科技。主要公司的研究方向和现状如下:
这一部分将简述人脸识别中主要用到的技术。包含人脸识别的过程、人脸识别分类以及人脸识别算法发展。我将先简单的从图像人脸识别过程开始阐述,最后重点将放在人脸跟踪。
人脸识别主要分为四大块:人脸定位(face detection)、 人脸校准(face alignment)、 人脸确认(face verification)、人脸鉴别(face identification)。下面的概念主要参考自:deep face recognition。
人脸定位(face detection):
对图像中的人脸进行检测,并将结果用矩形框框出来。在openCV中有直接能拿出来用的Harr分类器。
人脸校准(face alignment):
对检测到的人脸进行姿态的校正,使其人脸尽可能的”正”,通过校正可以提高人脸识别的精度。校正的方法有2D校正、3D校正的方法,3D校正的方法可以使侧脸得到较好的识别。 在进行人脸校正的时候,会有检测特征点的位置这一步,这些特征点位置主要是诸如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等位置,知道了这些特征点的位置后,做一下位置驱动的变形,脸即可被校”正”了。如下图所示:
这里介绍一种MSRA在14年的技术:Joint Cascade Face Detection and Alignment(ECCV14)。这篇文章直接在30ms的时间里把detection和alignment都给做了。
人脸确认(face verification):
Face verification,人脸校验是基于pair matching的方式,所以它得到的答案是“是”或者“不是”。在具体操作的时候,给定一张测试图片,然后挨个进行pair matching,matching上了则说明测试图像与该张匹配上的人脸为同一个人的人脸。一般在小型办公室人脸刷脸打卡系统中采用的(应该)是这种方法,具体操作方法大致是这样一个流程:离线逐个录入员工的人脸照片(一个员工录入的人脸一般不止一张),员工在刷脸打卡的时候相机捕获到图像后,通过前面所讲的先进行人脸检测,然后进行人脸校正,再进行人脸校验,一旦match结果为“是”,说明该名刷脸的人员是属于本办公室的,人脸校验到这一步就完成了。在离线录入员工人脸的时候,我们可以将人脸与人名对应,这样一旦在人脸校验成功后,就可以知道这个人是谁了。上面所说的这样一种系统优点是开发费用低廉,适合小型办公场所,缺点是在捕获时不能有遮挡,而且还要求人脸姿态比较正(这种系统我们所有,不过没体验过)。下图给出了示意说明:
人脸识别(face identification/recognition):
Face identification或Face recognition,人脸识别正如下图所示的,它要回答的是“我是谁?”,相比于人脸校验采用的pair matching,它在识别阶段更多的是采用分类的手段。它实际上是对进行了前面两步即人脸检测、人脸校正后做的图像(人脸)分类。
根据上面四个概念的介绍,我们可以了解到人脸识别主要包括三个大的、独立性强的模块:
我们将上面的步骤进行详细的拆分,得到下面的过程图:
现在随着人脸识别技术的发展,人脸识别技术主要分为了三类:一是基于图像的识别方法、二是基于视频的识别方法、三是三维人脸识别方法。
基于图像的识别方法:
这个过程是一个静态的图像识别过程,主要利用图像处理。主要的算法有PCA、EP、kernel method、 Bayesian Framwork、SVM 、HMM、Adaboot等等算法。但在2014年,人脸识别利用Deep learning 技术取得了重大突破,为代表的有deepface的97.25%、face++的97.27%,但是deep face的训练集是400w集的,而同时香港中文大学汤晓鸥的Gussian face的训练集为2w。
基于视频的实时识别方法:
这个过程可以看出人脸识别的追踪过程,不仅仅要求在视频中找到人脸的位置和大小,还需要确定帧间不同人脸的对应关系。
我们先从DeepFace谈起,DeepFace有一个系列从DeepFace 到 DeepId系列,然后最终回到人脸跟踪(face tracking)。
参考论文(资料):
1. DeepFace论文。DeepFace:Closing the Gap to Human-level Performance in Face Verificaion
2. 卷积神经网络了解博客。http://blog.csdn.net/zouxy09/article/details/8781543
3. 卷积神经网络的推导博客。http://blog.csdn.net/zouxy09/article/details/9993371/
4. Note on convolution Neural Network.
5. Neural Network for Recognition of Handwritten Digits
6. DeepFace博文:http://blog.csdn.net/Hao_Zhang_Vision/article/details/52831399?locationNum=2&fps=1
DeepFace是FaceBook提出来的,后续有DeepID和FaceNet出现。而且在DeepID和FaceNet中都能体现DeepFace的身影,所以DeepFace可以谓之CNN在人脸识别的奠基之作,目前深度学习在人脸识别中也取得了非常好的效果。所以这里我们先从DeepFace开始学习。
在DeepFace的学习过程中,不仅将DeepFace所用的方法进行介绍,也会介绍当前该步骤的其它主要算法,对现有的图像人脸识别技术做一个简单、全面的叙述。
face detection -> face alignment -> face verification -> face identification
haar分类器:
人脸检测(detection)在opencv中早就有直接能拿来用的haar分类器,基于Viola-Jones算法。
Adaboost算法(级联分类器):
1.参考论文: Robust Real-Time face detection 。
2. 参考中文博客:http://blog.csdn.net/cyh_24/article/details/39755661
3. 博客:http://blog.sina.com.cn/s/blog_7769660f01019ep0.html
本文中采用了基于检测点的人脸检测方法(fiducial Point Detector)。
效果如下:
cascade pose regression:
2D alignment:
3D alignment:
效果如下:
上面的2D alignment对应(b)图,3D alignment依次对应(c) ~ (h)。
LBP && joint Beyesian:
通过高维LBP跟Joint Bayesian这两个方法结合。
DeepID系列:
将七个联合贝叶斯模型使用SVM进行融合,精度达到99.15%
论文中通过一个多类人脸识别任务来训练深度神经网络(DNN)。网络结构如上图所示。
结构参数:
经过3D对齐以后,形成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下:
提取低水平特征:
过程如下所示:
上述3层网络是为了提取到低水平的特征,如简单的边缘特征和纹理特征。Max-polling层使得卷积网络对局部的变换更加鲁棒。如果输入是校正后的人脸,就能使网络对小的标记误差更加鲁棒。然而这样的polling层会使网络在面部的细节结构和微小纹理的精准位置上丢失一些信息。因此,文中只在第一个卷积层后面接了Max-polling层。这些前面的层称之为前端自适应的预处理层级。然而对于许多计算来讲,这是很必要的,这些层的参数其实很少。它们仅仅是把输入图像扩充成一个简单的局部特征集。
后续层:
L4,L5,L6都是局部连接层,就像卷积层使用滤波器一样,在特征图像的每一个位置都训练学习一组不同的滤波器。由于校正后不同区域的有不同的统计特性,卷积网络在空间上的稳定性的假设不能成立。比如说,相比于鼻子和嘴巴之间的区域,眼睛和眉毛之间的区域展现出非常不同的表观并且有很高的区分度。换句话说,通过利用输入的校正后的图像,定制了DNN的结构。
使用局部连接层并没有影响特征提取时的运算负担,但是影响了训练的参数数量。仅仅是由于有如此大的标记人脸库,我们可以承受三个大型的局部连接层。局部连接层的输出单元受到一个大型的输入图块的影响,可以据此调整局部连接层的使用(参数)(不共享权重)
比如说,L6层的输出受到一个74*74*3的输入图块的影响,在校正后的人脸中,这种大的图块之间很难有任何统计上的参数共享。
顶层:
最后,网络顶端的两层(F7,F8)是全连接的:每一个输出单元都连接到所有的输入。这两层可以捕捉到人脸图像中距离较远的区域的特征之间的关联性。比如,眼睛的位置和形状,与嘴巴的位置和形状之间的关联性(这部分也含有信息)可以由这两层得到。第一个全连接层F7的输出就是我们原始的人脸特征表达向量。
在特征表达方面,这个特征向量与传统的基于LBP的特征描述有很大区别。传统方法通常使用局部的特征描述(计算直方图)并用作分类器的输入。
最后一个全连接层F8的输出进入了一个K-way的softmax(K是类别个数),即可产生类别标号的概率分布。用Ok表示一个输入图像经过网络后的第k个输出,即可用下式表达输出类标号k的概率:
训练的目标是最大化正确输出类别(face 的id)的概率。通过最小化每个训练样本的叉熵损失实现这一点。用k表示给定输入的正确类别的标号,则叉熵损失是:
通过计算叉熵损失L对参数的梯度以及使用随机梯度递减的方法来最小化叉熵损失。
梯度是通过误差的标准反向传播来计算的。非常有趣的是,本网络产生的特征非常稀疏。超过75%的顶层特征元素是0。这主要是由于使用了ReLU激活函数导致的。这种软阈值非线性函数在所有的卷积层,局部连接层和全连接层(除了最后一层F8)都使用了,从而导致整体级联之后产生高度非线性和稀疏的特征。稀疏性也与使用使用dropout正则化有关,即在训练中将随机的特征元素设置为0。我们只在F7全连接层使用了dropout.由于训练集合很大,在训练过程中我们没有发现重大的过拟合。
给出图像I,则其特征表达G(I)通过前馈网络计算出来,每一个L层的前馈网络,可以看作是一系列函数:
归一化:
在最后一级,我们把特征的元素归一化成0到1,以此降低特征对光照变化的敏感度。特征向量中的每一个元素都被训练集中对应的最大值除。然后进行L2归一化。由于我们采用了ReLU激活函数,我们的系统对图像的尺度不变性减弱。
对于输出的4096-d向量:
该系统中,归一化后的DeepFace特征向量与传统的基于直方图的特征(如LBP)有一下相同之处:
卡方距离计算公式如下:
文章中也提到了端到端的度量学习方法,一旦学习(训练)完成,人脸识别网络(截止到F7)在输入的两张图片上重复使用,将得到的2个特征向量直接用来预测判断这两个输入图片是否属于同一个人。这分为以下步骤:
a. 计算两个特征之间的绝对差别;
b,一个全连接层,映射到一个单个的逻辑单元(输出相同/不同)。
result on LFW:
result on YTF:
DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,使用了对齐方法。论文认为神经网络能够work的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,此时,可以用卷积神经网络来学习特征。
定义:
人脸跟踪是要准确的定位人脸、并跟踪人脸。
现有产品:
这里介绍微软开发一款face tracking 产品 - kinect, 但这个方法必须使用Kinect硬件(比较昂贵)。 想要详细了解,可以看Kinect SDK 1.5 Face Tracking。 中文资料可以参考参考这篇博文:http://brightguo.com/kinect-face-tracking/
现在直接做人脸跟踪的人还很少,大部分都是在做目标跟踪(object tracking)。所以这里先谈现在object tracking的算法。 这里我们直接以算法为线索,谈论该算法的产生、特点、现有的开源代码。
产生:
TLD算法全称Tracking Learning Detection。它是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long term tracking)跟踪算法。
特点:
资料:
原文:http://blog.csdn.net/neu_chenguangq/article/details/52983093