人脸识别简介

て烟熏妆下的殇ゞ 提交于 2020-01-18 08:09:34

人脸识别原理

人脸识别,特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。

基础介绍

而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形、个人习惯(例如敲击键盘的力度和频率、签字)等,相应的识别技术就有人脸识别、指纹识别、掌纹识别、虹膜识别、视网膜识别、语音识别(用语音识别可以进行身份识别,也可以进行语音内容的识别,只有前者属于生物特征识别技术)、体形识别、键盘敲击识别、签字识别等。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 广义内容 广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;
  2. 狭义内容 狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统;
  3. 生物特征识别技术生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形、个人习惯(例如敲击键盘的力度和频率、签字)等,相应的识别技术就有人脸识别、指纹识别、掌纹识别、虹膜识别、视网膜识别、语音识别(用语音识别可以进行身份识别,也可以进行语音内容的识别,只有前者属于生物特征识别技术)、体形识别、键盘敲击识别、签字识别等;

技术原理

人脸识别内容

人脸识别技术包含三个部分:

(1)人脸检测

      面貌检测是指在动态的场景与复杂的背景中判断是否存在面像,
   并分离出这种面像。

①参考模板法

     首先设计一个或数个标准人脸的模板,然后计算测试采集的样品
  与标准模板之间的匹配程度,并通过阈值来判断是否存在人脸;

②人脸规则法

      由于人脸具有一定的结构分布特征,所谓人脸规则的方法,
   即提取这些特征生成相应的规则以判断测试样品是否包含人脸;

③样品学习法

     这种方法即采用模式识别中人工神经网络的方法,
  即通过对面像样品集和非面像样品集的学习产生分类器;

④肤色模型法

    这种方法是依据面貌肤色在色彩空间中分布相对集中的规律
 来进行检测。

⑤特征子脸法

    这种方法是将所有面像集合视为一个面像子空间,并基于检测样品
 与其在子孔间的投影之间的距离判断是否存在面像。

(2)人脸跟踪

   面貌跟踪是指对被检测到的面貌进行动态目标跟踪。具体采用基于模型
的方法或基于运动与模型相结合的方法。
   此外,利用肤色模型跟踪也不失为一种简单而有效的手段。

(3)人脸比对

   面貌比对是对被检测到的面貌像进行身份确认或在面像库中进行目标
 搜索。
   这实际上就是说,将采样到的面像与库存的面像依次进行比对,
 并找出最佳的匹配对象。所以,面像的描述决定了面像识别的
 具体方法与性能。

目前主要采用特征向量与面纹模板两种描述方法:

①特征向量法

   该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、
 位置、距离等属性,然后再计算出它们的几何特征量,
 而这些特征量形成一描述该面像的特征向量。

②面纹模板法

    该方法是在库中存贮若干标准面像模板或面像器官模板,比对时,
 将采样面像所有象素与库中所有模板采用归一化相关量度量进行匹配。
    此外,还有采用模式识别的自相关网络或特征与模板相结合的方法。
 人脸识别技术的核心实际为“局部人体特征分析”和“图形/神经识别算法
 ”这种算法是利用人体面部各器官及特征部位的方法。
    如对应几何关系多数据形成识别参数与数据库中所有的原始参数
 进行比较、判断与确认。一般要求判断时间低于1秒。

类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

人脸识别过程

一般分三步:

(1)首先建立人脸的面像档案。

 即用摄像机采集单位人员的人脸的面像文件或取他们的照片形成面像
 文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。

(2)获取当前的人体面像。

即用摄像机捕捉的当前出入人员的面像,或取照片输入,
并将当前的面像文件生成面纹编码。

(3)用当前的面纹编码与档案库存的比对。

    即将当前的面像的面纹编码与档案库存中的面纹编码进行检索比对。
 上述的“面纹编码”方式是根据人脸脸部的本质特征和开头来工作的。
 这种面纹编码可以抵抗光线、皮肤色调、面部毛发、发型、眼镜、
 表情和姿态的变化,具有强大的可靠性,从而使它可以从百万人
 中精确地辩认出某个人。人脸的识别过程,利用普通的图像处理设备
 就能自动、连续、实时地完成。

功能模块

人脸捕获与跟踪功能

      人脸捕获是指在一幅图像或视频流的一帧中检测出人像并将人像
   从背景中分离出来,并自动地将其保存。
      人像跟踪是指利用人像捕获技术,当指定的人像在摄像头拍摄的
   范围内移动时自动地对其进行跟踪。

人脸识别比对

     人脸识别分核实式和搜索式二种比对模式。核实式是对指将捕获
  得到的人像或是指定的人像与数据库中已登记的某一对像作比对核实
  确定其是否为同一人。搜索式的比对是指,从数据库中已登记的所有
  人像中搜索查找是否有指定的人像存在。

人脸的建模与检索

      可以将登记入库的人像数据进行建模提取人脸的特征,并将其生成
   人脸模板(人脸特征文件)保存到数据库中。在进行人脸搜索时,
   将指定的人像进行建模,再将其与数据库中的所有人的模板相
   比对识别,最终将根据所比对的相似值列出最相似的人员列表。

真人鉴别功能

    系统可以识别得出摄像头前的人是一个真正的人还是一幅照片。
 以此杜绝使用者用照片作假。
    此项技术需要使用者作脸部表情的配合动作。

