基于人脸识别的动态识别签到系统设计与实现.docx
《基于人脸识别的动态识别签到系统设计与实现.docx》由会员分享,可在线阅读,更多相关《基于人脸识别的动态识别签到系统设计与实现.docx(28页珍藏版)》请在冰豆网上搜索。
基于人脸识别的动态识别签到系统设计与实现
基于人脸识别的动态识别签到系统设计与实现
DesignandImplementationofDynamicRecognitionCheck-inSystemBasedonFaceRecognition
内容摘要
目标检测(ObjectDetection)是近年来计算机科学的研究重点,他可以通过识别目标的几何特征,将复杂的场景分割并针对特定的目标进行识别,关键点在于准确度以及实时性。
人脸识别(Facerecognition)则是目标检测中,让人最为看重的一个子类。
一旦我们的人脸识别技术足够成熟,意味着我们不再需要其他物理的钥匙或者是数码的密钥,而是用一张脸,就可以满足日常生活中的一切。
世界上可能有很多相似的人脸,但是绝对没有完全相同的两个人。
当人脸识别技术足够成熟,我们完全可以将人脸识别作为身份分类的一个重要指标。
在深度学习的刺激下,人脸识别有了巨大突破,机器也变得会“思考”。
这意味着人脸识别的安全等级将会提高,可以适用于更多安全要求更高的场景,同时人脸识别的研究也可以推动更多神经网络、图像处理等的领域发展。
关键词:
□目标检测□人脸识别□深度学习
Abstract
□
ObjectdetectionistheresearchfocusofComputerScienceinrecentyears.Itcanrecognizethegeometriccharacteristicsofthetarget,segmentthecomplexsceneandrecognizethespecifictarget.Thekeypointistheaccuracyandreal-time.Facerecognitionisoneofthemostimportantsubcategoriesintargetdetection.Onceourfacerecognitiontechnologyismatureenough,itmeansthatwenolongerneedotherphysicalkeysordigitalkeys,butwithaface,wecanmeeteverythinginourdailylife.Theremaybemanysimilarfacesintheworld,butthereareabsolutelynotwoidenticalpeople.Whenfacerecognitiontechnologyismatureenough,wecantakefacerecognitionasanimportantindexofidentityclassification.
Underthestimulationofdeeplearning,facerecognitionhasmadeagreatbreakthrough,andmachineshavebecome"thinking".Thismeansthatthesecurityleveloffacerecognitionwillbeimproved,whichcanbeappliedtomoresceneswithhighersecurityrequirements.Atthesametime,theresearchoffacerecognitioncanalsopromotethedevelopmentofmoreneuralnetworks,imageprocessingandotherfields.
Keywords:
□objectdetection□facerecognition
□recognitionspeed
第一章:
绪论
1.1研究背景及意义
传统的目标检测技术主要是通过几何特征对图像进行切割,进而对切割出的素材进行几何分析,根据特征将其分类。
但是实际使用中,各种物品杂乱无章重叠摆放,部分物品特征会被覆盖导致目标检测准确率较低,实用型并不高。
而人工智能的到来,为我们展示了不一样的世界。
目前,各种人工智能设备早已被大众所接受,各种IOT设备也已经被量产。
物联网完全可以凭借AI这杆利刃,更上一层楼。
人工智能所带来的不仅仅是全新的人机交互体验,同时他也带来了更多技术工种的就业机会,人工智能可以跨越多行业相结合,也就意味着需要更多的人才去进行智能训练,人工智能就如同当初的自动化革命一般为我们的社会注入新的血液。
人脸识别技术早在几十年前的科幻电影中就已经出现,跟着机器学习的脚步,它也走出电影来到了我们的生活中。
传统的物理密钥、密码都存在被盗取的风险,而人脸不一样,就算是双胞胎之间也不存在一摸一样的五官角度,因此人脸识别是我们进行身份管理最安全的一项技术。
当人脸识别技术越来越普及,我们的数据集会越来越丰富,通过更多的训练,可以让机器更加的智能,更好的适应我们的生活所需。
在机器学习研究前期,机器算法都比较简单。
在处理较为单一的场景下,有很优秀的表现。
但当涉及到较为复杂的数据衍变时,简单的算法结构的输出结果准确率极低。
例如处理自然信号。
在1980年,深度学习出现了。
它的概念是在对人工神经网络的过程中所提出的,它的设计出发点在于建立一个机器人脑,通过模拟人体大脑的工作过程,来研发出一整套神经网络来处理和解析获取的复杂数据,例如影、视、音等。
深度学习是通过对输入信号分解并组合低层次的特征,然后用来表示目标的特征或者是类别,并将特征输出。
由于各种外界因素的影响,人脸识别的准度和精度还是不能满足所有场景的需求。
人脸识别在二维上的发展可能比较完善,但是我们还可以通过三维图像综合识别,也可以通过引入时间概念,通过对不同时间段的识别来确定识别对象的身份。
因此,人脸识别的道路,还有很长。
1.2如何实现人脸识别
1.2.1基于几何特征的人脸识别
几何特征主要为五官的模型差距以及五官之间的距离以及几何关系。
该算法在理论上容易理解,识别的速度快,原理简单,所占用的内存相对较少,遗憾的是识别率较低,不够准确。
1.2.2基于特征脸(PCA)的人脸识别方法
特征脸方法是基于K-LT所提出的人脸识别方法,K-LT全称是Karhunen-Loèvetranslation,他是一个最优正交变换,此前用于压缩图像文件。
通过对N维图像进行K-LT变换,获取到一组低次分量。
在其中选取重要的分量,然后扩张为线性空间并进行投影,所投影出来空间的即为我们判定是否为相同人脸的一个特征量。
特征脸方法的缺点在于它需要大量的训练样本,才能保证识别精度的一个准确性,并且完全是通过图像灰度对特征进行统计的。
特征脸方法也有许多不同的版本,适应在不同要求的场景下,但大体上原理都是一致的。
1.2.3神经网络的人脸识别方法
神经网络的特点在于输入变量类型更多,他会根据输入值的不同,通过不同的智能算法进行分析,不同于传统的识别方法一般都需要完整的人脸,但是神经网络可以通过部分人脸进行分析,并得出结论。
当然,结论可能无法直接利用,却可以筛选掉一些不符合的人,从而减少我们投入的人工。
同时,缺点也十分明显,需要较多的训练样本来对神经网络进行适应性学习,训练样本的数量跟识别的精准度是成正比的。
1.2.4弹性图匹配的人脸识别方法
弹性图匹配的思路是从生物学的角度出发,定义基本脸型,通过二维拓扑表现出来。
同时,该拓扑上图像所有顶点都作为该脸图的特征量,可以用来表示该点周围的线性关系。
其中弹性二字的意思是,允许图像对比时具有一定的弹性变法,这样可以克服微表情变化所带来的识别障碍。
通过几何因素与灰度化特征相结合,弹性图匹配被广泛应用在流式处理的在线识别产品上。
更重要的是,它并不需要大量的训练样品进行适应性训练。
1.2.5LHD的人脸识别方法
LHD是一群心理学家所提出的识别方法,他们认为人类对于轮廓线条的识别精准度以及速度上并不差,因此他们提出了LHD。
它从灰度化的人脸图中,提取其中的轮廓线,用LDH来表示不同线条之间的距离关系。
更重要的是,LDH没有建议两个线段之间的唯一对应关系,因此它可以从多个方面验证单一线段是否发生了某种可容忍的变化,用来表示对不同人脸之间的相似程度。
从结果来看,LHD绕过了光照条件以及姿态变化,因此在这方面他显示了较良好的识别性能,但是由于轮廓无法体现人脸表情,因此它在表情处理方面识别效果并不如人所意。
1.2.6SVM的人脸识别方法
SVM中文名是支持向量机,在近几年,他也进入了智能识别领域的研究者眼中。
通过支持向量机,用学习机的泛化能力换取更高的计算性能。
SVM在识别过程中可以帮助我们将识别人脸分解为多个特征变量,进而根据特征变量来对人脸特征进行比对得出人脸识别的结果。
通过SVM可以提高人脸识别的识别率,但同大多数识别方法一样,SVM需要大量的训练样本,而在实际应用中训练样本数量往往不足。
并且SVM的训练过程耗时长,算法种类也有各有千秋,因此该方法并没有一个统一的定论。
1.3本文的主要工作
本文从目标检测出发,针对人脸识别进行研究,讲述了人脸识别的研究意义以及发展方向。
着重介绍了深度学习对于人脸识别研究的巨大帮助,深度学习让人脸识别能够更加智能的识别,增加识别的速度以及精度。
人脸识别目前已经广泛应用在企业打卡签到以及部分智能家居产品上了,但部分特殊的场景还是没有采用人脸识别,而是利用更精密的识别手段诸如瞳孔或者物理密钥这种形式。
这主要是由于人脸识别的缺点比较显而易见,它存在被欺骗的可能性。
同时,针对脸部丰富的表情变化以及外界环境光照等不可预见的因素,人脸识别可能会受到影响、或许是识别速度过慢或者是无法正常识别等问题。
本文简单地实现了一个动态人脸识别的签到系统,识别流程大抵是先对素材库中的人脸预处理,以包含人脸特征的二维数组这种形式缓存下来,在打开摄像头进行识别的时候提取关键帧的人脸并处理为测试数据,将其与缓存中的素材集进行对比,根据相对应的阈值找到素材库中对应的人名,保存在签到名单中。
当摄像头关闭时将签到名单保存为TXT在项目根目录中。
对于预处理素材库中的素材这一步,被处理过的素材会缓存在内存中,因此当素材过多时对内存资源要求较高。
本文一共分为四个章节:
第一章:
绪论,针对人脸识别与深度学习的结合,人脸识别焕发了活力,介绍了人脸识别的多种方式及其效率以及人脸识别对科技生活的巨大帮助。
第二章:
拥有深度学习新特性的人脸识别与传统的人脸识别相比的优势所在。
第三章:
通过face_recognition实现了一个动态的人脸识别签到系统,拥有在线添加素材、实时人脸识别、导出签到人员表等功能。
第四章:
如何突破现在人脸识别效率与准确率无法并取的现状。
第五章:
结论与展望。
第二章:
人脸识别的新特性-深度学习
2.1深度学习
我们将深度学习分为“深度”“学习”两个过程来理解:
学习的词义解释是指通过阅读、听讲、思考、研究、实践等途径获得知识或技能的过程。
在深度学习中,其实也差不多,只是我们的输入值不再是通过听讲、思考等动作,而是换成了机器能够读取的一个个数据集。
而深度的意思是,从输入值到输出值这个过程中,所要经历的各个计算过程,它们各自联系,由浅入深,最终输出我们想要的数据。
而这个计算过程,有好有坏,有的效率高输出值缺不准确;有的效率低,输出值却准确。
因此,我们可以形象的称这个过程为“学习策略”,好的学习策略虽然需要花费大量时间去规划,但是他的结果是足够准确的;不好的学习策略会导致错误,会让学习过程走更多的弯路。
学术界尝试模拟人脑,完成一套计算机能够理解的学习策略,他被称之为“神经网络”。
在人的大脑皮层中,是由一个一个神经元所组成的一个大的神经网,所以神经网络也是模仿这个概念去设计。
如图中的输入值,x1、x2、x3,在经过包括输入层的四层结构之后,输出了我们所期望看到的结果,这就是一个简单的神经网络。
其中L1跟l4分别是输入层和输出层,l2、l3则是隐藏的处理层,越是复杂的运算,所需要的处理层就越多,同时每个处理层所包含的参数也就越多,因此也就导致整个神经网络的规模呈现一个非线性的扩大。
总结一下,深度学习就是是通过多层次的计算以及分析,通过由浅入深,获取所需要的输出值的过程。
而神经网络,则是我们通过分析整个运算,所规划的由各种参数与处理层所组成的一个大型的计算网络,我们可以通过这个计算网络实现输入值到输出值的一个转变。
2.2深度学习与人脸识别的二次结合
传统的人脸识别模型一般为图2-2,通过对比提取到的cnn特征作为判断的依据,而当深度学习与人脸识别二次结合,人脸识别走出了另一条全新的道路。
深度学习可以在通过多次训练后,训练出一种类人脑的一种思维方式,只要样本数足够多的,理论上可以像大脑一般准确分析思考。
他会根据多个数据集的结果,微调每个数据对于最后结果的判定占比。
如图2-2-2,图像之间的数值就是欧式空间中的距离,该数据越低,证明两张照片为同个人的可能性越高,训练的样本数越高,照片之间的距离参数也会改变,趋近于真相。
图2-2-1
图2-2-2
2.2.1VGG模型
最初VGG并不是用作为图像分类识别训练的神经网络,它是由牛津大学科学工程系发布,用来探究图像分类过程中网络深度是如何影响识别的准确率以及精度的。
最初的VGG-16(VGG-Very-Deep-16CNN),从全称中我们也可以看出发布者对于VGG-16的研究深度标准之高,
VGG不同于传统的卷积网络模型,他的卷积层与池化层并不是一一对应的关系,规定整个模型中有5个池化层,他们分别与一部分卷积层相关联,可以从图2-2-3中看到池化层的分配关系。
VGG按卷积层的数量划分命名,最少的由3个全连接层+8个卷积层组成,命名为VGG11;最多则由3个全连接层+16个卷积层组成,命名为VGG19。
图2-2-3
当然,作为一个曾在ImageNet上大放光彩的模型,它并没有那么简单。
它的结构设计也并不是一成不变,我们完全可以用全卷积网络的概念对他进行改造,将首个全连接层改为7x7其余的全连接层改为1x1。
在VGG之前,没有其他的神经网络模型能够做到在突破10层的情况下,保证效果良好,不受影响。
VGG虽然突破了网络深度,却没有彻底解决网络深度所带来的一系列问题。
当网络层数过多以后,同样会出现梯度性能下降等问题。
总的来说VGG在刚提出的时候也是受到推崇,但是随着时间的流逝,越来越多的更加优秀的训练模型被提出,VGG也就不那么耀眼了。
2.2.2优图祖母模型
祖母模型提出之初,就已经决定了要成为一个百宝箱,它并不特别指代一种深层的神经网络模型,它是一个具有相同结构特征的神经网络模型的集合。
在不同的应用场景下,优图祖母模型可以提供不同的神经网络模型,完成所需要实现的效果。
因此,也有人叫它优图祖母模型族。
目前,最流行的深层神经网络模型(图2-2-4)从结构上划分一共有三种:
1.单支型(如AlexNet,VGGNet);2.双分支型(如ResNet);3.多分支型(如GoogleNet)。
直线型结构设计最为简单,但当网络深度过深会出现性能爆炸或性能消退等问题,同时由于结构单一,他也缺乏改造性。
局部多分支型具有较强的计算能力和较高的计算效率,但其设计也最为复杂,设计所耗费的人力物力较多。
结合以上两点,祖优图最终采用双分支型这种折中的架构来构建祖母模型族。
双分支型本身具有很强的学习能力,也有许多采用该结构的训练集在比赛中获奖;其次他的结构设计较为简单,前期人力消耗可控,最大的特点之一就是识别能力与神经网络的深度是一个正相关的一个关系,这意味着我们在针对不同的应用场景的多个模型进行识别训练的时候,完全可以通过控制网络深度来应对不同的需求。
为了满足用户的识别需求,一般会要求获取用户最大的数据集进行训练,以保证神经网络模型的可用性。
图2-2-4
祖母模型在近期也在识别流程上进行了一次较大的变动:
流程的变更主要是由于迁移学习的提出,迁移学习是人工智能领域所提出,用来解决不同的处理场景下训练时长过长的问题,而神经网络模型完全可以通过迁移学习,减少训练所花费的时间。
简单点来讲,就是将整个训练过程分为:
1、预训练(pre-train);2、精细化调整(fine-tune)。
针对人脸识别场景,咱们只要将已被训练完成的优图祖母模型针对新场景上的新数据进行精细化调整,就满足新场景的一个识别需求。
2.3本章总结
本章介绍了VGG以及优图祖母模型两种人脸识别模型,VGG和优图祖母模型。
VGG是由牛津大学科学工程系发布,用来探究图像分类过程中网络深度是如何影响识别的准确率以及精度的。
在研究过程中,人们用其进行识别训练,凭借着VGG结构清晰简洁的优点,取得了不错的成效。
同时,通过使用多个小型滤波器代替正常的滤波器,获得了更好的性能,这也就印证了:
通过不断加深网络结构可以提升性能。
但是VGG对计算资源的要求是非常高的,由于使用了大量的参数,它比其他的深度学习模型需要占用更多内存。
其中,大部分参数来自全连接层。
但是,根据部分实验结果的效果看来,就算去除掉所有的全连接层,他的性能也没有太大的影响,这样就显著的降低了参数的数量。
优图提出的祖母模型在我看来,是未来深度学习的一个主流。
优图祖母模型的核心,就是通过大量的,各式各样的样本,来训练出一个庞大的数据集集合。
该集合可以用于多处使用(如人脸识别、目标检测、动态跟踪、自动驾驶等),并且近年迁移学习提出让祖母模型族成型的可能性大大提升,进行基础模型的预训练,在特定任务上对模型进行精细化调整。
这样一来,大大优化了祖母模型对于特定场景训练的流程,减少训练时长,可以完成更多的训练。
目前,优图祖母模型也已经投入应用中,并且取得了不错的成果,我们可以在腾讯云的AI人脸识别产品中对第三代优图祖母模型进行测试。
第三章:
动态人脸识别签到系统实现
3.1实现思路
首先,一个可以上线的签到系统最少要有以下三个功能:
1、人像素材上传
2、通过摄像头设备对比素材库进行识别
3、保存签到成功的人像名单
其中1、3我通过Python的一些自带库实现了,核心的识别功能我选择了github上的一个开源项目FaceRecognition,通过对其进行二次开发实现了动态人脸识别签到系统实现。
3.2算法实现
3.2.1环境依赖
根据FaceRecognition的开发文档,该项目的运行环境支持linux/树莓派,但是我的设备系统环境为win10,通过查找资料后,我找到了一个可以在win10上运行的安装方式:
1、安装Anaconda
2、通过Anaconda安装CMake
3、安装dilb
4、成功安装facerecognition
3.2.2实现普通的人脸识别
想实现人脸识别,首先要解决的就是如何找到画面上的所有人脸。
在人脸识别的初期,这个问题是第一个被提出的,一时间有出现了许多识别的算法。
根据不同的知识体系出发,大抵上可以分为人工智能、神经网络、图像处理、模式识别等多种识别方法,虽然出发点并不一致,但最终都是采用了特征脸方法来实现人脸识别。
特征脸方法利用分析法,将人脸图像分解并提取特征样本。
它实际上就相当于将人脸化为一组组向量,然后将提取的特征样本与参考库中所提取的特征样本进行比对,根据匹配的特征样本数取最高来找到识别度最高的人脸。
由于特征样本在返回时,还具有人脸的一定特征,因此我们也叫特征样本为“特征脸”。
图3-2-1
从图3-2-1中我们可以看到,我们可以将一副人脸图像分解成一组权值向量,然后利用向量为单位找到距离最小对应的人脸图像的身份作为测试人脸图像的身份。
这如同派出所使用的素描画嫌疑人画像的过程,以一个基础脸型为出发点,然后画出不同的眼睛、嘴巴等五官给目击者确认,逐渐拼凑出一张疑似嫌疑人的一张图像。
电脑实现的过程大抵是一致的,只是他的五官是以特征样本的抽象形式体现的。
而在faceRecognition中,通过load_image_file()函数,可以把实现图片导入,而后只需要把导入的图片数据传入face_locations()识别图片中的人脸的位置,该函数的返回值为一个列表,其包含多个元组,代表着人脸的位置信息。
接下来,我将展示演示所用到的图片素材:
素材3.2.1
实现的代码如下:
importface_recognition
image=face_recognition.load_image_file("素材3.2.1.jpg")
face_locations=face_recognition.face_locations(image)
print(face_locations)
让我们来看下执行的结果:
我们可以观察到,执行结果返回了六个元组,每个元组中的数据代表的正是每张脸的位置信息,四个像素级的位置点把人脸圈起来了。
这样一样,我们也就成功的找到了所有的人脸。
接下来的问题,就在于如何进行人脸比对。
而人脸识别的实现则是依赖“弹性图匹配”这种方法。
弹性图匹配的思路是忽略人与人之间五官特征的角度和长度,更多的将关注点放在图像变换后的不变性,所以它还有另一个名字“橡皮泥几何学”。
它以一个人脸拓扑概括所有的人脸,根据这个拓扑结构划分基准点。
图3-2-2
每次进行识别,我们需要对识别图像人脸进行拓扑建模,获取特征向量。
同时,读取素材库中已有的人脸所对应的特征向量进行比对,找到相似程度最高的一张图。
然后以此图建立拓扑,进行更多特征向量的比对,进而找到测试人脸的身份。
在faceRecognition中,只需要将需要对比的两张照片所对应的编码作为参数传入face_pare_faces(),该函数会返回值的类型为boolean,该值为TRUE则证明大概率为同个人,为FALSE则大概率不是同一个人。
该函数的判定阙值可以在传入编码时使用tolerance关键字加上阙值限制作为第三个参数进行修改,目前合理的阙值大概为0.73左右,可以尽可能的做出准确的判断。
接下来,我展示下演示所用的素材:
实现的代码如下:
importface_recognition
known_image=face_recognition.load_image_file("素材3.2.2.jpg")
known_image=face_recognition.load_image_file("unknown.jpg")
unknown2_image=face_recognition.load_image_file("unknown2.jpg")
lhf_encoding=face_recognition.face_encodings(known_image)[0]
unknown_encoding=face_recognition.face_encodings(unknown_image)[0]
unknown2_encoding=face_recognition.face_encodings(unknown2_image)[0]
results=face_pare_faces([lhf_encoding],unknown_encoding)
results2=face_pare_faces([lhf_encoding],unknown2_en