人脸检测(Face Detection):人脸检测用于肯定人脸在图像中的大小和位置,即解决“人脸在哪里”的问题,把真正的人脸区域从图像中裁剪出来,便于后续的人脸特征分析和识别。html
人脸对齐(Face Alignment):同一我的在不一样的图像序列中可能呈现出不一样的姿态和表情,这种状况是不利于人脸识别的。因此有必要将人脸图像都变换到一个统一的角度和姿态,这就是人脸对齐。算法
人脸特征表示(Feature Representation):人脸特征表示是人脸识别中最为重要的一步,它接受的输入是标准化的人脸图像,经过特征建模获得向量化的人脸特征,最后经过分类器判别获得识别的结果。数据库
LFW:5749 人的13233张人脸图像,其中有1680人有两张或以上的图像。网络
YouTube Faces DB:面部视频数据集,包含3425个视频,1595个不一样的人。框架
CASIA-FaceV5:500我的的25000张亚洲人脸图片。less
其余数据集及其下载连接:都是百度云下载机器学习
早期的人脸检测算法使用了模板匹配技术,即用一我的脸模板图像与被检测图像中的各个位置进行匹配,肯定这个位置处是否有人脸。而后可使用一些机器学习算法用于解决该问题,包括神经网络,支持向量机等。以上都是针对图像中某个区域进行人脸-非人脸二分类的判别。ide
这种方法的表明性成果是Rowley等人提出来的算法:用一个20*20的人脸模板图像和被检测图像的各个位置进行匹配,每次在被检测图像上截取出一个20*20的滑动窗口,将模板和窗口进行比较,就能够检测窗口中是否包含人脸(模型参数的响应值高就说明包含人脸)。这种方法只能解决近似正面的人脸检测问题,在其余角度的人脸检测效果并很差。函数
为了解决多角度检测问题,Rowly等人提出来了一个新的方法:整个系统由两个神经网络构成,第一个网络用于估计人脸的角度,第二个用于判断是否为人脸。角度估计器输出一个旋转角度,而后用整个角度对检测窗进行旋转,而后用第二个网络对旋转后的图像进行判断,肯定是否为人脸。性能
Rowley的方法有不错的精度,因为分类器的设计相对复杂并且采用的是密集滑动窗口进行采样分类致使其速度太慢。
boost算法是基于PAC学习理论(Probably Approximately Correct,几率近似正确)而创建的一套集成学习算法。其根本思想在于经过多个简单的弱分类器,构建出准确率很高的强分类器,PAC学习理论证明了这一方法的可行性。
在2001年Viola和Jones设计了一种人脸检测算法。它使用简单的Haar-like特征和级联的AdaBoost分类器构造检测器,检测速度较以前的方法有2个数量级的提升,而且保持了很好的精度,这就是著名的VJ框架。VJ框架是人脸检测历史上第一个最具备里程碑意义的一个成果,奠基了基于AdaBoost目标检测框架的基础。
用级联AdaBoost分类器进行目标检测的思想是:用多个AdaBoost分类器合做完成对候选框的分类,这些分类器组成一个流水线,对滑动窗口中的候选框图像进行断定,肯定它是人脸仍是非人脸。
在这一系列AdaBoost分类器中,前面的强分类器设计很简单,包含的弱分类器不多,能够快速排除掉大量的不是人脸的窗口,但也可能会把一些不是人脸的图像断定为人脸。若是一个候选框经过了第一级分类器的筛选即被断定为人脸,则送入下一级分类器中进行断定,以此类推。若是一个待检测窗口经过了全部的强分类器,则认为是人脸,不然是非人脸。
卷积神经网络在图像分类问题上取得成功以后很快被用于人脸检测问题,在精度上大幅度超越以前的AdaBoost框架,当前已经有一些高精度、高效的算法。直接用滑动窗口加卷积网络对窗口图像进行分类的方案计算量太大很难达到实时,使用卷积网络进行人脸检测的方法采用各类手段解决或者避免这个问题。
算法流程:
构建多尺度的人脸图像金字塔,12-net将密集的扫描这整幅图像(不一样的尺寸),快速的剔除掉超过90%的检测窗口,剩下来的检测窗口送入12-calibration-net调整它的尺寸和位置,让它更接近潜在的人脸图像的附近。
采用非极大值抑制(NMS)合并高度重叠的检测窗口,保留下来的候选检测窗口将会被归一化到24x24做为24-net的输入,这将进一步剔除掉剩下来的将近90%的检测窗口。和以前的过程同样,经过24-calibration-net矫正检测窗口,并应用NMS进一步合并减小检测窗口的数量。
将经过以前全部层级的检测窗口对应的图像区域归一化到48x48送入48-net进行分类获得进一步过滤的人脸候选窗口。而后利用NMS进行窗口合并,送入48-calibration-net矫正检测窗口做为最后的输出。
MTCNN(Multi-task Cascaded Convolutional Networks,多任务卷积神经网络):MTCNN是多任务的一个方法,它将人脸区域检测和人脸关键点检测放在了一块儿。同Cascade CNN同样也是基于cascade的框架,可是总体思路更加巧妙合理。MTCNN整体来讲分为三个部分:PNet、RNet和ONet。
算法流程:
第二阶段的人脸识别算法广泛采用了人工特征 + 分类器的思路。分类器有成熟的方案,如神经网络,支持向量机,贝叶斯等。这里的关键是人工特征的设计,它要能有效的区分不一样的人。
描述图像的不少特征都前后被用于人脸识别问题,包括HOG(Histogram of oriented gradient,方向梯度直方图)、SIFT(Scale-invariant Feature Transform,尺度不变特征转换 )、LBP(Local Binary Patterns,局部二值模式)等。它们中的典型表明是LBP特征,这种特征简单却有效。LBP特征计算起来很是简单,部分解决了光照敏感问题,但仍是存在姿态和表情的问题。
联合贝叶斯是对贝叶斯人脸的改进方法,选用LBP和LE做为基础特征,将人脸图像的差别表示为相同人因姿态、表情等致使的差别以及不一样人间的差别两个因素,用潜在变量组成的协方差,创建两张人脸的关联。文章的创新点在于将两我的脸表示进行联合建模,在人脸联合建模的时候,又使用了人脸的先验知识,将两张人脸的建模问题变为单张人脸图片的统计计算,更好的验证人脸的相关性,该方法在LFW上取得了92.4%的准确率。
人工特征的巅峰之做是出自2013年MSRA的"Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification" ,这是一篇关于如何使用高维度特征在人脸验证中的文章。做者主要以LBP为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高。
第三个阶段是基于深度学习的方法,自2012年深度学习在ILSVRC-2012大放异彩后,不少研究者都在尝试将其应用在本身的方向,这极大的推进了深度学习的发展。卷积神经网络在图像分类中显示出了巨大的威力,经过学习获得的卷积核明显优于人工设计的特征+分类器的方案。在人脸识别的研究者利用卷积神经网络(CNN)对海量的人脸图片进行学习,而后对输入图像提取出对区分不一样人的脸有用的特征向量,替代人工设计的特征。
在前期,研究人员在网络结构、输入数据的设计等方面尝试了各类方案,而后送入卷积神经网络进行经典的目标分类模型训练;在后期,主要的改进集中在损失函数上,即迫使卷积网络学习获得对分辨不一样的人更有效的特征,这时候人脸识别领域完全被深度学习改造了!
DeepFace由Facebook提出,是深度卷积神经网络在人脸识别领域的奠定之做,文中使用了3D模型来作人脸对齐任务,深度卷积神经网络针对对齐后的人脸Patch进行多类的分类学习,使用的是经典的交叉熵损失函数进行问题优化,最后经过特征嵌入获得固定长度的人脸特征向量。Backbone网络使用了多层局部卷积结构,缘由是但愿网络的不一样卷积核能学习人脸不一样区域的特征,但会致使参数量增大,要求数据量很大,回过头去看该策略并非十分必要。
DeepFace在LFW上取得了97.35%的准确率,已经接近了人类的水平。相比于1997年那篇基于卷积神经网络的40我的400张图的数据规模,Facebook搜集了4000我的400万张图片进行模型训练。
以后Google推出FaceNet,使用三元组损失函数(Triplet Loss)代替经常使用的Softmax交叉熵损失函数,在一个超球空间上进行优化使类内距离更紧凑,类间距离更远,最后获得了一个紧凑的128维人脸特征,其网络使用GoogLeNet的Inception模型,模型参数量较小,精度更高,在LFW上取得了99.63%的准确率,这种损失函数的思想也能够追溯到早期的LDA算法。