人脸识别学习笔记一:入门篇

1、人脸识别概述
1.人脸识别的困难之处
  • 不一样我的之间的区别不大:大部分人脸的结构都很类似,甚至人脸器官的结构外形都很类似。
  • 人脸的外形很不稳定:人的面部表情多变,不一样的观察角度、光照条件等都会影响人脸的视觉图像。
2.人脸识别的典型流程
  • 人脸检测(Face Detection):人脸检测用于肯定人脸在图像中的大小和位置,即解决“人脸在哪里”的问题,把真正的人脸区域从图像中裁剪出来,便于后续的人脸特征分析和识别。html

    中星微AI刷新WIDER FACE人脸检测世界纪录

  • 人脸对齐(Face Alignment):同一我的在不一样的图像序列中可能呈现出不一样的姿态和表情,这种状况是不利于人脸识别的。因此有必要将人脸图像都变换到一个统一的角度和姿态,这就是人脸对齐。算法

    人脸对齐例子

  • 人脸特征表示(Feature Representation):人脸特征表示是人脸识别中最为重要的一步,它接受的输入是标准化的人脸图像,经过特征建模获得向量化的人脸特征,最后经过分类器判别获得识别的结果。数据库

    一个完整的人脸识别流程

2、经常使用数据集

LFW:5749 人的13233张人脸图像,其中有1680人有两张或以上的图像。网络

YouTube Faces DB:面部视频数据集,包含3425个视频,1595个不一样的人。框架

CASIA-FaceV5:500我的的25000张亚洲人脸图片。less

其余数据集及其下载连接:都是百度云下载机器学习

3、人脸检测算法介绍
1.基于模版匹配的算法

早期的人脸检测算法使用了模板匹配技术,即用一我的脸模板图像与被检测图像中的各个位置进行匹配,肯定这个位置处是否有人脸。而后可使用一些机器学习算法用于解决该问题,包括神经网络,支持向量机等。以上都是针对图像中某个区域进行人脸-非人脸二分类的判别。ide

这种方法的表明性成果是Rowley等人提出来的算法:用一个20*20的人脸模板图像和被检测图像的各个位置进行匹配,每次在被检测图像上截取出一个20*20的滑动窗口,将模板和窗口进行比较,就能够检测窗口中是否包含人脸(模型参数的响应值高就说明包含人脸)。这种方法只能解决近似正面的人脸检测问题,在其余角度的人脸检测效果并很差。函数

基于模版匹配的人脸检测算法

为了解决多角度检测问题,Rowly等人提出来了一个新的方法:整个系统由两个神经网络构成,第一个网络用于估计人脸的角度,第二个用于判断是否为人脸。角度估计器输出一个旋转角度,而后用整个角度对检测窗进行旋转,而后用第二个网络对旋转后的图像进行判断,肯定是否为人脸。性能

多角度检测的系统结构

Rowley的方法有不错的精度,因为分类器的设计相对复杂并且采用的是密集滑动窗口进行采样分类致使其速度太慢。

2.基于AdaBoost框架的算法

boost算法是基于PAC学习理论(Probably Approximately Correct,几率近似正确)而创建的一套集成学习算法。其根本思想在于经过多个简单的弱分类器,构建出准确率很高的强分类器,PAC学习理论证明了这一方法的可行性。

在2001年Viola和Jones设计了一种人脸检测算法。它使用简单的Haar-like特征和级联的AdaBoost分类器构造检测器,检测速度较以前的方法有2个数量级的提升,而且保持了很好的精度,这就是著名的VJ框架。VJ框架是人脸检测历史上第一个最具备里程碑意义的一个成果,奠基了基于AdaBoost目标检测框架的基础。

用级联AdaBoost分类器进行目标检测的思想是:用多个AdaBoost分类器合做完成对候选框的分类,这些分类器组成一个流水线,对滑动窗口中的候选框图像进行断定,肯定它是人脸仍是非人脸。

在这一系列AdaBoost分类器中,前面的强分类器设计很简单,包含的弱分类器不多,能够快速排除掉大量的不是人脸的窗口,但也可能会把一些不是人脸的图像断定为人脸。若是一个候选框经过了第一级分类器的筛选即被断定为人脸,则送入下一级分类器中进行断定,以此类推。若是一个待检测窗口经过了全部的强分类器,则认为是人脸,不然是非人脸。

分类器级联进行判断的示意图

3.基于深度学习的算法

卷积神经网络在图像分类问题上取得成功以后很快被用于人脸检测问题,在精度上大幅度超越以前的AdaBoost框架,当前已经有一些高精度、高效的算法。直接用滑动窗口加卷积网络对窗口图像进行分类的方案计算量太大很难达到实时,使用卷积网络进行人脸检测的方法采用各类手段解决或者避免这个问题。

  • Cascade CNN(Cascade Convolutional Neural Networks,级联卷积神经网络):Cascade CNN能够认为是传统技术和深度网络相结合的一个表明,和VJ人脸检测器同样,其包含了多个分类器,这些分类器采用级联结构进行组织,然而不一样的地方在于,Cascade CNN采用卷积网络做为每一级的分类器。

算法流程:

  1. 构建多尺度的人脸图像金字塔,12-net将密集的扫描这整幅图像(不一样的尺寸),快速的剔除掉超过90%的检测窗口,剩下来的检测窗口送入12-calibration-net调整它的尺寸和位置,让它更接近潜在的人脸图像的附近。

  2. 采用非极大值抑制(NMS)合并高度重叠的检测窗口,保留下来的候选检测窗口将会被归一化到24x24做为24-net的输入,这将进一步剔除掉剩下来的将近90%的检测窗口。和以前的过程同样,经过24-calibration-net矫正检测窗口,并应用NMS进一步合并减小检测窗口的数量。

  3. 将经过以前全部层级的检测窗口对应的图像区域归一化到48x48送入48-net进行分类获得进一步过滤的人脸候选窗口。而后利用NMS进行窗口合并,送入48-calibration-net矫正检测窗口做为最后的输出。

