概要
人脸识别技术是一种新型的生物特征认证技术。人脸识别技术也是一个非常活跃的研究领域,涵盖了许多领域,例如数字图像处理。随着人们对应用程序需求的增长,面部识别技术趋向于大量使用,使用微芯片和标准化。人脸检测是快速准确识别人脸的先决条件。其目的是检测图像背景下的人脸,并将其与数据中的人脸进行比较,以实现人脸识别。
本文以python为开发技术,前端实时检测摄像头人脸,人脸识别主要是使用 mtcnn做人脸提取,使用facenet做人脸特征提取,通过余弦相似度分类进行人脸识别。系统界面简洁、识别迅速、使用方便。
本文首先介绍了人脸识别系统的现状及其发展背景,然后讨论了系统设计目标,系统要求和总体设计计划,并详细讨论了人脸识别系统的详细设计和实现。 系统最后进行面部识别。 并对系统进行特定的测试。
关键词:人脸识别;python;机器学习
一、研究背景与意义
1.1.1研究背景
现在,随着科技的不断发展,我们的生活变得越来越便利也越来越智能,无论是支付宝微信支付,在边境出入关口,在政府机构办理业务等等,我们都能够使用指纹和人脸这些生物特征技术。并且伴随着讲究的不断深入,大大降低了识别技术的成本,人们开始逐渐接受这些技术[15]。其中最为突出,最为广泛,热议度最高的当属于人脸识别技术了[3]。
人脸识别,顾名思义就是在图片和视频中检测有没有人脸。当发现一个人的脸时,会获取其他面部特征(眼睛,嘴巴,鼻子等),并根据此信息将该人与已知人脸的数据库进行比较。标识一个人的身份。人脸检测是使用计算机确定输入图像中所有人脸的位置和大小的过程。面部识别系统是由面部识别系统引入的,该系统可以包括面部图像,输出是面部和面部图像的存在之和,描述了位置,大小,参数化位置Do和方向信息[1]。假定检测面部的问题始于识别面部的研究。全自动面部识别系统包括与两项主要技术的链接:面部检测和提取以及面部识别。完成自动面部识别的第一个要求是确定一个人的面部。人脸识别是自动人脸识别过程的第一步,它基于自动人脸识别技术。自动人脸识别系统的速度和准确性起着重要作用。
人脸识别系统可以应用于考勤、安全、金融等领域,应用广泛,大大提高了工作效率,提高了服务水平,身份认证变得更加科学、规范、系统、简单。
1.1.2研究目的
实行垃圾分类是生态文明,保护环境的重要环节。简单粗暴的垃圾焚烧、垃圾填埋、垃圾堆放等等都不仅会导致严重的环境污染还会占用土地资源,甚至严重的影响人的身体健康,然而实行垃圾分类,它可以弃废为宝:把纸箱,塑料,金属,布料等可回收垃圾进行分拣、加工、打包等步骤就成为了新的衣服,窗帘,塑料箱等新的商品进行销售;把剩菜剩饭、腐烂水果等厨余垃圾经过预处理分成油脂、污水和残渣等,其中油脂运到油脂加工厂进一步加工,油脂加工生成的生物柴油可用来使用在汽车上做燃料。污水排到污水处理站经过处理后再排放,降低水资源的污染。而残渣可以进行发酵产出沼气可用来发电,发酵后的残渣还可以作为有机营养肥料,助于植物的生长;最终有害的电池、灯泡、水银、化妆品等有害垃圾,还会进一步分为有无作用垃圾,有用的垃圾要进行深度的加工,无用的垃圾才被拉到一个专门设置过的填埋场进行填埋。这一系列都是垃圾分类的重要处理过程,显而易见,垃圾分类的实施不仅达到资源的循环利用,还可以减轻资源紧缺的重要问题,进行垃圾分类还可以提高人类的的素质素养,以及价值观念,让社会上都养成勤俭节约的作风,学会节约资源,利用资源。
然而要全面推广垃圾分类,人类必须要了解垃圾所对应的类型。本课题的垃圾分类图像识别就是解决人类对垃圾分类的疑惑。人们可以通过垃圾图片及摄影可得出垃圾类型,从而学习分类垃圾以及对垃圾的正确投放。因此,此课题的设计研究对国家社会以及社会环境有着非常积极的作用。
1.1.3研究意义
通过这次课题的设计与研究,深深的认识到垃圾对我们人类带来的巨大的影响,为自己以前做过乱扔垃圾的行为感到十分的惭愧。在研究过程中,不断地改变了自己对垃圾的价值观,提高了自己的探究能力以及专业能力。本设计对垃圾图像或者用摄像头对垃圾进行识别,有助于使用者能够通过最简便的方法来得知垃圾的类型并且提高投放垃圾的准确率,可降低环卫工人的工作量,加快社会环境的环保。此研究还可对社会提供借鉴价值,推广实施垃圾分类,营造美好环保家园。由此可见,本次研究的深度学习算法垃圾分类图像识别不能进对个人,社会,国家都有着非常大的意义,是一个值得探究的课题。
二、技术理论
2.1开发工具
2.1 python技术
Python是一种开发语言,一种用于计算机程序设计的开发语言,并且允许面向对象的编程。 Python由Guido van Rossum开发。 Python具有许多功能,例如简洁的语法,免费的源代码和种类很多的数据库和第三方库[5]。由于这些优点,您可以非常快速地与其他语言结合以实现各种功能模块。许多人都被昵称为"胶水"。使用Python快速编程的原型是许多程序员当前使用的一种方法。在任何有特殊要求的地方固定都很方便。
PyQt是一个工具包,主要可以创建带有图形界面的程序。Qt库是一个功能强大的库。 PyQt实现了一组Python模块。PyQt受人青睐的原因是因为其拥有数据庞大的类和功能。不仅如此,其跨平台开发的特点也是其受青睐的原因,例如UNIX,Microsoft,Apple。此外,PyQt具有双重证书,可提供跨平台性能。
在使用Python安装平台之前,用户必须设置环境变量以加载和运行取决于另一个平台的不同版本运行。
Python 特点
1.阅读起来简单:由于Python代码简洁,而且定义也非常清晰,所以阅读起来更加简单。
2.维护起来方便:Python的维护简单方便。
3.标准库多:Python自身带有许多免费的,开源的,功能强大的数据库。
4.具有方便的互动模式:有了互动模式的支持,开发者可以从代码就可以看到结果,这样开发者对程序的测试与调试,变的更方便。
5.可移植性好: Python可以跨平台运行。
6.扩展性非常好的:如果有关键的代码,你可以用特殊的语言进行编写,也能够在系统中调试运行。
7.数据库接口多:Python可以与市面上大多数的数据库连接。
8.可嵌入性强: 为了提高实用性,Python可以嵌入到多种语言中。增强程序的适用能力。
当然python相对于其他语言也有自己的缺点,在运行速度这一方面,他虽然能够满足用户的需求,但是相对一些经典语言(C,C++,JAVA等)还有点慢。由于是新型的语言,在使用的推广度上,用户还是没有那么多。但是由于python的优势比较明显,现在越来越多的用户开始对它进行关注。最后就是目前市面上关于python的中文资料比较少。在查找和深入研究上有些限制[9]。
2.2 图像检测简介
图像检测,顾名思义,就是通过某种算法,把图像中的需要处理那部分图像进行定位与获取。这也是图像识别的最重要的一步。一般都是采用图形分割技术,图形分割技术又与图形的特征提取和图像处理密不可分[4]。
图像检测的方法有很多种,这里简单介绍以下几种较常用的方式:
1 基于直线检测的方法
顾名思义,通过检测图像中的直线(通常是图像周围的所有边缘)来识别直线。 通常使用的检测方法是霍夫变化和其他方法。 原理是按形状查找图像。但是,在实际应用中,许多因素都会影响定位效果,例如光线不均匀,灰尘和尘埃,图像模糊或曝光过度。当然,霍夫算法也有其缺点。它仅检测直线,不考虑图像形状的将来变化。同样,霍夫的空间不能一次匹配一个原始图像空间。 不能指定霍夫空间中的特征点。图像轮廓的初始位置不能避免在直线上产生干扰的问题,并且在直线上存在干扰的情况下,无法提取帧[7]。
2 基于阈值化的方法
这种方法的主要特点是可以对图像应用阈值,以获得具有单个字符和背景的二进制图像。 尽管目前提出了各种关键策略,但是简单算法对二值化的影响很小,但是复杂算法由于计算时间长和计算复杂性而限制了计算时间。在现实生活中由于上述原因,这类方法没有取得太大的普及。
3 基于灰度边缘检测方法
此类方法一般使用两种方式,一种方式是利用图像区域局部对比度明显,另一种方式为灰度有规律变化的纹理特征,通过这两种方式相结合来定位。
(1)基于灰度直方图的门限化边缘检测
通过灰色直方图检测阈值极限是最常见和最简单的方法。 这种边缘检测方法的原理是搜索对象。 背景图像在被摄体上有很好的边缘。 该图像的灰度直方图为2个峰值。
(2)基于微分的边缘检测
①一阶差分边缘检测
人像的边缘点将显示像素灰度值急剧变化的特征,具有相对较大的差值。当差值方向和边界方向相互垂直时,此时差值最大。因此,只要对f(i,j)的所有方向上的差值进行第二次阈值化,就可以通过处理来检测边缘像素点,从而获得边缘图像。
②二阶差分边缘检测
与一阶差分边缘检测一样,人像的边缘点会表现出像素点灰度值急剧变化的特征。图像的灰度值将用于沿着x,y或者进行二次差分,然后通过差分后的一些属性来检测边缘。
③根据边缘的位置,图像的灰度值变化很大。相对应的连续函数的坡度最大。 常用的算法有Roberts运算符,Prewitt运算符和Sobel。 另一种更直观的方法是使用当前像素附近的一些像素值合成表面,并计算像素连续表面的斜率。 最大的梯度就是肖像的边缘。
2.3 人脸识别简介
2.3.1 人脸识别阶段
人脸识别作为图像处理的一次尝试,目前有了很大发展和突破。主要流程包含:首先利用机器分析,对特征信息进行提取,然后进行查找和匹配,从而达到识别人脸的目的。目前人脸识别技术已经渗透到我们的生活,比如人脸支付、人脸门禁、人脸购物等等。伴随着科技的不断发展和人们需求不断地增加,人脸识别技术也在不断地成熟和稳定,其发展大概分为三个阶段。
(1)第一阶段
人脸识别的创始人Bledose,他把人脸进行特征提取,比如组成人脸的眼睛、鼻子等作为参数,人脸识别系统的雏形得到了建立 。
(2)第二阶段
因为在收集分析信息方面人们变得变得更加简单,在199几年初,图像处理的关键发展方向已经从一些基础的处理转向了整体人脸识别。并且由于计算机技术得到不断的突破。人脸识别的方法更加呈现百花齐放的状态例如:灰度处理,人脸模型等等。
(3)第三阶段
人脸识别技术是在1990年代后期开发的,随着市场需求的持续增长,它已成为关注的焦点。在世界上每个国家,我们都在争夺人脸识别技术的发展,但是基于成熟的技术,人脸识别技术也存在严重的缺陷。直到现在,人脸识别技术仍然对世界感兴趣,并且还在不断发展。
2.3.2 人脸识别方法
人脸识别的方法有很多有根据眼耳口鼻的形状和它们之间的距离来识别,此外有将图片进行压缩并且正交变换来进行识别,其次有通过机器学习用函数来进行训练识别。此外还有一些常用的模型识别方法,如NM,HNM等。
2.4 深度学习算法及CNN
人工神经网络是一个动态系统,是一个自适应的非线性动态系统。每个神经元在单独分开来看的时候其自身的功能和结构对于其他来说是简单的,但如果我们将由大量神经元进行组合连接,其呈现的东西是十分强大的。
人工神经网络之所以称之为人工神经网络,主要是因为它能反映人脑功能的一些基本特征。虽然这只是对人脑功能的抽象化呈现和模拟。但是对于普通的计算机来说,他不是单单地执行代码所能呈现的功能,一步一步往下操作,它能在执行代码程序的过程中不断去适应环境,自我地去学习,优化自身,总结学习上的规律。因此人工神经网络在这几个方面上更接近人脑。
在人工神经网络在一开始像一个初生的婴儿一样是一张白纸,他要通过不断地学习才能进行工作。比如说在设定"一"代表"1","二"代表"2"以此类推,人工神经网络便要去学习。
在现实生活中神经网络的优势更多地体现在分类的问题上,比如图书推荐,酒店推荐等等。像LR或者linear SVM这些分类算法在面对一些非线性分类的时候,LR通常需要靠特征工程做特征映射,而SVM需要选择核。这些 操作往往会增加计算量,延缓运行速度。而神经网络在具有三层或三层以上结构的时后,它能够很好地实现非线性可分。并且计算量会相比LR或者linear SVM少得多。
之前的人工神经网络存在一个问题:就是数据的传递都是一整个传递,这导致越往后所需要处理的像素参数会越来越多。 直到卷积神经网络(简称ConvNet或CNN)的出现来=才解决此类图像处理问题[11]。
CNN:CNN也称被为卷积神经网络。他拥有两个不同功能的神经元。一个是C,另一个是S。C代表的是卷积。主要用于特征提取。 S代表子采样,实际上是池化操作。LevelC是特征提取的Level[12]。每个神经元都只和上层的一部分相连接,在这一部分确定后,其他未连接的部分也会被映射下来。网络中的每个处理级别都包含多个功能图。每个对象都映射在一个平面上,并且平面上的所有神经元具有相同的权重。同时,它主要包含可用于特征分类的函数,可以是S型激活函数或RELU函数。 Sigmoid的优点是输出范围有限,并且在传输过程中不容易分散数据[2]。
CNN算法成功的关键是通过减少参数数量并证明使用局部连接方法和权重分配方法的图像处理优势,从而接近当前的生物神经网络。除了减少参数数量外,CNN还使用特征提取。这使您可以直接插入启用了复杂图像预处理的原始图像。因此,目前,基于CNN的特征提取正在取代在人工视觉领域已经积累了10多年的各种特殊模型或技术,并且该领域几乎存在标准的预处理方法。以前,功能是手动开发的,因为对于各种可识别的对象有许多有用的功能,并且它们高度依赖于经验。现在,CNN可以轻松做到这一点,从而避免了在特征提取和分类过程中数据恢复的复杂性。
三、系统分析
3.1 人脸识别流程
用户在使用人脸识别时,首先进行人脸的检测,如果发现人脸然后进行识别。流程如图4.2所示。
图4.2 人脸识别流程图
1在MTCNN人脸检测模型中,从照片中提取出对应的人脸。
2.把人脸图像输入到FaceNet,计算Embedding的特征向量。
- 人脸识别:判断两者之间的余弦距离,若复合要求,则判定为同一人否则便不是,例如当特征距离小于1的时候认为是同一个人,特征距离大于1的时候认为是不同人。
3.2 系统功能设计
根据第三章功能分析,得出人脸识别系统的功能结构,如图4.3所示:
图4.3 系统功能结构图
四、系统实现
4.1人脸检测
MTCNN是一个多任务卷积神经网络,他将人脸的区域检测和人脸的关键点检测放在一起来提高性能。 特别是在三个CNN阶段中,从粗略到准确地处理预测人脸和脸部标记点的任务[12]。
1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和Faster R-CNN中的RPN一脉相承。
2:使用R-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。
3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。
网络结构如图4.4.
图4.4 mtcnn结构
首先将收集到的人脸信息存储在一个共同的文件夹之中,方便为后续的人脸检测提供便利。
图4.5已经储存的人脸
在人脸导入完成之后,对已经存在的人脸进行人脸的检测和注册,并且会进行两次检测,提高检测率,当图片不符合要求时,会提示注册失败,请更换图片的字样。
图4.6 人脸的检测和注册成功
4.5.2 人脸识别
FaceNet用来对比人脸之间的匹配度。 其主要思想在多维空间中显示人脸图像,并通过空间距离表达人脸的相似性。 如果检测的人脸和识别的人脸的空间距离较小则为同一人脸,反之则为不同的人脸。 如此,在平面图像中的脸部信息可以通过空间映射来进行表现,并且可以进行对比,达成人脸识别的功能。 FaceNet是一种在机器学习的环境下的对人脸信息点进行映射的方法,并使用三重子损失特征来形成神经网络。
FaceNet的网络结构如下图4.5所示,其中Batch表示的是已经输入的人脸样本,DEEP architeture是指一种深度学习的框架,然后用L2将图像的操作映射到一个超球面上,经过之前的一系列操作生成深度学习之后的特征向量,最后三张图片输入的loss。
图4.5 facenet网络结构
运行人脸识别代码,在原人脸已经检测和注册的情况下,运行代码后,系统自动打开摄像头,并且识别框内人脸,当实时的人脸和已注册人脸相匹配时,会产生人脸金字塔。具体效果如下图:
图4.8 实时人脸识别匹配效果
4.5.3 人脸识别效果
运行系统。然后进行人脸的检测识别,界面如图4.6。
此外,为验证此人脸识别效果,我在网上找了两个开元库,对算法的人脸识别率进行了检测。分别提取了库中30%的数据进行检验识别率为100%。并且生成混淆矩阵。检验效果如下:
图4.9 ORL_embedding识别效果
图4.10 YALE_embedding识别效果
五、 总结
本系统通过对python和人脸识别技术简介,并且在技术,工作环境等方面说明了人脸识别系统的可行性,本文结论及研究成果如下:实现了基于机器学习的人脸识别系统。通过本次人脸识别系统的研究与实现,我接触到了一门新的编程语言:python,从一开始的理论知识,到后面的实践,我都体会到了其重要性,因为这是第一次我如此完整的从需求分析,设计,到测试来进行开发,所以仍然会有许多不足的地方,也会有许多考虑不到的地方。
对于我本人来说我本人是没有很多太深的了解的,所以在开始设计的时候总会出现一些简单却又十分繁琐的问题,例如测不到人脸、识别率不高以及数据库连接有问题已经无法实现参数的传递等等,不过随着自己对于人脸识别的不断深入地学习以及通过在网上寻找有关资料下最后都得到了解决,在此过程中,不仅加深了我对于人脸识别专业知识上的理解,也提高了自己独自解决Bug的能力,令我感受更深的是,虽然书上的理论知识虽然是设计的必要条件,但是书上的知识也是死的,如何将死的东西变成活的就需要看自己对于姿势的理解,每个人对于题目的理解,编程的思路和对数据的处理都是不同的,这时候便体现出实践的重要性,因为实践才是检验真理的唯一标准。这次毕业设计,我不单单是完成了学校的任务,更重要的的是我提升了我自己,这更是一次宝贵的经验,为我之后的发展有很大的帮助。
通过这次人脸识别系统的开发,我参考了人脸识别和机器学习的文章和例子,人脸识别这个热门话题下,有许多参差不齐的文章和博客,我要做的便是弃之糟粕去其精华,理解其关键的东西,来改善自己的系统,虽说任由许多不足,也让我在这方面收获甚满。
六、 目录
目录
第一章 概述 6
1.1课题背景及意义 6
1.2 国内外研究现状 6
1.3 本课题主要工作 7
第二章 系统开发环境 8
2.1 python技术 8
2.2 图像检测简介 9
1 基于直线检测的方法 9
2 基于阈值化的方法 9
3 基于灰度边缘检测方法 9
2.3 人脸识别简介 10
2.3.1 人脸识别阶段 10
2.3.2 人脸识别方法 10
2.4 深度学习算法及CNN 10
第三章 系统分析 12
3.1 可行性分析 12
3.1.1 技术可行性 12
3.1.2操作可行性 12
3.1.3 经济可行性 12
3.1.4 法律可行性 12
3.2需求分析 13
3.2.1 功能需求分析 13
3.2.2 性能需求分析 13
3.3开发环境分析 13
(1)开发硬件平台: 13
(2)开发软件平台: 13
第四章 系统设计与实现 14
4.1系统设计原则 14
(1)数据安全性 14
(2)易用性 14
(3)柔软性 14
(4)扩展性 14
4.2系统流程设计 14
4.2.1系统开发流程 14
4.2.2 人脸识别流程 15
4.3 系统功能设计 16
4.4接口设计 16
4.4.1 外部接口 16
4.4.2 内部接口 16
4.5系统实现 16
4.5.1 人脸检测 16
4.5.2 人脸识别 18
4.5.3 人脸识别效果 19
第五章 系统测试 21
5.1测试环境与条件 21
5.2功能测试 21
5.3测试结果分析 24
总结与展望 25
谢 辞 26
参考文献 27
附录 28