人机交互大作业——人脸识别“人脸识别”系统设计文档人脸识别的意义及应用人脸识别是指对视频或图像中的人脸进行发现,追踪,进而识别出是特定个体的一种生物特征技术,也是生物特征识别中最主要的研究方向之一。
人脸识别在日常生活中有着非常广泛的应用市场。
下面列举了一些人脸识别的主要应用:1.监控系统监控系统在日常生活中非常常用,是防盗系统的主要组成部分之一。
人工智能的监控系统的一大优势就是可以将人类从每天对着监视器的枯燥工作中解脱出来。
将监视的工作交给计算机来做,有几个优势。
一是可以365天,24小时不间断的工作。
二是可以不知疲倦,不会因为时间长而分散注意力。
但是人工智能的监控系统仍面临着很多问题,比如漏识别,识别误差等等。
2.身份验证身份验证系统可以应用的范围也很广。
比如现有的银行存取款系统,当人的银行卡和密码同时丢失时,卡中的钱就可能被转走。
但是如果在取款机上安装一个人脸识别系统,在提供银行卡和密码时,同时需要进行面部认证,这样就会大大降低个人财产损失的风险。
3.考勤系统考勤系统通常用在公司里。
传统的考勤系统需要给每个员工分配一张考勤卡,每天上下班需要去打卡。
这样会给员工带来一定的不便。
如果员工忘记带卡,或者卡有损坏,就会耽误打卡。
而且专门设立打卡地点,不仅上下班打卡不方便,而且还会出现替打卡的情况。
使用人脸识别系统,可以在不被觉察的情况下,自然地实现员工的考勤。
减少了很多不必要的麻烦。
4.视频、图像检索随着人们对图像,视频等需求的不断扩展,网络上的图像和视频信息量也在以极快的速度增长。
在如此庞大的信息库中快速查找到用户需要的信息成了现在研究的一个重要方向。
而现在最主流的方式是在视频和图像上附带描述信息。
这种描述信息可以被发布人随意更改,很多时候会对用户产生误导,浪费了时间。
而用人脸识别进行图像和视频的检索,在检索某些特定人相关的资源时,会大大提高搜索结果的质量。
再配合上描述关键词,能使人更快速寻找到所需信息。
人脸识别的优势和困难人脸识别相对于传统的身份验证技术,和现有的虹膜识别,指纹识别等技术有一个显著的优势,就是可以自然地获取识别对象的身份信息,而不需要识别对象刻意的配合。
虹膜识别和指纹识别都需要识别对象的配合。
在这种情况下,识别对象可以有意识的进行伪装和欺骗。
而人脸识别是在人们不经意的时候对人们图像的采集和识别,不会引起识别对象的注意。
因此从某种意义上更容易获得真实的信息。
虽然人脸识别有着不可比拟的优势,但是在实现方面还有着很大的困难。
首先,人脸具有很高的相似性。
不同的个体之间人脸的区别不是很大。
这一点对于人脸在图像中的定位是有利的,但是要对人脸进行进一步的识别是很不利的。
所以要对人脸进行识别必须考虑更细致的面部特征来区分个体。
第二,人脸具有易变性。
人脸作为一种生物特征,并不是一成不变的。
随着年龄的增长,人的容貌会发生改变。
人的心情不同,面部表情不同,人脸也会发生不一样的变化。
人的装束,发型,脸部的装饰等等,都会给识别工作带来干扰。
如何克服这些变化,从而达到最好的识别效果,是人脸识别的难题之一。
第三,人脸识别的约束性。
根据现在的技术,人脸识别只是在光照比较稳定,用户配合度高的环境下才能取得良好的效果。
但是很多情况下,识别环境会有光线变化和拍摄角度变化。
如何处理光线的变化和人脸角度的变化是人脸识别的另一个主要困难。
只有克服了这些困难,才能实现实用的,鲁棒性强的人脸识别。
人脸识别流程人脸识别主要分为两个部分,一个部分是学习(训练)过程,另一个是识别的过程。
人脸的检测是学习和识别的先决条件。
首先要对视频或者图片中的人脸进行检测和跟踪。
第二步要将跟踪的人脸进行裁剪,灰度化等各种处理。
第三部是对处理过的样本进行特征值的提取。
在学习过程中,要将特征值全部存入一个样本库中,以便识别时调用。
在识别过程中,要将样本的特征值,通过特定的距离算法,选出与样本库中特征值最相近的样本,作为检测结果。
当然,如果检测样本与最相似的人脸距离超过一个阈值的话,则可以判定该样本库中不存在检测样本对应的人脸。
人脸识别主要方法人脸识别有很多成型的算法,从各个角度对人脸的区分进行了研究。
下面列举了一些主要的人脸识别算法。
基于几何特征的人脸识别:基于几何特征的人脸识别是利用面部器官的形状,结构等特征进行识别的方法。
人的面部器官的大小和形状会根据个体不同而有变化,而不同的人这些器官之间的距离也是不同的。
这些差异放到一起,组成了千差万别的人脸。
基于几何特征的人脸识别正是利用了这些差异对人脸进行识别的。
基于子空间的人脸识别:基于子空间的人脸识别方式是指通过对人脸图片矩阵进行线性或非线性的矩阵变换,投影到低维矩阵上,进而进行人脸识别的方法。
基于子空间的人脸识别的代表主要有主成分分析(PCA)、奇异值分解等方法。
基于神经网络的人脸识别:基于神经网络的人脸识别可以获得其他方法难以获得的人脸规则和特征的隐形表示。
但是这种方法通常需要多个样本进行学习。
基于神经网络的人脸识别中最有影响力的是动态链接结构。
基于小波变换特征的人脸识别:小波变换特征原是应用在信号处理方面的工具,近年来被用在人脸识别领域。
弹性匹配方法是小波变换特征识别的代表。
基于隐马尔科夫模型的人脸识别:此方法最先被用在声音识别上,后被引入到人脸识别领域。
隐马尔科夫模型中节点表示状态,有向边表示状态之间的转移。
隐马尔科夫模型的鲁棒性较好,受姿态等影响较小。
识别率较高。
系统基本思路本程序分为三个模块,分别是样本采集模块,训练模块和识别模块。
样本采集模块样本采集模块的主要功能是采集人脸部分的图片,并进行裁剪和灰度化处理。
首先是要检测到人脸所在的位置并进行跟踪。
这里我们使用了OpenCV提供的Haar模板匹配的方法。
将图片以方阵为单位进行顺序扫描,如果发现符合的矩阵,对其进行画框标记,以告知使用者发现人脸。
然后将画框的人脸图片从采集到的图片中裁剪出来。
样本裁剪的大小是统一的。
这里我们使用的大小是100px*110px(w*h)。
然后将裁剪好的图片进行灰度化处理。
将处理之后的图片保存起来,作为经过预处理的样本。
训练模块训练模块是整个程序的核心模块。
训练模块的主要功能是计算样本的特征值,形成样本模板库。
这个阶段需要的输入是样本采集模块形成的预处理过的样本图片。
首先将所有的样本图片进行矩阵的累加,然后除以样本总数,得到平均脸的图像。
第二步,将得到的平均脸进行奇异值分解,得到一个左奇异矩阵和一个又奇异矩阵。
然后,将所有样本图片依次向平均脸进行投影,具体投影方法参见上图。
注意要将左奇异阵和右奇异阵进行转置后再做乘法。
最后,取所得矩阵的对角线元素作为该样本的特征值进行存储。
识别模块识别模块是一个待识别图像的特征值和样本库中的特征值进行比较的过程,是实现识别功能的一个过程。
首先,要按照学习模块的方式求出样本的特征值。
然后,将待识别样本的特征值与样本库中得到的图片的特征值一一进行比对。
我们采用了最近邻近分类器(NNC),即用待识别样本的特征值与样本库中所有的特征值计算距离,取距离最近的那个特征值所在的分类作为最后的识别结果。
系统理论基础奇异值分解本系统主要的理论基础是基于奇异值分解。
下面介绍一下奇异值分解:假设A为一个阶矩阵,不失一般性假设。
A中所有元素都属于实数域或复数域。
则存在这样一个分解使得:其中,U和V为正交方阵,U称为左奇异阵,V称为右奇异阵奇异值分解有如下性质:1.稳定性2.位移不变性3.与对应图像亮度成比例变化4.旋转不变性5.转置不变性奇异值分解相对于其他特征值分解的一个显著优势是,在保留了图像物理特征的基础上,将特征值的计算从方阵扩展到了一半矩阵。
奇异值分解的稳定性、位移不变性等性质,也确保了人脸小幅度的变化情况下的识别率。
系统实现这部分是系统的常量定义。
定义了系统中通用的常量,包括图片和样本特征值的存储地址,图片和特征值的存储格式,样本图片的尺寸大小,每个人训练的样本个数,人脸分类器的名称等。
通过定义这些常量,方便了程序参数方面的改动。
这部分是人脸检测部分。
首先加载人脸分类器“cascade.xml ”。
然后对从摄像头获得的单幅图像进行Haar 特征的检测。
由于640*480的原始图像大小检测速度过慢,所以我们先将原始图像缩小的一半的大小,即320*240,然后对人脸位置进行检测。
这种方法没有降低人脸检测能力,而检测速度大为提升。
另外,为了进一步提升检测速度,对检测的范围也做了一个约束。
最后将小图像里的人脸位置按比例放大到原始图像大小,并在原始图像中标记显示出来。
这部分代码是负责计算平均脸。
“average[][]”是存储所有人脸图片累加的数组。
这里对这个数组的每个元素除以总学习样本个数,得到的就是平均脸的图像。
此部分代码对所得的平均脸进行了奇异值分解(SVD),得到左奇异阵和右奇异阵。
为了方便下一步的计算,对左奇异阵进行了转置。
此部分代码是对每一个样本向平均脸投影,将得到的结果存储起来。
其中投影用到的左右奇异阵都是上一步得出来的。
这部分代码是求两个样本特征值之间的距离。
我们使用的是欧拉距离。
也就是对应元素之差的平方累加后开平方的结果作为两个向量间的距离。
运行结果初始界面:1、获取样本图片;2、训练所有样本;3、识别;4、推出系统人脸检测过程,粉色的方框里是样本采集时人脸的部分。
可以看到方框是一个矩形,而不是正方形。
这正是奇异值分解方式相对于其他特征值分解方式的优势。
识别结果。
前面显示的是样本库中特征值和待检测样本特征值的欧拉距离。
最后显示的是距离最小的特征值所在的样本库的名称,作为检测结果。
系统缺陷1.系统对光线敏感。
如果系统在学习和识别过程中,光线强弱或者偏向有较大变化,则系统无法正确识别检测对象。
2.系统无法对大的表情变化进行矫正。
如果检测对象的表情和样本库中的表情有较大差别的话,则可能无法正确识别检测对象。
3.系统无法对头部大的转动或倾斜做出处理。
如果头部转动或倾斜过大,则会产生识别错误。
心得体会通过这次的大作业,我学到了很多的东西。
首先,对人脸识别方面有了一些初步的了解。
了解了很多人脸识别的方式方法。
也初步实现了其中的一种方法。
虽然识别时候的,在光源比较稳定,参与者配合度高的情况下,取得了良好的识别效果。
但是由于算法简单,所以系统的鲁棒性较差,在光线变化较大,人脸扭曲或转动过多的时候,识别的准确率大大下降。
第二,通过这个大作业,我对OpenCV编程有了一些了解,并使用了其中的一些函数。
虽然在使用过程中遇到了很多使用上的困难,但通过查资料,也都一一找出了解决的方法。
充分的锻炼了解决问题的能力。
第三,借助这个大作业,我阅读了很多人脸识别相关的论文。
刚开始看的时候对里面的算法很头痛。
一点都看不明白,十分苦恼。
但是经过一些研究之后,现在已经能对基本的算法有一些理解。