脸部识别_单片机 基于脸部识别 - CSDN
  • 人脸识别主要算法原理

    万次阅读 多人点赞 2019-04-25 15:17:25
    人脸识别主要算法原理 主流的人脸识别技术基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。 1.基于几何特征的方法是最早、最传统的方法,通常需要和其他算法结合才能有比较好的...

    最新人工智能论文:http://paperreading.club

    人脸识别主要算法原理

    主流的人脸识别技术基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。

    1. 基于几何特征的方法是最早、最传统的方法,通常需要和其他算法结合才能有比较好的效果;
    2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。
    3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。

    1. 基于几何特征的方法

    人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以做为人脸识别的重要特征。几何特征最早是用于人脸侧面轮廓的描述与识别,首先根据侧面轮廓曲线确定若干显著点,并由这些显著点导出一组用于识别的特征度量如距离、角度等。Jia 等由正面灰度图中线附近的积分投影模拟侧面轮廓图是一种很有新意的方法。
        采用几何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征,但Roder对几何特征提取的精确性进行了实验性的研究,结果不容乐观。

    可变形模板法可以视为几何特征方法的一种改进,其基本思想是 :设计一个参数可调的器官模型 (即可变形模板),定义一个能量函数,通过调整模型参数使能量函数最小化,此时的模型参数即做为该器官的几何特征。
        这种方法思想很好,但是存在两个问题,一是能量函数中各种代价的加权系数只能由经验确定,难以推广,二是能量函数优化过程十分耗时,难以实际应用。 基于参数的人脸表示可以实现对人脸显著特征的一个高效描述,但它需要大量的前处理和精细的参数选择。同时,采用一般几何特征只描述了部件的基本形状与结构关系,忽略了局部细微特征,造成部分信息的丢失,更适合于做粗分类,而且目前已有的特征点检测技术在精确率上还远不能满足要求,计算量也较大。 

    2. 局部特征分析方法(Local Face Analysis)

        主元子空间的表示是紧凑的,特征维数大大降低,但它是非局部化的,其核函数的支集扩展在整个坐标空间中,同时它是非拓扑的,某个轴投影后临近的点与原图像空间中点的临近性没有任何关系,而局部性和拓扑性对模式分析和分割是理想的特性,似乎这更符合神经信息处理的机制,因此寻找具有这种特性的表达十分重要。基于这种考虑,Atick提出基于局部特征的人脸特征提取与识别方法。这种方法在实际应用取得了很好的效果,它构成了FaceIt人脸识别软件的基础。

    3. 特征脸方法(Eigenface或PCA)

    特征脸方法是90年代初期由Turk和Pentland提出的目前最流行的算法之一,具有简单有效的特点, 也称为基于主成分分析(principal component analysis,简称PCA)的人脸识别方法。
        特征子脸技术的基本思想是:从统计的观点,寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此近似地表征人脸图像。这些特征向量称为特征脸(Eigenface)。

    实际上,特征脸反映了隐含在人脸样本集合内部的信息和人脸的结构关系。将眼睛、面颊、下颌的样本集协方差矩阵的特征向量称为特征眼、特征颌和特征唇,统称特征子脸。特征子脸在相应的图像空间中成子空间,称为子脸空间。计算出测试图像窗口在子脸空间的投影距离,若窗口图像满足阈值比较条件,则判断其为人脸。 
        基于特征分析的方法,也就是将人脸基准点的相对比率和其它描述人脸脸部特征的形状参数或类别参数等一起构成识别特征向量,这种基于整体脸的识别不仅保留了人脸部件之间的拓扑关系,而且也保留了各部件本身的信息,而基于部件的识别则是通过提取出局部轮廓信息及灰度信息来设计具体识别算法。现在Eigenface(PCA)算法已经与经典的模板匹配算法一起成为测试人脸识别系统性能的基准算法;而自1991年特征脸技术诞生以来,研究者对其进行了各种各样的实验和理论分析,FERET'96测试结果也表明,改进的特征脸算法是主流的人脸识别技术,也是具有最好性能的识别方法之一。
        该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、位置、距离等属性,然后再计算出它们的几何特征量,而这些特征量形成一描述该面像的特征向量。其技术的核心实际为“局部人体特征分析”和“图形/神经识别算法。”这种算法是利用人体面部各器官及特征部位的方法。如对应几何关系多数据形成识别参数与数据库中所有的原始参数进行比较、判断与确认。Turk和Pentland提出特征脸的方法,它根据一组人脸训练图像构造主元子空间,由于主元具有脸的形状,也称为特征脸  ,识别时将测试  图像投影到主元子空间上,得到一组投影系数,和各个已知人的人脸图像比较进行识别。Pentland等报告了相当好的结果,在 200个人的 3000幅图像中得到 95%的正确识别率,在FERET数据库上对 150幅正面人脸象只有一个误识别。但系统在进行特征脸方法之前需要作大量预处理工作如归一化等。
        在传统特征脸的基础上,研究者注意到特征值大的特征向量 (即特征脸 )并不一定是分类性能好的方向,据此发展了多种特征 (子空间 )选择方法,如Peng的双子空间方法、Weng的线性歧义分析方法、Belhumeur的FisherFace方法等。事实上,特征脸方法是一种显式主元分析人脸建模,一些线性自联想、线性压缩型BP网则为隐式的主元分析方法,它们都是把人脸表示为一些向量的加权和,这些向量是训练集叉积阵的主特征向量,Valentin对此作了详细讨论。总之,特征脸方法是一种简单、快速、实用的基于变换系数特征的算法,但由于它在本质上依赖于训练集和测试集图像的灰度相关性,而且要求测试图像与训练集比较像,所以它有着很大的局限性。

    基于KL 变换的特征人脸识别方法
    基本原理:
        KL变换是图象压缩中的一种最优正交变换,人们将它用于统计特征提取,从而形成了子空间法模式识别的基础,若将KL变换用于人脸识别,则需假设人脸处于低维线性空间,且不同人脸具有可分性,由于高维图象空间KL变换后可得到一组新的正交基,因此可通过保留部分正交基,以生成低维人脸空间,而低维空间的基则是通过分析人脸训练样本集的统计特性来获得,KL变换的生成矩阵可以是训练样本集的总体散布矩阵,也可以是训练样本集的类间散布矩阵,即可采用同一人的数张图象的平均来进行训练,这样可在一定程度上消除光线等的干扰,且计算量也得到减少,而识别率不会下降。

    4. 基于弹性模型的方法

        Lades等人针对畸变不变性的物体识别提出了动态链接模型 (DLA),将物体用稀疏图形来描述 (见下图),其顶点用局部能量谱的多尺度描述来标记,边则表示拓扑连接关系并用几何距离来标记,然后应用塑性图形匹配技术来寻找最近的已知图形。Wiscott等人在此基础上作了改进,用FERET图像库做实验,用 300幅人脸图像和另外 300幅图像作比较,准确率达到 97.3%。此方法的缺点是计算量非常巨大 。
        Nastar将人脸图像 (Ⅰ ) (x,y)建模为可变形的 3D网格表面 (x,y,I(x,y) ) (如下图所示 ),从而将人脸匹配问题转化为可变形曲面的弹性匹配问题。利用有限元分析的方法进行曲面变形,并根据变形的情况判断两张图片是否为同一个人。这种方法的特点在于将空间 (x,y)和灰度I(x,y)放在了一个 3D空间中同时考虑,实验表明识别结果明显优于特征脸方法。
        Lanitis等提出灵活表现模型方法,通过自动定位人脸的显著特征点将人脸编码为 83个模型参数,并利用辨别分析的方法进行基于形状信息的人脸识别。弹性图匹配技术是一种基于几何特征和对灰度分布信息进行小波纹理分析相结合的识别算法,由于该算法较好的利用了人脸的结构和灰度分布信息,而且还具有自动精确定位面部特征点的功能,因而具有良好的识别效果,适应性强识别率较高,该技术在FERET测试中若干指标名列前茅,其缺点是时间复杂度高,速度较慢,实现复杂。

    5. 神经网络方法(Neural Networks)

    人工神经网络是一种非线性动力学系统,具有良好的自组织、自适应能力。目前神经网络方法在人脸识别中的研究方兴未艾。Valentin提出一种方法,首先提取人脸的 50个主元,然后用自相关神经网络将它映射到 5维空间中,再用一个普通的多层感知器进行判别,对一些简单的测试图像效果较好;Intrator等提出了一种混合型神经网络来进行人脸识别,其中非监督神经网络用于特征提取,而监督神经网络用于分类。Lee等将人脸的特点用六条规则描述,然后根据这六条规则进行五官的定位,将五官之间的几何距离输入模糊神经网络进行识别,效果较一般的基于欧氏距离的方法有较大改善,Laurence等采用卷积神经网络方法进行人脸识别,由于卷积神经网络中集成了相邻像素之间的相关性知识,从而在一定程度上获得了对图像平移、旋转和局部变形的不变性,因此得到非常理想的识别结果,Lin等提出了基于概率决策的神经网络方法 (PDBNN),其主要思想是采用虚拟 (正反例 )样本进行强化和反强化学习,从而得到较为理想的概率估计结果,并采用模块化的网络结构 (OCON)加快网络的学习。这种方法在人脸检测、人脸定位和人脸识别的各个步骤上都得到了较好的应用,其它研究还有 :Dai等提出用Hopfield网络进行低分辨率人脸联想与识别,Gutta等提出将RBF与树型分类器结合起来进行人脸识别的混合分类器模型,Phillips等人将MatchingPursuit滤波器用于人脸识别,国内则采用统计学习理论中的支撑向量机进行人脸分类。
        神经网络方法在人脸识别上的应用比起前述几类方法来有一定的优势,因为对人脸识别的许多规律或规则进行显性的描述是相当困难的,而神经网络方法则可以通过学习的过程获得对这些规律和规则的隐性表达,它的适应性更强,一般也比较容易实现。因此人工神经网络识别速度快,但识别率低 。而神经网络方法通常需要将人脸作为一个一维向量输入,因此输入节点庞大,其识别重要的一个目标就是降维处理。
        PCA的算法描述:利用主元分析法 (即 Principle Component Analysis,简称 PCA)进行识别是由 Anderson和 Kohonen提出的。由于 PCA在将高维向量向低维向量转化时,使低维向量各分量的方差最大,且各分量互不相关,因此可以达到最优的特征抽取。

    6. 其它方法:

    除了以上几种方法,人脸识别还有其它若干思路和方法,包括一下一些:
    1) 隐马尔可夫模型方法(Hidden Markov Model)
    2) Gabor 小波变换+图形匹配
    (1)精确抽取面部特征点以及基于Gabor引擎的匹配算法,具有较好的准确性,能够排除由于面部姿态、表情、发型、眼镜、照明环境等带来的变化。
    (2)Gabor滤波器将Gaussian络函数限制为一个平面波的形状,并且在滤波器设计中有优先方位和频率的选择,表现为对线条边缘反应敏感。
    (3)但该算法的识别速度很慢,只适合于录象资料的回放识别,对于现场的适应性很差。

    3) 人脸等密度线分析匹配方法
    (1) 多重模板匹配方法
    该方法是在库中存贮若干标准面像模板或面像器官模板,在进行比对时,将采样面像所有象素与库中所有模板采用归一化相关量度量进行匹配。
    (2) 线性判别分析方法(Linear Discriminant Analysis,LDA)
    (3)本征脸法
        本征脸法将图像看做矩阵 ,计算本征值和对应的本征向量作为代数特征进行识别 ,具有无需提取眼嘴鼻等几何特征的优点 ,但在单样本时识别率不高 ,且在人脸模式数较大时计算量大 
    (4) 特定人脸子空间(FSS)算法
    该技术来源于但在本质上区别于传统的"特征脸"人脸识别方法。"特征脸"方法中所有人共有一个人脸子空间,而该方法则为每一个体人脸建立一个该个体对象所私有的人脸子空间,从而不但能够更好的描述不同个体人脸之间的差异性,而且最大可能地摈弃了对识别不利的类内差异性和噪声,因而比传统的"特征脸算法"具有更好的判别能力。另外,针对每个待识别个体只有单一训练样本的人脸识别问题,提出了一种基于单一样本生成多个训练样本的技术,从而使得需要多个训练样本的个体人脸子空间方法可以适用于单训练样本人脸识别问题。
    (5)奇异值分解(singular value decomposition,简称SVD)
    是一种有效的代数特征提取方法.由于奇异值特征在描述图像时是稳定的,且具有转置不变性、旋转不变性、位移不变性、镜像变换不变性等重要性质,因此奇异值特征可以作为图像的一种有效的代数特征描述。奇异值分解技术已经在图像数据压缩、信号处理和模式分析中得到了广泛应用.

     

    7. 面像识别的主要商业系统

    90年代中后期以来,一些商业性的面像识别系统开始进入市场。目前,主要商业系统包括:
    ● Visionics公司的FaceIt面像识别系统,该系统基于Rockefeller大学开发的局部特征分析(LFA)算法;
    ● Lau Tech.公司的面像识别/确认系统,采用MIT技术;
    ● Miros公司的Trueface及eTrue身份验证系统,其核心技术为神经网络;
    ● C-VIS公司的面像识别/确认系统;
    ● Banque-Tec.公司的身份验证系统;
    ● Visage Gallery’s 身份认证系统,基于MIT媒体实验室的Eigenface技术;
    ● Plettac Electronic’s FaceVACS出入控制系统;
    ● 台湾的BioID系统,它基于人脸、唇动和语音三者信息融合的Biometrics系统。

    其中,FaceIt系统是最具有代表性的商业产品,目前已在很多地方得到了应用。去年,它在英国用于被称为“Mandrake”的反罪犯系统中,该系统在144个监控摄像机采集的视频序列中搜索已知的罪犯或者嫌疑犯,如发现可能的罪犯,系统将通知中心控制室的警员。
    笔者曾使用过FaceIt系统,并对其进行了各项指标的评测。结果表明,该系统在控制光照、准正面(3坐标轴上的旋转不超过15度)、无饰物的情况下具有较好的识别性能。但在实用过程中也发现,只有训练集人脸图像的采集条件与测试集人脸图像的采集条件基本一致时才能具有良好的识别性能,否则,其性能将急剧下降,尤其光照变化、姿态变化、黑框眼镜、帽子、夸张的表情、胡须和长发等对其性能的影响更大。

    面像识别系统的测试
        基于对面像识别技术在军事安全等领域重要性的考虑,美国国防部的ARPA资助建立了一个对现有面像识别技术进行评测的程序,并分别于1994年8月、1995年3月和1996年9月(截至1997年3月)组织了三次面像识别和人脸确认的性能评测,其目的是要展示面像识别研究的最新进展和最高学术水平,同时发现现有面像识别技术所面临的主要问题,为以后的研究提供方向性指南。尽管该测试只对美国研究机构开放,但它在事实上成为了该领域的公认测试标准,其测试结果已被认为反映了面像识别研究的最高学术水平。
        根据2000年公开发表的FERET’97测试报告,美国南加州大学(USC)、马里兰大学(UMD)、麻省理工学院(MIT)等研究机构的面像识别技术具有最好的识别性能。在训练集和测试集摄像条件相似的200人的识别测试中,几个系统都产生了接近100%的识别率。值得一提的是,即使是最简单的相关匹配算法也具有很高的识别性能。在更大对象集的FERET测试中(人数大于等于1166人),在同一摄像条件下采集的正面图像识别中,最高首选识别率为95%;而对用不同的摄像机和不同的光照条件采集的测试图像,最高首选识别率骤降为82%;对一年后采集的图像测试,最大的准确率仅仅接近51%。
        

    该测试结果表明,目前的面像识别算法对于不同的摄像机、不同的光照条件和年龄变化的适应能力非常差,理应得到研究者的足够重视。而且值得注意的是,该测试中所用的人脸图像均为比较标准的正面人脸图像,姿态变化非常小,也没有夸张的表情和饰物,以及没有提及面部毛发改变的情况。所以,我们认为,除了FERET测试所揭示的上述面像识别研究需要面对的问题之外,还需要考虑诸如姿态、饰物(眼镜、帽子等)、面部表情、面部毛发等可变因素对面像识别性能的影响。这些因素也是开发实用的面像识别产品时必然会遇到的最关键的技术问题。
    为进一步测试商业面像识别系统的性能,并揭示2000年前后面像识别技术的最新进展,美国国防部的反毒品技术开发计划办公室于去年5月和6月对美国的主要商业面像识别系统进行了评测,称为FRVT’2000(Face Recognition Vender Test)评测。该计划邀请了美国所有面像识别系统厂商参加,共24家,但只有8家响应,最终有5家公司参加了评测,而只有3家的系统在规定时间内完成了全部对比实验。可以认为,这3家公司的产品是目前最具竞争力的商业识别系统,它们分别是FaceIt系统、Lau Tech.公司的系统和C-VIS公司的系统。FRVT’2000评估了这些系统对图像压缩、用户-摄像机距离、表情、光照、录制设备、姿态、分辨率和时间间隔等影响因素的识别性能。结果表明,面像识别系统的性能与1997年的测试相比有了一定的进步,但其识别性能对各种条件,如光照、老化、距离、姿态等,仍然离人们的期望值较远。

    国内:

    中科院-上海银晨

    近年来,国内学者在对特征脸技术进行认真研究的基础上,尝试了基于特征脸特征提取方法和各种后端分类器相结合的方法,并提出了各种各样的改进版本或扩展算法,主要的研究内容包括线性/非线性判别分析(LDA/KDA)、Bayesian概率模型、支持矢量机(SVM)、人工神经网络(NN)以及类内和类间双子空间(inter/intra-class dual subspace)分析方法等等。

     近年来,中科院计算所在对特征脸技术进行认真研究的基础上,尝试了基于特征脸特征提取方法和各种后端分类器相结合的方法,并提出了各种各样的改进版本或扩展算法,主要的研究内容包括线性/非线性判别分析(LDA/KDA)、Bayesian概率模型、支持矢量机(SVM)、人工神经网络(NN)以及类内和类间双子空间(inter/intra-class dual subspace)分析方法等等。
      针对Eigenface算法的缺点,中科院计算所提出了特定人脸子空间(FSS)算法。该技术来源于但在本质上区别于传统的"特征脸"人脸识别方法:"特征脸"方法中所有人共有一个人脸子空间,而中科院计算所的方法则为每一个体人脸建立一个该个体对象所私有的人脸子空间,从而不但能够更好的描述不同个体人脸之间的差异性,而且最大可能地摈弃了对识别不利的类内差异性和噪声,因而比传统的"特征脸算法"具有更好的判别能力。另外,针对每个待识别个体只有单一训练样本的人脸识别问题,中科院计算所提出了一种基于单一样本生成多个训练样本的技术,从而使得需要多个训练样本的个体人脸子空间方法可以适用于单训练样本人脸识别问题。在Yale人脸库、本实验室350人图像库上的对比实验也表明中科院计算所提出的方法比传统的特征脸方法、模板匹配方法对表情、光照、和一定范围内的姿态变化具有更好的鲁棒性,具有更优的识别性能。
      弹性图匹配技术是一种基于几何特征和对灰度分布信息进行小波纹理分析相结合的识别算法,由于该算法较好的利用了人脸的结构和灰度分布信息,而且还具有自动精确定位面部特征点的功能,因而具有良好的识别效果,该技术在FERET测试中若干指标名列前茅,其缺点是时间复杂度高,实现复杂。中科院计算所对该算法进行了研究,并提出了一些启发策略。
     4、 人脸识别关键问题研究
      a) 人脸识别中的光照问题
      光照变化是影响人脸识别性能的最关键因素,对该问题的解决程度关系着人脸识别实用化进程的成败。中科院计算所将在对其进行系统分析的基础上,考虑对其进行量化研究的可能性,其中包括对光照强度和方向的量化、对人脸反射属性的量化、面部阴影和照度分析等等。在此基础上,考虑建立描述这些因素的数学模型,以便利用这些光照模型,在人脸图像预处理或者归一化阶段尽可能的补偿乃至消除其对识别性能的影响。重点研究如何在从人脸图像中将固有的人脸属性(反射率属性、3D表面形状属性)和光源、遮挡及高光等非人脸固有属性分离开来。基于统计视觉模型的反射率属性估计、3D表面形状估计、光照模式估计,以及任意光照图像生成算法是中科院计算所的主要研究内容。具体考虑两种不同的解决思路:
       1、 利用光照模式参数空间估计光照模式,然后进行针对性的光照补偿,以便消除非均匀正面光照造成的阴影、高光等影响;
       2、 基于光照子空间模型的任意光照图像生成算法,用于生成多个不同光照条件的训练样本,然后利用具有良好的学习能力的人脸识别算法,如子空间法,SVM等方法进行识别,
      

    b) 人脸识别中的姿态问题研究
      姿态问题涉及头部在三维垂直坐标系中绕三个轴的旋转造成的面部变化,其中垂直于图像平面的两个方向的深度旋转会造成面部信息的部分缺失。使得姿态问题成为人脸识别的一个技术难题。解决姿态问题有三种思路: 
    第一种思路是学习并记忆多种姿态特征,这对于多姿态人脸数据可以容易获取的情况比较实用,其优点是算法与正面人脸识别统一,不需要额外的技术支持,其缺点是存储需求大,姿态泛化能力不能确定,不能用于基于单张照片的人脸识别算法中等。
    第二种思路是基于单张视图生成多角度视图,可以在只能获取用户单张照片的情况下合成该用户的多个学习样本,可以解决训练样本较少的情况下的多姿态人脸识别问题,从而改善识别性能。 
      第三种思路是基于姿态不变特征的方法,即寻求那些不随姿态的变化而变化的特征。中科院计算所的思路是采用基于统计的视觉模型,将输入姿态图像校正为正面图像,从而可以在统一的姿态空间内作特征的提取和匹配。
      

    因此,基于单姿态视图的多姿态视图生成算法将是中科院计算所要研究的核心算法,中科院计算所的基本思路是采用机器学习算法学习姿态的2D变化模式,并将一般人脸的3D模型作为先验知识,补偿2D姿态变换中不可见的部分,并将其应用到新的输入图像上去。

    展开全文
  • 深入浅出人脸识别原理

    万次阅读 多人点赞 2018-08-02 14:56:34
    前不久Iphone X发布,革命性的取消了TouchID(指纹识别),而添加了更酷的 FaceID(人脸识别) 模块,FaceID 不简单的运用在解锁上,还可以在支付,表情等场景中应用,给开发者带来更酷更丰富的应用,Iphone X 在多个...

    这里写图片描述

    前不久Iphone X发布,革命性的取消了TouchID(指纹识别),而添加了更酷的 FaceID(人脸识别) 模块,FaceID 不简单的运用在解锁上,还可以在支付,表情等场景中应用,给开发者带来更酷更丰富的应用,Iphone X 在多个硬件传感器的加持下,可以采集3万个点来感知用户的面部特征。

    我们知道人脸识别在这几年应用相当广泛,人脸考勤,人脸社交,人脸支付,哪里都有这黑科技的影响,特别这几年机器学习流行,使得人脸识别在应用和准确率更是达到了一个较高的水准。

    下面将带着大家揭秘下这项黑科技的原理。

    1、人脸识别流程

    人脸识别是由一系列的几个相关问题组成的:

    1. 首先找到一张图片中的所有人脸。
    2. 对于每一张脸来说,无论光线明暗或面朝别处,它依旧能够识别出是同一个人的脸。
    3. 能够在每一张脸上找出可用于他人区分的独特之处,比如眼睛多大,脸有多长等等。
    4. 最后将这张脸的特点与已知所有人脸进行比较,以确定这个人是谁。

    第一步:找出所有的面孔

    很显然在我们在人脸识别的流程中得首先找到图片中的人脸。我们在使用手机或相机拍照时都会有人像模式,它能轻松的检测出人脸的位置,帮助相机快速对焦。

    这里写图片描述

    我们得感谢 保罗·比奥拉(Paul Viola)和迈克尔·琼斯(Michael Jones)在2000年发明了一种能够快速在廉价相机上运行的人脸检测方法,人脸检测在相机上的应用才成为主流。然而现在我们有更可靠的解决方案HOG(Histogram of Oriented Gradients)方向梯度直方图,一种能够检测物体轮廓的算法。

    首先我们把图片灰度化,因为颜色信息对于人脸检测而言没什么用。

    这里写图片描述

    我们分析每个像素以及其周围的像素,根据明暗度画一个箭头,箭头的指向代表了像素逐渐变暗的方向,如果我们重复操作每一个像素,最终像素会被箭头取代。这些箭头被称为梯度(gradients),它们能显示出图像从明亮到黑暗流动的过程。

    这里写图片描述

    分析每个像素对我们来说有点不划算,因为它太过细节化了,我们可能会迷失在像素的海洋里,我们应该从更高的角度观察明暗的流动。

    为此我们将图像分割成16x16像素的小方块。在每个小方块中,计算出每个主方向有多少个剃度(有多少指向上,指向右上,指向右等)。然后用指向性最强的那个方向箭头来代替原来那个小方块。

    这里写图片描述

    最终结果,我们把原始图像转换成一个非常简单的HOG表达形式,它可以很轻松的捕获面部的基本结构。

    为了在HOG图像中找到脸部,我们需要做的是,与已知的一些HOG图案中,看起来最相似的部分。这些HOG图案都是重其他面部训练数据中提取出来的。

    第二步:脸部的不同姿势

    我们已经找出了图片中的人脸,那么如何鉴别面朝不同方向的人脸呢?

    对于电脑来说朝向不同的人脸是不同的东西,为此我们得适当的调整扭曲图片中的人脸,使得眼睛和嘴总是与被检测者重叠。

    为了达到目的我们将使用一种面部特征点估计(face landmark estimation)的算法。其实还有很多算法都可以做到,但我们这次使用的是由瓦希德·卡奇米(Vahid Kazemi)和约瑟菲娜·沙利文(Josephine Sullivan)在 2014 年发明的方法。

    这一算法的基本思路是找到68个人脸上普遍存在的点(称为特征点, landmark)。

    这里写图片描述

    • 下巴轮廓17个点 [0-16]
    • 左眉毛5个点 [17-21]
    • 右眉毛5个点 [22-26]
    • 鼻梁4个点 [27-30]
    • 鼻尖5个点 [31-35]
    • 左眼6个点 [36-41]
    • 右眼6个点 [42-47]
    • 外嘴唇12个点 [48-59]
    • 内嘴唇8个点 [60-67]

    有了这68个点,我们就可以轻松的知道眼睛和嘴巴在哪儿了,后续我们将图片进行旋转,缩放和错切,使得眼睛和嘴巴尽可能的靠近中心。

    现在人脸基本上对齐了,这使得下一步更加准确。

    第三步:给脸部编码

    我们还有个核心的问题没有解决, 那就是如何区分不同的人脸。

    最简单的方法就是把我们第二步中发现的未知人脸与我们已知的人脸作对比。当我们发现未知的面孔与一个以前标注过的面孔看起来相似的时候,就可以认定他们是同一个人。

    我们人类能通过眼睛大小,头发颜色等等信息轻松的分辨不同的两张人脸,可是电脑怎么分辨呢?没错,我们得量化它们,测量出他们的不同,那要怎么做呢?

    实际上,对于人脸这些信息很容易分辨,可是对于计算机,这些值没什么价值。实际上最准确的方法是让计算机自己找出他要收集的测量值。深度学习比人类更懂得哪些面部测量值比较重要。

    所以,解决方案是训练一个深度卷积神经网络,训练让它为脸部生成128个测量值。

    每次训练要观察三个不同的脸部图像:

    1. 加载一张已知的人的面部训练图像
    2. 加载同一个人的另一张照片
    3. 加载另外一个人的照片

    然后,算法查看它自己为这三个图片生成的测量值。再然后,稍微调整神经网络,以确保第一张和第二张生成的测量值接近,而第二张和第三张生成的测量值略有不同。

    我们要不断的调整样本,重复以上步骤百万次,这确实是个巨大的挑战,但是一旦训练完成,它能攻轻松的找出人脸。

    庆幸的是 OpenFace 上面的大神已经做完了这些,并且他们发布了几个训练过可以直接使用的网络,我们可以不用部署复杂的机器学习,开箱即用,感谢开源精神。

    这里写图片描述

    这128个测量值是什么鬼?

    其实我们不用关心,这对我们也不重要。我们关心的是,当看到同一个人的两张不同照片时,我们的网络需要能得到几乎相同的数值。

    第四步:从编码中找出人的名字

    最后一步实际上是最简单的一步,我们需要做的是找到数据库中与我们的测试图像的测量值最接近的那个人。

    如何做呢,我们利用一些现成的数学公式,计算两个128D数值的欧氏距离。

    这里写图片描述

    这样我们得到一个欧式距离值,系统将给它一个认为是同一个人欧氏距离的阀值,即超过这个阀值我们就认定他们是 同 (失) 一 (散) 个 (兄) 人 (弟)。

    人脸识别就这样达成啦,来来我们再回顾下流程:

    1. 使用HOG找出图片中所有人脸的位置。
    2. 计算出人脸的68个特征点并适当的调整人脸位置,对齐人脸。
    3. 把上一步得到的面部图像放入神经网络,得到128个特征测量值,并保存它们。
    4. 与我们以前保存过的测量值一并计算欧氏距离,得到欧氏距离值,比较数值大小,即可得到是否同一个人。

    2、人脸识别应用场景

    人脸识别分两大步骤,人脸检测和人脸识别,它们应用场景也各不相同。

    这里写图片描述

    人脸检测目的是找出人脸,得到人脸的位置,我们可以在美颜,换肤,抠图,换脸 的一些场景中使用到它。我们可以通过系统API调用相机完成对预览针的实时渲染,那些看上去的黑科技我们也可以玩啦。

    这里写图片描述

    而人脸识别则可以在会员,支付等场景中使用,带给用户更酷的使用场景,快来试试吧。

    展开全文
  • 人脸识别之facenet代码实现

    万次阅读 多人点赞 2018-09-03 15:35:36
    上一篇博文介绍了facenet的原理,这篇讲解一下代码的实现,对于facenet的代码目前也有写好的部分。具体见链接facenet代码实现 。大家可以通过git直接下载代码,然后运行里面的validata_on_lfw.py。...

    上一篇博文介绍了facenet的原理,这篇讲解一下代码的实现,对于facenet的代码目前也有写好的部分。具体见链接facenet代码实现 。大家可以通过git直接下载代码,然后运行里面的validata_on_lfw.py。输入对应的lfw数据的路径就可以检测模型对lfw数据的准确度。

     validata_on_lfw.py中,主要是通过data/pairs.txt对lfw进行分对读取。并标记出每一对图片是不是一类。对于训练的结果计算其对应的距离并和给出的阀值进行比较,当距离小于给出的阀值时是一类,大于时不是一类。最后根据判断的结果和标记的结果计算对应的准确率和其他的值。

    在该代码中通过(use_fixed_image_standardizatiion来控制采用固定值归一化(减去127.5然后除以128.0)),根据代码可以看出该处理并没有给use_fixed_image_standardizatiion赋值所以采用的是每张图片单独处理的方式。并且没有给crop赋值所以采用了resize_image_with_crop_or_pad的裁剪方式。同时准确度的计算方面才用看10折交叉交叉验证把输入的数据分成训练和测试在训练上找到一个合适的阀值(开始输入的阀值时0到4每隔0.01取一个),最后对测试数据采用找到的阀值计算准去度最后平均得到的。

    另外在代码实现的过程中建议使用tf.cast(imag ,tf.float32)将读出的图片类型转换为float型,这样在进行去噪操作时会避免数值计算带来的误差。也会相应的提高准确度。

     

     

    use_fixed_image_standardization

     cluster.py:该程序主要是采用密度聚类的方式对提取出的特征进行聚类分析。对于这个文件大家可以运行一下,并且好好理解一下,可以帮助大家理解模型的使用。

    对于项目中的代码,建议大家运行上述2个即可。然后根据自己的想法对模型结果进行自己的处理。我开始的时候把里面每个代码的实现过程都看了一遍,但是后来发现看完之后除了浪费时间没有别的其他作用。

    基于该代码,我自己写了一个人脸的识别过程。主要是在图片中识别对应的每个人是谁。该问题主要分为两部分:第一标签的采集。首先对于输入的图片进行人脸对齐,将对齐之后的图片采用网络进行处理并将产生的向量和标签的名字存为对应的.npy文件方便后续的使用。具体如下:

     

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from scipy import misc
    import tensorflow as tf
    import numpy as np
    import os
    import sys
    import argparse
    from facenetuse.use_model import until
    from facenetuse.mtcnn import detect_face
    from sklearn.cluster import DBSCAN
    # 对标签文件中的图片进行处理,生成最终的标签和特征
    # 最终返回一个二维数据对数组,第一个元素表示标签名字,第二个元素表示标签对应的特征向量
    
    def main(args):
        pnet, rnet, onet = create_network_face_detection()
        with tf.Graph().as_default():
            with tf.Session() as sess:
                until.load_model(args.model)
                # 从文件夹中读取数据生成对应的列表
                label, image_list = until.load_label_image_from_folder(args.data_dir)
                print(len(label))
                # print(image_list)
    
                # 采用MTCNN将读取的数据进行人脸检测,生成对应的大小的人脸数据
                images = until.align_data(image_list, args.image_size, args.margin, pnet, rnet, onet)
                # 定义模型中的输入和输出张量
                images_placeholder = sess.graph.get_tensor_by_name("input:0")
                embeddings = sess.graph.get_tensor_by_name("embeddings:0")
                phase_train_placeholder = sess.graph.get_tensor_by_name("phase_train:0")
                feed_dict = {images_placeholder: images, phase_train_placeholder: False}
                emb = sess.run(embeddings, feed_dict=feed_dict)
    
        np.save(os.path.join(args.output_dir, "label.npy"), label)
        np.save(os.path.join(args.output_dir, "emb.npy"), emb)
    
    
    def create_network_face_detection():
        with tf.Graph().as_default():
            sess = tf.Session()
            with sess.as_default():
                pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
        return pnet, rnet, onet
    
    
    def parse_arguments(argv):
        parser = argparse.ArgumentParser()
    
        parser.add_argument('--model', type=str,
                            help='Either a directory containing the meta_file and ckpt_file or a model'
                                 ' protobuf (.pb) file',
                            )
        parser.add_argument('--data_dir', type=str,
                            help='The directory containing the images to cluster into folders.',
                            )
        parser.add_argument('--output_dir', type=str,
                            help='The directory containing the images to cluster into folders.',
                            )
        parser.add_argument('--image_size', type=int,
                            help='Image size (height, width) in pixels.', default=160)
        parser.add_argument('--margin', type=int,
                            help='Margin for the crop around the bounding box (height, width) in pixels.', default=44)
        parser.add_argument('--min_cluster_size', type=int,
                            help='The minimum amount of pictures required for a cluster.', default=1)
        parser.add_argument('--cluster_threshold', type=float,
                            help='The minimum distance for faces to be in the same cluster', default=1.0)
        parser.add_argument('--largest_cluster_only', action='store_true',
                            help='This argument will make that only the biggest cluster is saved.')
    
        return parser.parse_args(argv)
    
    
    if __name__ == '__main__':
        main(parse_arguments(sys.argv[1:]))

    对于输入的图片,采用相同的人脸对齐技术处理,然后对处理后的图片调用同样的网络生成对应的特征向量,并使用生成的特征向量和标签向量计算其对应的距离。选择距离最小的标签作为识别出来的结果。具体代码如下:

     

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from scipy import misc
    import tensorflow as tf
    import numpy as np
    import os
    import sys
    import argparse
    from facenetuse.use_model import  until
    from facenetuse.mtcnn import detect_face
    from sklearn.cluster import DBSCAN
    # 对文件夹内的图像进行读取,取出其对应的特征向量后并与标签中的特征向量
    # 行比较,最终确定最终的图片类别
    
    
    def main(args):
        pnet, rnet, onet = create_network_face_detection()
        with tf.Graph().as_default():
            with tf.Session() as sess:
                until.load_model(args.model)
                # 从标签数据中读入对应的标签信息
                label = np.load(os.path.join(args.label_dir, "label.npy"))
                label_feature = np.load(os.path.join(args.label_dir, "emb.npy"))
                print(label.shape)
                print(label_feature.shape)
                # 从文件夹中读取数据生成对应的列表
                image_list, _ = until.load_images_from_folder(args.data_dir)
                # 采用MTCNN将读取的数据进行人脸检测,生成对应的大小的人脸数据
                images = until.align_data(image_list, args.image_size, args.margin, pnet, rnet, onet)
                # 定义模型中的输入和输出张量
                images_placeholder = sess.graph.get_tensor_by_name("input:0")
                embeddings = sess.graph.get_tensor_by_name("embeddings:0")
                phase_train_placeholder = sess.graph.get_tensor_by_name("phase_train:0")
                feed_dict = {images_placeholder: images, phase_train_placeholder: False}
                emb = sess.run(embeddings, feed_dict=feed_dict)
                print(emb.shape)
                # 后续均为对模型算出的数据进行的处理
                nrof_images = len(images)
                label_num = label.shape[0]
                matrix = np.zeros((nrof_images, label_num))
                # Print distance matrix
                print('Distance matrix')
                for i in range(nrof_images):
                    for j in range(label_num):
                        dist = np.sqrt(np.sum(np.square(np.subtract(emb[i, :], label_feature[j, :]))))
                        matrix[i][j] = dist
                        print('  %1.4f  ' % dist, end='')
                    print()
    
                for i in range(nrof_images):
                    list_dir = matrix[i, :]
                    min_dir = np.min(list_dir)
                    index = np.where(min_dir == list_dir)[0]
                    print(label[index])
    
    
    def create_network_face_detection():
        with tf.Graph().as_default():
            sess = tf.Session()
            with sess.as_default():
                pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
        return pnet, rnet, onet
    
    
    def parse_arguments(argv):
        parser = argparse.ArgumentParser()
    
        parser.add_argument('--model', type=str,
                            help='Either a directory containing the meta_file and ckpt_file or a model'
                                 ' protobuf (.pb) file',
                           )
        parser.add_argument('--data_dir', type=str,
                            help='The directory containing the images to cluster into folders.',
                            )
        parser.add_argument('--out_dir', type=str,
                            help='The output directory where the image clusters will be saved.',
                           )
        parser.add_argument('--label_dir', type=str,
                            help='The directory containing the images to cluster into folders.',
                            ')
        parser.add_argument('--image_size', type=int,
                            help='Image size (height, width) in pixels.', default=160)
        parser.add_argument('--margin', type=int,
                            help='Margin for the crop around the bounding box (height, width) in pixels.', default=44)
        parser.add_argument('--min_cluster_size', type=int,
                            help='The minimum amount of pictures required for a cluster.', default=1)
        parser.add_argument('--cluster_threshold', type=float,
                            help='The minimum distance for faces to be in the same cluster', default=1.0)
        parser.add_argument('--largest_cluster_only', action='store_true',
                            help='This argument will make that only the biggest cluster is saved.')
    
        return parser.parse_args(argv)
    
    
    if __name__ == '__main__':
        main(parse_arguments(sys.argv[1:]))

     

    经过上述两步的处理就可以识别自己的图片了。当然也可以使用结果对图片进行其他的操作,无论进行什么样的操作其实就和模型本身没有关系了。主要是对特征向量的处理。

    注意:

    1. 在识别过程中,我们发现图片经过处理后生成的特征向量是512维,不是128维,不知道是不是和选取的模型有关

    2. 阀值的选取:在validata_on_lfw实现的过程中,阀值并不是1.1,而是在0-4每隔0.01进行切分,利用分出来的值分别作为阀值进行准确率的计算,最终选择准确率最大的阀值作为分类的依据。该值是1.23。所以在平时使用过程中当数据量较大时也可以借鉴该方法;数据量较小时可以选取最小的值作为阀值(此时最小是指生成的标签向量之间的距离最小)。

    展开全文
  • 人脸识别综述

    千次阅读 2018-08-22 14:51:10
    简介:人脸识别是计算机视觉研究领域的一个热点,同时人脸识别的研究领域非常广泛。因此,本技术综述限定于:一,在LFW数据集上(Labeled Faces in the Wild)获得优秀结果的方法; 二,是采用深度学习的方法。 前言...

    简介:人脸识别是计算机视觉研究领域的一个热点,同时人脸识别的研究领域非常广泛。因此,本技术综述限定于:一,在LFW数据集上(Labeled Faces in the Wild)获得优秀结果的方法; 二,是采用深度学习的方法。

    前言


    LFW数据集(Labeled Faces in the Wild)是目前用得最多的人脸图像数据库。该数据库共13,233幅图像,其中5749个人,其中1680人有两幅及以上的图像,4069人只有一幅图像。图像为250*250大小的JPEG格式。绝大多数为彩色图,少数为灰度图。该数据库采集的是自然条件下人脸图片,目的是提高自然条件下人脸识别的精度。该数据集有6中评价标准:

    一,Unsupervised;
    二,Image-restricted with no outside data;
    三,Unrestricted with no outside data;
    四,Image-restricted with label-free outside data;
    五,Unrestricted with label-free outside data;
    六,Unrestricted with labeled outside data。
    目前,人工在该数据集上的准确率在0.9427~0.9920。在该数据集的第六种评价标准下(无限制,可以使用外部标注的数据),许多方法已经赶上(超过)人工识别精度,比如face++,DeepID3,FaceNet等。

     

     

    图一/表一:人类在LFW数据集上的识别精度
     

    表二:第六种标准下,部分模型的识别准确率(详情参见lfw结果


    续上表





    本文综述的人脸识别方法包括以下几个筛选标准:一,在上表中识别精度超过0.95(超过人类的识别准确度);二,公布了方法(部分结果为商业公司提交,方法并未公布,比如Tencent-BestImage);三,使用深度学习方法(本人是深度学习的追随者);三,近两年的结果。本文综述的方法包括:1,face++(0.9950 );2,DeepFace(0.9735 );3,FR+FCN(0.9645 );4,DeepID(0.9745 );5,FaceNet(0.9963 );6, baidu的方法(0.9977 );7,pose+shape+expression augmentation(0.9807);8,CNN-3DMM estimation(0.9235 ,准确率没那么高,但是值得参考)。

    人脸识别方法


    1,face++(0.9950)

    参考文献:Naive-Deep face Recognition: Touching the Limit of LFW Benchmark or Not?

     

    face++从网络上搜集了5million张人脸图片用于训练深度卷积神经网络模型,在LFW数据集上准确率非常高。该篇文章的网路模型很常规(常规深度卷积神经网络模型),但是提出的问题是值得参考的。
    问题一:他们的Megvii Face Recognition System经过训练后,在LFW数据集上达到了0.995的准确率。在真实场景测试中(Chinese ID (CHID)),该系统的假阳性率(FP=10^{-5})非常低。但是,真阳性率仅为0.66,没有达到真实场景应用要求。其中,年龄差异(包括intra-variation:同一个人,不同年龄照片;以及inter-variation:不同人,不同年龄照片)是影响模型准确率原因之一。而在该测试标准(CHID)下,人类表现的准确率大于0.90.

     

     

    图1-1:在CHID中出错的样本


    问题二:数据采集偏差。基于网络采集的人脸数据集存在偏差。这些偏差表现在:1,个体之间照片数量差异很大;2,大部分采集的照片都是:微笑,化妆,年轻,漂亮的图片。这些和真实场景中差异较大。因此,尽管系统在LFW数据集上有高准确率,在现实场景中准确率很低。
    问题三:模型测试加阳性率非常低,但是现实应用中,人们更关注真阳性率。
    问题四:人脸图片的角度,光线,闭合(开口、闭口)和年龄等差异相互的作用,导致人脸识别系统现实应用准确率很低。
    因此,该文章提出未来进一步研究的方向。方向一:从视频中提取训练数据。视频中人脸画面接近于现实应用场景(变化的角度,光照,表情等);方向二:通过人脸合成方法增加训练数据。因为单个个体不同的照片很困难(比如,难以搜集大量的单个个体不同年龄段的照片,可以采用人脸合成的方法(比如3D人脸重建)生成单个个体不同年龄段的照片)。该文章提出的方向在后续方法介绍中均有体现。


    2,DeepFace(0.9735 )
    参考文献:Deepface: Closing the gap to humal-level performance in face verification
    2.1 简介
    常规人脸识别流程是:人脸检测-对齐-表达-分类。本文中,我们通过额外的3d模型改进了人脸对齐的方法。然后,通过基于4million人脸图像(4000个个体)训练的一个9层的人工神经网络来进行人脸特征表达。我们的模型在LFW数据集上取得了0.9735的准确率。该文章的亮点有以下几点:一,基于3d模型的人脸对齐方法;二,大数据训练的人工神经网络。

    2.2 人脸对齐方法
    文中使用的人脸对齐方法包括以下几步:1,通过6个特征点检测人脸;2,剪切;3,建立Delaunay triangulation;4,参考标准3d模型;5,将3d模型比对到图片上;6,进行仿射变形;7,最终生成正面图像。

     

     

    图2-1 人脸对齐的流程


    2.3 深度神经网络

     

     

    图2-2:深度神经网络


    2.4 结果
    该模型在LFW数据集上取得了0.9735准确率,在其它数据集比如Social Face Classification (SFC) dataset和YouTube Faces (YTF) dataset也取得了好结果,详情请参见原文。


    3,FR+FCN(0.9645 )

    参考文献:Recover Canonical-View Faces in the Wild with Deep Neural Networks

    3.1 简介

    自然条件下,因为角度,光线,occlusions(咬合/张口闭口),低分辨率等原因,使人脸图像在个体之间有很大的差异,影响到人脸识别的广泛应用。本文提出了一种新的深度学习模型,可以学习人脸图像看不见的一面。因此,模型可以在保持个体之间的差异的同时,极大的减少单个个体人脸图像(同一人,不同图片)之间的差异。与当前使用2d环境或者3d信息来进行人脸重建的方法不同,该方法直接从人脸图像之中学习到图像中的规则观察体(canonical view,标准正面人脸图像)。作者开发了一种从个体照片中自动选择/合成canonical-view的方法。在应用方面,该人脸恢复方法已经应用于人脸核实。同时,该方法在LFW数据集上获得了当前最好成绩。该文章的亮点在于:一,新的检测/选择canonical-view的方法;二,训练深度神经网络来重建人脸正面标准图片(canonical-view)。

    3.2 canonical view选择方法

    我们设计了基于矩阵排序和对称性的人脸正面图像检测方法。如图3-1所示,我们按照以下三个标准来采集个体人脸图片:一,人脸对称性(左右脸的差异)进行升序排列;二,图像锐度进行降序排列;三,一和二的组合。

     

    图3-1 正面人脸图像检测方法


    矩阵Y_{i} \in R^{64\times 64}为第i个个体的人脸图像矩阵,D_{i}为第i个个体所有人脸图像集合,Y_{i} \in D_{i}。正面人脸检测公式为:M(Y_{i} )=||Y_{i}P-Y_{i}Q||_{F}^{2}-\lambda ||Y_{i}||_{*}

    3.3 人脸重建

    我们通过训练深度神经网络来进行人脸重建。loss函数为:E(\left\{ X_{ik}^{0} \right\}  ;W)=\sum_{i}^{}{} \sum_{k}^{}{} \left| \left| Y_{i}-f(X_{ik}^{0};W ) \right|\right| _{F}^{2}

    i为第i个个体,k为第i个个体的第k张样本。X^{0}和Y为训练图像和目标图像。

    如图3-2所示,深度神经网络包含三层。前两层后接上了max pooling;最后一层接上了全连接层。于传统卷积神经网络不同,我们的filters不共享权重(我们认为人脸的不同区域存在不同类型的特征)。第l层卷积层可以表示为:

    X_{q,uv}^{l+1} =\sigma (\sum_{p=1}^{I}{x_{pq,uv}^{l} }\circ (X_{p}^{l} ) _{uv} +x_{q}^{l} )
     

    图3-2 深度神经网络

    最终,经过训练的深度神经网络生成的canonical view人脸图像如图3-3所示。

     

    图3-3 canonical view人脸图像

     

    4,DeepID(0.9745 )

    参考文献:DeepID3: Face Recognition with Very Deep Neural Networks


    4.1 简介

    深度学习在人脸识别领域的应用提高了人脸识别准确率。本文中,我们使用了两种深度神经网络框架(VGG net 和GoogleLeNet)来进行人脸识别。两种框架ensemble结果在LFW数据集上可以达到0.9745的准确率。文章获得高准确率主要归功于大量的训练数据,文章的亮点仅在于测试了两种深度卷积神经网络框架。

    4.2 深度神经网络框架


    图4-1 两种深度卷积神经网络框架


    5,FaceNet(0.9963)
    参考文献:FaceNet: A Unified Embedding for Face Recognition and Clustering

    5.1 简介


    作者开发了一个新的人脸识别系统:FaceNet,可以直接将人脸图像映射到欧几里得空间,空间的距离代表了人脸图像的相似性。只要该映射空间生成,人脸识别,验证和聚类等任务就可以轻松完成。该方法是基于深度卷积神经网络,在LFW数据集上,准确率为0.9963,在YouTube Faces DB数据集上,准确率为0.9512。FaceNet的核心是百万级的训练数据以及 triplet loss。

    5.2 triplet loss
    triplet loss是文章的核心,模型将图像x embedding入d-维的欧几里得空间f(x)\in R^{d}。我们希望保证某个个体的图像x_{i}^{a} (anchor) 和该个体的其它图像x_{i}^{p} (positive) 距离近,与其它个体的图像x_{i}^{n} (negtive) 距离远。如图5-1所示:

    图5-1 triplet loss示意图
     

     


    triplets 的选择对模型的收敛非常重要。如公式1所示,对于x_{i}^{a},我们我们需要选择不同个体的图片x_{i}^{p},使argmax_{x_{i}^{p} } \left| \left| f(x_{i}^{a} )-f(x_{i}^{p} )\right|  \right| _{2}^{2};同时,还需要选择同一个体不同图片x_{i}^{n},使得argmin_{x_{i}^{n} } \left| \left| f(x_{i}^{a} )-f(x_{i}^{n} )\right|  \right| _{2}^{2}

    5.3 深度卷积神经网络
    采用adagrad优化器,使用随机梯度下降法训练CNN模型。在cpu集群上训练了1000-2000小时。边界值\alpha设定为0.2。总共实验了两类模型,参数如表5-1和表5-2所示。
    表5-1 CNN模型1


    表5-2 CNN模型2



    6,baidu的方法
    参考文献:Targeting Ultimate Accuracy : Face Recognition via Deep Embedding

    6.1 简介
    本文中,作者提出了一种两步学习方法,结合mutil-patch deep CNN和deep metric learning,实现脸部特征提取和识别。通过1.2million(18000个个体)的训练集训练,该方法在LFW数据集上取得了0.9977的成绩。

    6.2 multi-patch deep CNN
    人脸不同区域通过深度卷积神经网络分别进行特征提取。如图6-1所示。


    图6-1 multi-patch示意图
    6.3 deep metric learning
    深度卷积神经网络提取的特征再经过metric learning将维度降低到128维度,如图7-2所示。


    图6-2 metric learning示意图

    7,pose+shape+expression augmentation(0.9807)
    参考文章:Do We Really Need to Collect Millions of Faces for Effective Face Recognition

    7.1 简介
    该文章的主要思路是对数据集进行扩增(data augmentation)。CNN深度学习模型,比如face++,DeepID,FaceNet等需要基于百万级人脸图像的训练才能达到高精度。而搜集百万级人脸数据所耗费的人力,物力,财力是很大的,所以商业公司使用的图像数据库是不公开的。
    本文中,采用了新的人脸数据扩增方法。对现有公共数据库人脸图像,从pose,shape和expression三个方面合成新的人脸图像,极大的扩增数据量。在LFW和IJB-A数据集上取得了和百万级人脸数据训练一样好的结果。该文章的思路很好,很适合普通研究者。

    7.2 pose+shape+expression扩增方法
    一,pose(姿态,文章中为人脸角度,即通过3d人脸模型数据库合成图像看不见的角度,生成新的角度的人脸)。首先,通过人脸特征点检测(facial landmark detector),获取人脸特征点。根据人脸特征点和开放的Basel 3D face set数据库的人脸模板合成3d人脸。如图7-1所示。

    图7-1 pose(角度)生成示意图

    二,shape(脸型)。首先,通过Basel 3D face获取10种高质量3d面部扫描数据。再将图像数据与不同3d脸型数据结合,生成同一个人不同脸型的图像。如图7-2所示:

    图7-2 不同脸型生成示意图

    三,expression(表情,本文中,将图像的张嘴表情替换为闭口表情)。采用中性嘴型将图像中的开口表情换位闭口表情。如图7--3所示。

    图7-3 不同表情(开口/闭口)生成示意图

    7.3 模型及训练方法
    文章模型采用的ILSVRC数据集上预训练的VGG-19模型。训练方法是常规梯度下降训练方法。值得提出的地方是,该文章对测试集也进行了augmentation。

    8, CNN-3DMM estimation(0.9235)
    参考文献:

    1,Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network(很优秀的工作,强烈推荐阅读原文)

    2,中文解析:使用深度卷积神经网络方法进行3D人脸重建

    8.1 简介
    当在真实场景中应用3d模拟来增加人脸识别精度,存在两类问题:要么3d模拟不稳定,导致同一个个体的3d模拟差异较大;要么过于泛化,导致大部分合成的图片都类似。因此,作者研究了一种鲁棒的三维可变人脸模型(3D morphable face models (3DMM))生成方法。他们采用了卷积神经网络(CNN)来根据输入照片来调节三维人脸模型的脸型和纹理参数。该方法可以用来生成大量的标记样本。该方法在MICC数据集上进行了测试,精确度为state of the art 。与3d-3d人脸比对流程相结合,作者在LFW,YTF和IJB-A数据集上与当前最好成绩持平。文章的关键点有两个:一,3D重建模型训练数据获取;二,3D重建模型训练 。

    8.2 训练数据
    作者采用了近期发表的多图像3DMM生成方法(M.Piotraschke 2016)。他们在CASIA WebFace数据集上采用该方法生成3DMM。这些3d人脸模型用于训练CNN的gound truth。多图像3DMM重建包括两步:一,从CASIA数据集选取500K当个图像来估计3DMM参数。二,同一个体不同照片生成的3DMM聚合一起,获取单个个体的3DMM(约10K个体)。

    8.2.1 Single image 3DMM fitting
    采用两种不同的方法来对每一个训练图片配对上3DMM。对于图像I,我们估计\alpha ^{*}\beta  ^{*}来表示与输入图像I类似的图像。采用了目前最好的人脸特征点检测器(CLNF)来检测K=68个人脸特征点P_{k} \in R^{2} ,k\in 1..K和置信值w。其中,脸部特征点用于在3DMM坐标系中初始化输入人脸的角度。角度表达为6个自由度:角度r=\left[ r _{\alpha } ,r_{\beta a},r_{\gamma a}  \right] 和平移t=\left[t_{X} ,t_{Y} ,t_{Z}  \right]。然后再对脸型,纹理,角度,光照和色彩进行处理。

    8.2.2 Multi image 3DMM fitting
    多图像3DMM生成通过pool 单个个体不同图片生成的3DMM的脸型和纹理参数来实现。
    \bar{\gamma } =\sum_{i=1}^{N}{w_{i} \cdot \gamma _{i} }其中\sum_{i=1}^{N}{w_{i}=1 }w_{i}为CLNF脸部特征检测生成的置信值。

    8.3 3D重建模型训练
    对于数据集中每一个个体,有多张图片以及单个pool的3DMM。我们将该数据用于训练模型,使模型可以根据同一个体不同的图片来生成类似的3DMM特征向量。
    如图8-1所示,我们采用了101层的deep ResNet网络来进行人脸识别。神经网络的输出层为198维度的3DMM特征向量\gamma。然后,使用CASIA 图像生成的pooled 3DMM作为目标值对神经网络进行fine-tuned。我们也尝试了使用VGG-16结构,结果比ResNet结构稍微差一点。

    图8-1 3D重建训练示意图

    8.3.1 The asymmetric Euclidean loss
    我们在实验中发现,使用Euclidean loss会导致输出3d人脸缺少细节,如图8-2所示。因此,我们引入了asymmetric Euclidean loss。

    其中,\gamma为目标pooled 3DMM值,\gamma _{p}为输入,\lambda _{1,2}为平衡over和under estimation errors的值。在实际操作中,我们设定\lambda _{1} =1,\lambda _{2} =3,来鼓励模型学习更多的细节。


    图8-2 不同loss函数对结果的影响

    8.4 实验结果
    8.4.1 3D重建结果
    MICC数据集包含53个个体的人脸视频和个体的3D模型作为gound truth。这些视频可以用于单张图片和多张图片的3D重建。实验结果如表8-1所示,该重建方法比当前的方法都要好。
    表8-1 3D重建实验结果

    8.4.2 人脸识别
    我们研究了同一人不同的照片重建的3DMM是否比不同人的照片重建的3DMM差异更小。我们在LFW,YTF和IJB-A数据集上测试了我们的方法。结果如表8-2和图8-3所示。
    表8-2 LFW和YTF测试结果


    图8-3 LFW,YTF和IJB-A测试结果

    8.4.3 定性结果
    图8-4展示了训练模型生成的3DMM结果。

    图8-4 3DMM生成模型结果


    总结
    本文综述了8种基于深度学习的人脸识别方法,包括:1,face++(0.9950 );2,DeepFace(0.9735 );3,FR+FCN(0.9645 );4,DeepID(0.9745 );5,FaceNet(0.9963 );6, baidu的方法(0.9977 );7,pose+shape+expression augmentation(0.9807);8,CNN-3DMM estimation(0.9235 )。上述方法可以分为两大类:
    第一类:face++,DeepFace,DeepID,FaceNet和baidu。他们方法的核心是搜集大数据,通过更多更全的数据集让模型学会去识别人脸的多样性。这类方法适合百度/腾讯/谷歌等大企业,未来可以搜集更多更全的训练数据集。数据集包扩同一个体不同年龄段的照片,不同人种的照片,不同类型(美丑等)。通过更全面的数据,提高模型对现场应用中人脸差异的适应能力。
    第二类:FR+FCN,pose+shape+expression augmentation和CNN-3DMM estimation。这类方法采用的是合成的思路,通过3D模型等合成不同类型的人脸,增加数据集。这类方法操作成本更低,更适合推广。其中,特别是CNN-3DMM estimation,作者做了非常出色的工作,同时提供了源码,可以进一步参考和深度研究。

    上述方法在理想条件下的人脸识别精确度已经达到或者超越人类的表现。但是,由于光线,角度,表情,年龄等多种因素,导致人脸识别技术无法在现实生活中广泛应用。未来研究中,不管哪种思路,均是提高模型对现场复杂环境的适应能力,在复杂环境中,也能达到人类识别的精确度。

    人脸识别技术是计算机视觉和深度学习领域中相对成熟的技术,很期待该技术的广泛应用。

     

    参考文献:https://zhuanlan.zhihu.com/p/24816781

    展开全文
  • 人脸识别经典算法一:特征脸方法(Eigenface)

    万次阅读 多人点赞 2014-04-06 00:07:53
    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新。特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的。
  • 人脸识别学习总结

    千次阅读 2019-07-07 17:24:36
    人脸识别算法进行了一定程度的学习,从最开始的特征脸到如今的CNN人脸检测,有了较为全面的了解。重点掌握了基于PCA的特征脸检测,LDA线性判别分析(Fisher线性判别),以及基于级联器的Haar特征,LBP特征的人脸...
  • 人脸识别各算法详解

    万次阅读 多人点赞 2019-04-11 17:06:51
    人脸识别各算法详解 最近,由于工作需要,为了找到一款高效的认识识别算法,对各种人脸识别算法都研究了一番,以下记录的是各算法的理论基础。 一.MTCNN 本文章主要介绍MTCNN算法的流程,MTCNN主要由三个框架组成...
  • 利用python、tensorflow、opencv实现人脸识别(包会)!

    万次阅读 多人点赞 2019-02-20 21:44:24
    本人是机械专业在读硕士,在完成暑假实践的时候接触到了人脸识别,对这一实现很感兴趣,所以花了大概十天时间做出了自己的人脸识别。这篇文章应该是很详细的了所以帮你实现人脸识别应该没什么问题。 先说本博文的...
  • Matlab实现人脸识别

    万次阅读 多人点赞 2018-06-13 21:45:59
    最近在学习matlab图像处理部分,发现人脸识别这一块非常好玩,在这里做个总结。人脸识别之一:查找图片中的人脸并用方框圈出 这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片---&...
  • 人脸识别——基于CNN的模型实现

    万次阅读 多人点赞 2018-08-19 14:44:29
    通常人脸识别问题分为两类:人脸验证和人脸识别,人脸验证可以作为人脸识别的前提,具体的讲解可以观看达叔《深度学习》教程,在此默认大家对人脸识别问题已有了解。 所需的第三方库如下,其中所用的数据集和辅助...
  • 简述几种人脸识别的主要方法

    千次阅读 2019-05-29 08:33:58
    人脸识别的方法很多,以下介绍一些主要的人脸识别方法。 (1)几何特征的人脸识别方法 几何特征可以是眼、鼻、嘴等的形状和它们之间的几何关系(如相互之间的距离)。这些算法识别速度快,需要的内存小,但识别率较低...
  • title: Android实现人脸识别(人脸检测)初识 categories: Android tags: 人脸识别 人脸检测 相机处理 date: 2020-05-21 11:35:51 介绍 本篇文章主要介绍一下移动端Android的人脸识别大致逻辑,后续文章会陆续...
  • 人脸识别门禁的智能化演进之路

    万次阅读 2019-01-07 08:53:50
    伴随着物联网、大数据、人工智能技术的日益成熟,人脸识别技术快速落地于各种智能化应用场景,其中人脸识别智能门禁在智慧社区中发挥着非常重要的作用。业主不需携带钥匙也不用刷卡,只要刷脸就能进出小区,不但快捷...
  • 人脸识别(一)——人脸识别简介

    万次阅读 多人点赞 2019-03-16 12:09:35
    当今世界智能产业不断发展,人脸识别技术发展至今也是相对很成熟的。下面就由小编来带领大家进入人脸识别的世界,在下也是学生,有很多地方也不太懂,还请各位大神多多指教。 目录 1.人脸识别简介 2.人脸识别基本...
  • 几种人脸识别门禁系统设计的方案介绍摘要:目前人脸识别门禁系统在我们生活中的应用越来越广泛,本文详细的分析了人脸识别门禁系统考虑要点以及详细的介绍了监狱人脸识别门禁系统方案和监狱人脸识别门禁系统方案。...
  • 利用MATLAB进行人脸识别

    万次阅读 多人点赞 2017-11-18 20:54:26
    最近要给同学在一个自动瞄准装置的基础上做一个人脸识别模块。也是上网查阅了一些资料,经过一周的整理整合,也算是有一些收获。 首先,通过阅读网上的一些现有的程序,可以发现,人脸识别大致可以分为两种方法:...
  • 人脸识别技术发展现状及未来趋势

    万次阅读 2019-02-20 10:05:40
    当前,随着人工智能、物联网等前沿技术的...用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。  刚...
  • 看完之后如有不懂,请看:关于人脸和指纹识别共同交流方案,也可以关注微信公众号:雄雄的小课堂,回复:人脸识别群获取群号,群内有直接可以运行的源码可供下载,人脸识别所需的软件群内也有!!! 人脸识别,...
  • 用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。  本套课程老师会带着你逐步实现人脸识别...
  • 原 Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理 置顶 ...
1 2 3 4 5 ... 20
收藏数 90,889
精华内容 36,355
关键字:

脸部识别