Cascade CNN

  • MTCNN(Multi-task Cascaded Convolutional Networks,多任务卷积神经网络):MTCNN是多任务的一个方法,它将人脸区域检测和人脸关键点检测放在了一块儿。同Cascade CNN同样也是基于cascade的框架,可是总体思路更加巧妙合理。MTCNN整体来讲分为三个部分:PNet、RNet和ONet。

    MTCNN网络结构

算法流程:

  1. 首先按不一样比例缩放照片,造成图片的特征金字塔做为P-Net输入。
  2. P-Net主要得到了人脸区域的候选窗口和边界框的回归向量。并用该边界框作回归,对候选窗口进行校准,而后经过NMS来合并高度重叠的候选框。
  3. 而后将候选框输入R-Net网络训练,利用边界框的回归值微调候选窗体,再利用NMS去除重叠窗体。
  4. O-Net功能与R-Net做用相似,只是在去除重叠候选窗口的同时显示五我的脸关键点定位。
4、人脸识别算法介绍
1.早期算法
  • 基于几何特征的算法:人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正由于这些部件的形状、大小和结构上的各类差别才使得世界上每一个人脸千差万别,所以对这些部件的形状和结构关系的几何描述,能够作为人脸识别的重要特征。几何特征最先是用于人脸侧面轮廓的描述与识别,首先根据侧面轮廓曲线肯定若干显著点,并由这些显著点导出一组用于识别的特征度量如距离、角度等。可是这类方法的精度通常都比较差。
  • 基于模板匹配的算法:从数据库当中提取人脸模板,接着采起必定模板匹配策略,使抓取人脸图像与从模板库提取图片相匹配,由相关性的高低和所匹配的模板大小肯定人脸大小以及位置信息。
  • 子空间算法:子空间算法将人脸图像当成一个高维的向量,将向量投影到低维空间中,投影以后获得的低维向量达到对不一样的人具备良好的区分度。子空间算法的典型表明是PCA(Principal Component Analysis,主成分分析)和LDA(Linear Discriminant Analysis,线性判别分析)。PCA的核心思想是在进行投影以后尽可能多的保留原始数据的主要信息,下降数据的冗余信息,以利于后续的识别。LDA的核心思想是最大化类间差别,最小化类内差别,即保证同一我的的不一样人脸图像在投影以后汇集在一块儿,不一样人的人脸图像在投影以后被用一个大的间距分开。PCA和LDA最后都归结于求解矩阵的特征值和特征向量。PCA和LDA都是线性降维技术,但人脸在高维空间中的分布是非线性的,所以可使用非线性降维算法,典型的表明是流形学习和核(kernel)技术。流形学习假设向量点在高维空间中的分布具备某些几何形状,而后在保持这些几何形状约束的前提下将向量投影到低维空间中,这种投影是经过非线性变换完成的。
2.人工特征+分类器

第二阶段的人脸识别算法广泛采用了人工特征 + 分类器的思路。分类器有成熟的方案,如神经网络,支持向量机,贝叶斯等。这里的关键是人工特征的设计,它要能有效的区分不一样的人。

描述图像的不少特征都前后被用于人脸识别问题,包括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为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高。

MSRA"Feature Master"

3.基于深度学习的算法

第三个阶段是基于深度学习的方法,自2012年深度学习在ILSVRC-2012大放异彩后,不少研究者都在尝试将其应用在本身的方向,这极大的推进了深度学习的发展。卷积神经网络在图像分类中显示出了巨大的威力,经过学习获得的卷积核明显优于人工设计的特征+分类器的方案。在人脸识别的研究者利用卷积神经网络(CNN)对海量的人脸图片进行学习,而后对输入图像提取出对区分不一样人的脸有用的特征向量,替代人工设计的特征。

在前期,研究人员在网络结构、输入数据的设计等方面尝试了各类方案,而后送入卷积神经网络进行经典的目标分类模型训练;在后期,主要的改进集中在损失函数上,即迫使卷积网络学习获得对分辨不一样的人更有效的特征,这时候人脸识别领域完全被深度学习改造了!

DeepFace由Facebook提出,是深度卷积神经网络在人脸识别领域的奠定之做,文中使用了3D模型来作人脸对齐任务,深度卷积神经网络针对对齐后的人脸Patch进行多类的分类学习,使用的是经典的交叉熵损失函数进行问题优化,最后经过特征嵌入获得固定长度的人脸特征向量。Backbone网络使用了多层局部卷积结构,缘由是但愿网络的不一样卷积核能学习人脸不一样区域的特征,但会致使参数量增大,要求数据量很大,回过头去看该策略并非十分必要。

DeepFace在LFW上取得了97.35%的准确率,已经接近了人类的水平。相比于1997年那篇基于卷积神经网络的40我的400张图的数据规模,Facebook搜集了4000我的400万张图片进行模型训练。

DeepFace

以后Google推出FaceNet,使用三元组损失函数(Triplet Loss)代替经常使用的Softmax交叉熵损失函数,在一个超球空间上进行优化使类内距离更紧凑,类间距离更远,最后获得了一个紧凑的128维人脸特征,其网络使用GoogLeNet的Inception模型,模型参数量较小,精度更高,在LFW上取得了99.63%的准确率,这种损失函数的思想也能够追溯到早期的LDA算法。

FaceNet

相关文章
相关标签/搜索