图像质量检测

     图像质量的好坏直接影响到识别的效果,图像质量的检测功能
  能对即将进行比对的照片进行图像质量评估,并给出相应的建议值
  来辅助识别。

基本算法

(1)几何特征的人脸识别方法

      几何特征可以是眼、鼻、嘴等的形状和它们之间的几何关系
  (如相互之间的距离)。这些算法识别速度快,需要的内存小,
  但识别率较低。

(2)基于特征脸(PCA)的人脸识别方法:

    特征脸方法是基于KL变换的人脸识别方法,KL变换是图像压缩的
一种最优正交变换。高维的图像空间经过KL变换后得到一组新的正交基
保留其中重要的正交基,由这些基可以张成低维线性空间。如果假设人
脸在这些低维线性空间的投影具有可分性,就可以将这些投影用作识别的
特征矢量,这就是特征脸方法的基本思想。这些方法需要较多的训练样本
而且完全是基于图像灰度的统计特性的。

(3)神经网络的人脸识别方法:

   神经网络的输入可以是降低分辨率的人脸图像、局部区域的自相关
函数局部纹理的二阶矩等。这类方法同样需要较多的样本进行训练,
而在许多应用中,样本数量是很有限的。

(4)弹性图匹配的人脸识别方法:

   弹性图匹配法在二维的空间中定义了一种对于通常的人脸变形具有
一定的不变性的距离,并采用属性拓扑图来代表人脸,拓扑图的
任一顶点均包含一特征向量,用来记录人脸在该顶点位置附近的信息。
该方法结合了灰度特性和几何因素,在比对时可以允许图像存在弹性形变
在克服表情变化对识别的影响方面收到了较好的效果,同时对于单个人
也不再需要多个样本进行训练。

(5)线段Hausdorff 距离(LHD) 的人脸识别方法:

    心理学的研究表明,人类在识别轮廓图(比如漫画)的速度和准确度
 丝毫不比识别灰度图差。LHD是基于从人脸灰度图像中提取出来的
 线段图的,它定义的是两个线段集之间的距离,与众不同的是,
 LHD并不建立不同线段集之间线段的一一对应关系,因此它更能适应
 线段图之间的微小变化。实验结果表明,LHD在不同光照条件下和
 不同姿态情况下都有非常出色的表现,但是它在大表情的情况下
 识别效果不好。

(6)支持向量机(SVM) 的人脸识别方法:

   近年来,支持向量机是统计模式识别领域的一个新的热点,
它试图使得学习机在经验风险和泛化能力上达到一种妥协,
从而提高学习机的性能。支持向量机主要解决的是一个2分类问题,
它的基本思想是试图把一个低维的线性不可分的问题转化成一个
高维的线性可分的问题。通常的实验结果表明SVM有较好的识别率,
但是它需要大量的训练样本(每类300个),这在实际应用中往往是
不现实的。而且支持向量机训练时间长,方法实现复杂,
该函数的取法没有统一的理论。

相关代码

基于HTML5的人脸识别技术

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

<div> 
 <video id="live" width="320" height="240" 
 autoplay style="display: inline;">
 </video>  
 <canvas width="320" id="canvas" height="240" 
 style="display: inline;">
 </canvas>  
 </div>    
 <script type="text/javascript">  
 var video = $("#live").get()[0];  
 var canvas = $("#canvas");  
 var ctx = canvas.get()[0].getcontext('2d');    navigator.webkitgetusermedia("video",  function(stream) {  video.src = webkiturl.createobjecturl(stream);  }, 
  function(err) 
  {
    console.log("unable to get video stream!")  }  )    
    timer = setinterval(  function ()
     {  ctx.drawimage(video, 0, 0, 320, 240);  }, 250);  </script>   
     javascript code复制内容到剪贴板
     public class facedetection {   
      private static final string cascade_file ="resources/haarcascade_frontalface_alt.xml";  
        private int minsize = 20;  
        private int group = 0;  
        private double scale = 1.1;   
         /** * based on facedetection example from javacv. */  public byte[] convert(byte[] imagedata) 
         
         throws ioexception {  
         // create image from supplied bytearray  
         iplimage originalimage = cvdecodeimage(cvmat(1, imagedata.length,cv_8uc1, newbytepointer(imagedata)));  
           // convert to grayscale for recognition  
           iplimage grayimage = iplimage.create(originalimage.width(), originalimage.height(), ipl_depth_8u, 1);  
           cvcvtcolor(originalimage, grayimage, cv_bgr2gray);    // storage is needed to store information during detection  
           cvmemstorage storage = cvmemstorage.create();    
           // configuration to use in analysis  
           cvhaarclassifiercascade cascade = newcvhaarclassifiercascade(cvload(cascade_file));    
           // we detect the faces.  
           cvseq faces = cvhaardetectobjects(grayimage, cascade, storage, scale, group, minsize);    
           // we iterate over the discovered faces and draw yellow rectangles around them. 
            for (int i = 0; i < faces.total(); i++) {  cvrect r = new cvrect(cvgetseqelem(faces, i));  cvrectangle(originalimage, cvpoint(r.x(), r.y()),  cvpoint(r.x() + r.width(), r.y() + r.height()),  cvscalar.yellow, 1, cv_aa, 0);  }   
             // convert the resulting image back to an array  
             bytearrayoutputstream bout = new bytearrayoutputstream();  bufferedimage imgb = originalimage.getbufferedimage();  imageio.write(imgb, "png", bout);  return bout.tobytearray();  } 
 }  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!