基于微型计算机的人脸识别门禁系统设计
1.课题意义及目标
随科技的不断发展,安全性的要求也不断提高,IC卡等传统身份识别工具已不能满足社会需求。所以从通用性、安全性、成熟性和造价性等多方面综合考虑,研究新的识别工具是一个必然的趋势。基于人脸识别的门禁系统的设计,能够提高传统安保行业的安全性、方便性、直观性等,最为有效的杜绝了门禁管理中的人为因素,充分体现了门禁管理的人工智能性,避免不必要的安全隐患和人员纠纷。因此本次毕业设计选择了人脸识别门禁系统的研究与实现,以保证门禁数据的真实性,真正做到安全、方便和直观的门禁管理,从而进一步提高公司、仓库、家庭等地的安保水平和管理稳定性。
本次设计将以微型计算机为核心,需选择合适的电源模块、检测模块、、数据存储模块、键盘模块、显示模块和声光报警模块,完成人脸识别系统的检测并报警处理的设计。要求能够将出入门禁系统的人员面部进行识别,能够在人脸数据匹配预存数据库资料时启动门禁系统中开门系统,当人脸数据不匹配预存数据库资料时启动门禁系统中闭门系统,实现防范防盗的作用,创造安全良好的生活工作环境。
2.主要任务
(1)查阅资料,了解人脸识别门禁系统的原理和基本构成,提出系统总体设计方案。
(2)通过学习完成的各个控制硬件电路设计(如检测模块,A/D转换模块,声光报警模块,系统电源模块等)。
(3)完成人脸识别门禁系统的软件设计。
(4)完成人脸识别门禁系统的调试、仿真和实物制作。
(5)完成设计说明书。
基于微型计算机(树莓派)的人脸识别门禁系统
摘要
随科技的不断发展,社会不断的进步,人们的自身安全意识和要求也再不断提高,IC卡等传统身份识别工具已不能满足社会需求。所以从通用性、安全性、成熟性和造价性等多方面综合考虑,研究新的识别工具是一个必然的趋势。为能够提高传统安保行业的安全性、方便性、直观性和有效的杜绝了门禁管理中的人为因素,通过人工智能方式,避免不必要的安全隐患和人员纠纷。
关键词:微型计算机(树莓派),人脸识别,云服务,Python
Facerecognitionaccesscontrolsystembasedonmicrocomputer(raspberrypi)
Abstract
Withthecontinuousdevelopmentofscienceandtechnology,thecontinuousprogressofsociety,people'sawarenessoftheirownsafetyandrequirementshavebeencontinuouslyimproved,andothertraditionalidentificationtoolssuchasICcardcannotmeetthesocialneeds.Therefore,consideringtheversatility,security,maturityandcost,itisaninevitabletrendtostudynewidentificationtools.Inordertoimprovethesecurity,convenience,intuitiveandeffectiveofthetraditionalsecurityindustry,andeliminatethehumanfactorsintheaccesscontrol,wecanavoidunnecessarysecurityrisksandpersonneldisputesthroughartificialintelligence.
Basedonmicrocomputer(raspberry)facerecognitionaccesscontrolsystem,thesystemthroughtheuseofcloudservicescanbereal-timefacerecognitionofpersonneltoanalyzeandidentify,inordertoensuretheauthenticityofdataaccess,trulysafe,convenientandintuitiveaccessmanagement,andfurtherimprovethecompany,fromthewarehouse,andfamilysecuritythelevelofmanagementandstability.Theconstructionandimplementationprocessofthesystemaredescribedindetail,whichprovidesagoodsolutionforrelatedproducts.Thedesignedsystemhasbeensimulatedandtested,andthetestresultshavereachedthedesigngoal.
Keywords:microcomputer(raspberrypie),facerecognition,cloudservices,Python
目录
第1章绪论
1.1研究背景
随着社会的发展,安全教育不断的深化,人们的安全防范意识也逐渐赠强,这里面不光包括个人安全,还涉及到了财产和知识产权的保护,安检的高效,贸易的顺利流通等方面的需求增加,这种生物识别技术又得了新的重视和快速发展。人脸识别随着近几年的发展,成本也逐渐降低,已被广大客户所接受,其中人脸识别技术是应用最为广泛的。在国外,人脸识别技术早已被大量使用在国家重要部门以及军警等安防部门。在国内,对于人脸识别技术的研究始于上世纪90年代,目前主要应用在公安、金融、网络安全、物业管理以及考勤等领域。
市场对门禁的安全性和可靠性的要求也越来越高,技术也在不断革新,云技术的兴起使得这现技术,又向前迈进了一步,不光是安全性和可靠性的提高,主要是体现在该技术的成本、编程、应用领域等方面变得更低,更简单,更广泛了。坚信这项技术会越来越好,甚至到时候生物识别技术又会有新的识别方式取代。
1.2人脸识别的研究目的和意义
生物识别技术领域里极富挑战性的课题之一,再加上该技术应用广泛,对这项技术的研发需要的知识领域十分广泛,需要数学函数,生物技术,生理学,构图等诸多学科的内容。如今,虽然在这方面的研究已取得了一些可喜的成果,但是FRT在实用应用中仍面临着很严峻的问题,因为人脸五官是非常相似的,而且人脸本身又是由很灵活的肌肉群组成,所以人脸可以做出很多表情,于是给准确识别带来了相当大的麻烦。如何能正确识别大量的人并满足实时性要求是迫切需要解决的问题。
基于视觉通道信息的面部感知系统,包括人脸检测和跟踪、面部特征定位、面部识别、人脸归类(年龄、种族、性别等的判别)、表情识别、唇读等分系统,这些往往是要进行检测的,但最难的还是在图像提取上,提取哪些特征量才能将这些信息反馈,提高安全性和可靠性呢?这里首要考虑的就是人体本身,再次就是监测的环境也十分重要,其中光线的影响就很大,光的强弱有时候会将人脸特征遮蔽和凸显,造成人脸识别的误差,如果可以进步解决这些问题,就会提高安全性和可靠性,保证人民的人身及公共财产安全。
1.3国内外研究现状
1.3.1人脸识别图像处理的国外研究现状
上世纪80年代初,在美国马尔博士多年来一直参与机器视觉的研发,在机器视觉领域占有重要地位,马尔博士从图像处理的角度认为机器视觉大致分为三个层次,主要包括原理层次、软件层次和硬件层次三个层次,他是第一个提出了系统的比较完整的视觉结构图。马尔的视觉结构认为,三维图像画面可以感知各种不动的或者变化的空间,这是机器视觉系统首要完成的工作,其中测量、确定固定位置与识别空间中的三维物体尤为重要。上世纪下叶,行动,应用的自由主义派别,第一次引用并应用了自主机器识别系统,把物种视觉的理念与看法结合在了一起,突出了视觉机器系统的觉察性、理念性以及可行性。自主机器识别系统认为,机器识别应自动改变摄像头小孔内径,角度,方位等参数并主动得到图像内容。自主机器识别系统主要研究以下方面:
(1)工作能力。近几年来的自主机器识别系统的研究对机器视觉过程中的工作能力不断看重,其中有对性能以及认识策略等各种问题的研究,首先要理解清楚哪些是原先就拥有的观点,哪些是后天理解认识所得到的成果,各种工作方针与策略就是在此原有知识理论上得到进一步认识。
主动视觉的前期研究进展缓慢。上世纪80年代初,krotkov和brown及ballard完成了以联合检测传感器为基础的实验,打破了主动视觉的关键性。在研究中,krotkov和brrown及ballarad通过一系列的工作完成了对检测仪表的自动控制,摄像头通过对外界环境的摄取,随时跟随外部环境的变化实现对行驶小车的控制[]。从此以后,摄像机就被用做视觉检验的工作。
1.3.2人脸识别图像处理的国内研究现状
人脸识别技术已经被广泛应用于公安侦破、考勤系统、摄像头监视系统、网络应用、身份识别、支付系统等领域,云技术则简化了人脸识别技术,促进了这项的发展,让使用更加广泛,成本也相对降低。
1.4本设计主要研究内容
本文通过基于微型计算机(树莓派)的人脸识别门禁系统展开探索研究,通过对人脸识别和门禁系统的的功能分析,完成人脸识别和门禁系统开闭的整体设计,从整体上来看,系统设计分为软件和硬件两部分,其中最主要的,也是本设计的难点当属内部软件算法,也就是采集图像后的图像处理。本设计的基本任务是对人员脸部进行识别,通过数据的比对,并控制门禁系统的开闭,也就是当数据匹配成功时,启动门禁系统,当数据匹配不成功时,不启动门禁系统。本文内容总共分为6章,第一章是“绪论”,是对本文的大体概括,第二章至第五章是本论文最主要的部分,也是该设计最具体的工作,第六章是“总结与展望”,是作者自己在整个过程的收获与体会。具体结构如下:
第一章绪论
大体讲述本毕业设计,即人脸识别图像处理的研究价值意义以及发展历程,非常具体地讲述了人脸识别图像处理的国内外研究现状。本文设计的人脸识别门禁系统,通过程序内部的图像处理,数据匹配来实现对大门的控制,通过这一阶段的探索研究,能够有效地实现门禁系统的启停,起到安全防范作用,研究目的在为今后的人脸识别门禁系统的设计提供一些想法和思路,同时通过这一设计,增加自己的专业技能,使自己能对本专业的理论知识有更深入地理解。
第二章人脸识别门禁系统总体设计方案
本文从人脸识别门禁系统总体设计方案出发实际情况出发,结合自身水平条件的限制,详细分析了摄像头的使用条件以及内部原理,以及摄取到的图像的基本信息。同时论文也简单叙述了人脸识别门禁系统的门禁系统驱动模块,以及摄像头模块的硬件连接情况,并且也绘制了人脸识别门禁软件系统总体框架流程图。
第三章人脸识别门禁系统的硬件设计
为了比较准确的采集人脸图像,对图像进行处理,在进行数据匹配,来实现对人脸的识别,并控制门禁系统的驱动模块,必须提供稳固的硬件保障。基于微型计算机(树莓派)的人脸识别门禁系统的硬件系统部分进行设计。触摸传感器被触发后启动人脸识别的主程序。蜂鸣器和LED流水灯发出提示讯号,当检测人脸为正确人脸并与通过与本地照片对比正确后,步进电机转动即开门。硬件系统部分包括:图像处理模块、系统电源供电模块、树莓派专用摄像头检测模块、步进电机运动控制驱动模块、报警模块、显示模块等。
第四章人脸识别门禁系统的软件系统设计
详细介绍了软件系统的安装过程,软件部分包括:win32DiskImager、SDFormatter、树莓派镜像文件。之后还需要对软件进行配置中文环境以及扩展文件系统,因为大部分软件系统都是默认英文字库,需要找到一个良好的中文词库,进行修改。具体说了RPI.GPIO搭建及使用,用第三方写好的库函数来完成具体的操作,主要运用的编程语言就是Python,以及Opencv运行环境的搭建,本次设计主要利用opencv进行拍照,掌握opencv的简易人脸识别的原理及对Python编程语言的学习。
第五章系统运行以及源代码分析
详细介绍了微型计算机(树莓派)的软件系统运行操作,需要先找到自己电脑的IP,打电脑的远程桌面软件,通过该软件进入微型计算机(树莓派)系统后,再连接本地wifi信号。具体说明了旷视FACE++API的使用,人脸识别需要先采集人脸照片进行上传,再对出入人员进行人脸采集,图像的处理是通过调用Face++API的云服务功能来实现的,然后反馈人脸相似度的信息,最后当相似度大于百分之七十,则开门,反之则不启动。(电机正转开门、停止并发出警报声、电机反转关门)具体的对源代码进行了分析。对系统的调试及运行也进行了具体描述,主要指出了调试过程中出现的相应问题,并对其进行了解决处理,这个过程是我更加深入了解了该系统和源代码的组成,对Python编程语言也有了更加深刻的理解。
第六章总结和展望
对本文主要的研究内容和工作进行总结,结合当前现有成果,针对理论和实际应用中的缺陷,指出进一步可展开的工作。
第2章人脸识别门禁系统总体设计方案
控制要求是指在目标系统早期实现的能力、特征、外围设备等方面的前提和初步设想。有必要考虑设计的实际情况和设计时要解决的关键问题,以建立可行性分析和规划或建立模型。通过各方面的互相补充,落实最后的设计方案,以此保证最后的成品符合要求。一方面,设计方案是分析系统设计的基本要求,需要通过软件进行验证。另一方面,该系统的设计方案是软件从设计到维护的一系列工作的主要依据。
2.1人脸识别门禁系统的总体设计方案
基于微型计算机(树莓派)树莓派的人脸识别门禁系统分为微型计算机(树莓派)开发板模块、电源模块、转5V降压模块、触摸感应传感器模块、报警模块和步进电机模块。使用本套系统之前需要在本地存储若干张人脸照片,来进行人脸识别,也可以是多人。程序运行时微型计算机(树莓派)会将照片中的面部图像发送至云端服务进行分析,并把人脸的面部参数存储到face++开发者网站,待其处理完毕后再从云端传回识别结果。触摸传感器触发人脸识别主函数进行实时拍照并将此照片发送至云服务处理并将比对结果发送到微型计算机(树莓派)。流水灯和蜂鸣器提示、识别正确后步进电机转动,并将结果显示在微型计算机(树莓派)终端。
由此可设计出人脸识别门禁系统的总体结构框图,如图2-1所示:
图2.1人脸识别门禁系统的总结构框图
本次设计中测试及最终使用,一直采用Python2.7编程语言对微型计算机(树莓派)系统进行开发和设计,其中人脸识别调用了face++的API,官网提供了基于Python的SDK,该语言的可读性高很适合本系统的开发。本系统总体结构图如上。本地终端为微型计算机(树莓派),云服务采用了FACE++人工智能开发平台。
2.2系统主要功能实现
本论文中所设计的系统是对人脸图像进行处理识别并与门禁系统配合起到安全防盗的基本功能。工作原理是首先将三张待检测人员的照片存储到树莓派文件系统,执行此段程序时,调用face++的detectAPI将三张照片中的人脸信息存储在开发者账号,然后执行search的API,对现在进行的人脸识别程序中拍摄的照片进行处理,检测照片中的人脸信息并与之前上传的人脸信息对比,并返回相似度最高的人脸信息。我们在程序中只提取confidence的值,即人脸相似度。当触摸开关被按下,程序会发出警报LED闪烁,接着进行一张人脸的采集。并将此照片与已经上传的三张照片做对比。判断出相似的人脸。当相似度大于70%,则开门(电机正转开门、停止并发出警报声、电机反转关门)。
系统由微型计算机(树莓派),驱动模块,检测模块,显示模块,报警模块,电源模块等组成。系统带有按键,用户可以通过按键触发人脸识别功能;系统具有采集和检测人脸功能,可以当进入人员匹配成功时,开启大门,同时报警装置启动;当进入人员匹配失败时,大门不开启以保障安全。
在本设计中,系统主要模块各自的功能如下:
(1)主控模块。在本设计中主要起到集中分配的作用,不仅需要即时采集人脸图像,调用API处理图像,同时还要提供摄像头检测、驱动芯片、显示屏等数字器件的工作信号。
(2)按键模块。系统的输入部分,实现人机交互。通过接收触控按键的电平信息,使得微型计算机(树莓派)得到需要的数据。
(3)驱动模块。厂门电极作为大门开闭的过程控制的控制元件,其驱动主要由驱动芯片实现。通过操纵大门电机正转和反转,实现对大门的开闭控制。
(4)显示模块。以连接一台电脑显示器即可
(5)系统电源模块。系统电源模块主要负责给系统提供符合要求的电流与电压,由于微型计算机(树莓派)使用低压直流电压,就需要将两节锂电池18650电源7V转换为符合要求的电压、电流。从而使整个系统有持续的供电保证。[4]
本系统的设计具有半自动门禁系统的特点。待检测人员需要用手按下触摸开关,进而触发人脸识别。系统将对其进行摄像并将图像发送至云端服务进行处理,待处理完之后微型计算机(树莓派)对返回的比对数据结果进行判断。如果对比成功,则驱动步进电机开始旋转。系统的实时性是用户体验的关键要素,系统正常工作时待识别的人员感觉不到卡顿状况,实时性良好。
第3章人脸识别门禁系统硬件设计
3.1主控模块
图3.1主控模板实物图
本次设计的主控模块是使用微型计算机──树莓派3代B型主板。树莓派3代B型主板,该主控板模块的优势是拥有良好的标准模块扩展性,主板上预留的接口可完美对接与之配套的树莓派500万像素专用摄像头、7英寸液晶触摸屏、SenseHat传感器模块等。除了可以在爱好者论坛下载网民大神们做好的系统包之外,如今还可以直接购买预装了树莓派代3代B型主板专用NOOBs系统的MicroSD卡。说到这里就又促生了树莓派代3代B型主板的进一步优势,那便是与微软的结合,微软为该产品推出了与之适配的Windows10IoT版操作系统,用户可以使用到更加熟悉的UI,使得通过标准扩展模块和GPIO接口扩展模块操作变得简单,IP等协议的配置也变得更加简单,同时驱动又在不断更新,不断完善,所以不用再去考虑重新开发Windows的驱动程序,以上这些与树莓派代3代B型主板的结合,对新入门的玩家以及互联网开发者来说是意义非凡的。
主要包括以下几点:
【RaspberryPi3ModelB】
·BCM2837
·64位的1.2GHz四核ARMCortex-A53
·1GB内存
·10/100自适应网卡
·802.11nWiFi无线网卡
·低功耗蓝牙4.1(BLE)
·HDMI接口
·USB2.0接口x4
·MicroSD卡插槽
·3.5mm音频输出接口
·40PINGPIO接口
·CSI摄像头接口
·DSI显示接口
·升级后的电源管理系统,以便使用更多耗电的外设(须用2.5A以上电源供电)树莓派3代B型是一款基于ARM的微型计算机主板,以SD/MicroSD卡进行存储,该主板提供USB接口和以太网接口,可以连接键盘、鼠标和网线,该主板具备所有PC的基本功能,例如:高清视频播放、电子表格书写、玩游戏等诸多功能,还整合了视频模拟信号的电视输出接口和HDMI高清视频输出接口。树莓派将Python作为主要编程语言,支持Java、BBCBASIC(通过RISCOS映像或者Linux的"BrandyBasic"克隆)、C和Perl等编程语言。本设计使用的是最新树莓派官方系统。是基于debian的一种linux32位操作系统。本次设计使用系统中安装的python2.7运行程序。
3.2检测模块
3.2摄像头模块实物图
本次设计的检测模块是使用树莓派专用500W像素摄像头。该摄像头提供了三个应用程序,分别为:raspistill、raspivid、raspistillyuv。其中raspistill和raspistillyuv非常相似,并且都是用于捕捉图像,而raspivid用于捕捉视频。
应用程序使用了四个OpenMAX(mmal)组件:camera(摄像)、preview(预览)、encoder(编码)、null_sink。所有应用程序均使用了摄像组件,raspistill使用了图像编码组件,raspivid使用了视频编码组件,raspistillyuv没有使用编码组件,而是直接将YUV或RGB从摄像组件输出到文件。所有应用程序均基于命令行方式运行,通过OpenMAX的mmalAPI进行编写。我们在设计中结合Opencv调用摄像头进行拍照操作。
摄像头电路板与树莓派通过一条15芯的排线进行连接。具体连接操作如下:先将树莓派上连接座两端卡扣拉起,再把排线插入座中,并竖直,然后按下两端的卡扣。摄像头电路板连接同上。
3.3驱动模块
当输入信号相对而言比较微弱时,相应功率较小无法正常工作。驱动模块实质是通过放大功率,从而满足负载额定功率使得负载可以正常工作,从而可以响应微弱的输入信号。微型计算机(树莓派)上有IN1,IN2,IN3,IN4四个接口,根据资料,设置为低电平就可以驱动,用杜邦线分别将IN1,IN2,IN3,IN4和GPIO21(Pin40),GPIO20(Pin38),GPIO16(Pin36),GPIO19(Pin35)进行连接。每次将四个GPIO端口按下表依次设置好电平后,可以sleep几十毫秒来控制转速
图3.3步进电机驱动原理
图3.4树莓派GPIO编码图
3.3.1步进电机工作原理
在不超过额定负载时,脉冲信号的频率控制电机转动的速度、脉冲数决定电机止步的位置,均不会因为负载变化而受到任何的影响[8]。步进电机每走一步,就要加一个激磁信号,假如适当的信号,转子以一定的步数转动;无激磁信号输入时,转子保持一定的位置。步进电机工作的基本原理如下:
(1)换相顺序的控制
电机通电后,主要通过脉冲分配来实现工作相序的变化。以步进电机四相八拍工作方式为例,要求各相按照A-AB-B-BC-C-CD-D-DA的顺序来工作,控制脉冲就要按照该顺序来控制A、B、C、D相的通断。
(2)步进电机转向的改变
按照既定工作方式正向转动的顺序来给电机通电,电机就会正向转动;但是按照相反顺序来通电的话,电机会向相反方向转动。
(3)步进电机转动速度的改变
步进电机驱动方法有四相四拍运行方式,即AB-BC-CD-DA-AB;四相八拍运行方式,即A-AB-B-BC-C-CD-D-DA-A。
度。若四条控制线与电源地线接触的顺序恰好相反,那么电机也就随之向相反方向转动。
3.3.2步进电机驱动电路
由于步进电机的驱动电流的数值相对较高,所以单片机与步进电机不能直接连接,常常采用专门的接口及驱动电路。驱动器可以采用功率比较高的复合管,如ULN2003,L298N,或者购买专用的步进电机驱动器。驱动电路的工作状态是由控制信号来决定的,控制信号需要由主控模块,即单片机来产生。期望实现以下的步进电机驱动要求:
(1)期望驱动电路提供的电流上升和下降速度可以比较快,这样可以使电流的波形尽可能的接近矩形波。
(2)期望驱动电路功率和效率相对比较高,提高运行经济性。
单片机的输出电流太小,无法直接连接步进电机,需要加驱动电路。对于电流小于0.5A的步进电机,可以采用ULN2003类的驱动IC。驱动芯片ULN2003内部结构如图3.4所示。
图3.4ULN2003内部结构框图
ULN2003是由复合达林顿晶体管排列组成,使耐受电压比较高,允许通过电流较大。共有7对NPN达林顿管,分别为芯片7个控制单元,包括功率驱动单元、保护单元等。ULN2003采用DIP-16或者SOP-16双列16脚塑料封装,驱动单元可以与步进电动机直接耦合,连接方便,其数字逻辑电路为非门电路,取反控制。
选取ULN2003作为电机驱动芯片,价格经济,且可以充分发挥功能,实现稳定驱动。可以直接通过电源来调节输出电压,可以直接用单片机的IO口提供信号,而且电路简单。芯片采用单片机作为控制核心,在程序相互调用的方面,更加的方便灵活。
图3.5ULN2003引脚图
图3.5所示为驱动器引脚图,图左边1~7引脚为输入端,有单片机直接控制,接单片机输出端,引脚8直接接地;右侧10~16引脚为输出端,接步进电机,引脚9接电源+5V,必要时也可以什么都不接悬空而置,该驱动器可提供最高0.5A的电流。
ULN2003的主要特点是:
(1)驱动ULN2003电流比较大。ULN2003可以较好的用于单片机控制的电路。
(2)ULN2003连接上拉电阻,在驱动电机时可以提高其抵抗干扰的能力。ULN2003的每两个达林顿管视为一个单元,都会串联一定阻值的高值电阻可以直接和TTL或承载电压为5V的CMOS装置连接。
(3)ULN2003的输出采用集电极开路,电流输出值比较大,可以达到500mA。因此可以用来驱动电机。
另外,ULN2003的极限参数分别如表3.1、3.2所列。
表3.1ULN2003的极限参数
表3.2ULN2003的极限参数
ULN2003驱动电机的电路图如下图3.6所示。由单片机P3.4—P3.7口经上拉电阻作为驱动芯片ULN2003的输入。COM端供电12V,输出端10至12引脚均接地。四相五线式步进电机的A、B、C、D四相分别与ULN2003的输出端1C—4C连接,接收控制脉冲,实现控制。
图3.6ULN2003驱动电机的电路图
3.3.3步进电机的选型
步进电机是一种专门用于位置与速度精确控制的特种电机,虽然同为电机件,步进电机区别于其他控制电机的最大特点是,它主要采用无反馈环节的开环控制,将微观的电脉冲信号转变为宏观电机转动的角位移或线位移。它通过数字来实现电机控制,控制信号以脉冲形式发出,它所接受到的脉冲可以驱使电机转动,即被转化为相应的角位移,所以只要给步进电机一个合适的脉冲信号,它就随之动作固定角度,当采用单片机来控制步进电机相对简单易操作。绕在定子的线圈配置作为步进电机相数分类的主要依据,主要可分为2相、4相、5相等;根据外部引线步进电机又被分为三线式、五线式、六线式等,但各种类型的电机其控制方法并没有发生太大的变化,均采用脉冲信号进行驱动。
门禁系统的运动不需要加速、减速过程,所需转速较低,所以步进电机选用自启动运行方式。自启动运行方式是指在驱动电机旋转和停止时不经过加速、减速阶段,而直接以驱动脉冲速度启动和停止的运行方式。同时,因为在启动、停止时存在一个突然的速度变化,所以这种方式需要较大的加、减速力矩。由于具体负载重量也会影响其是否产生过大的工作噪音,所以四相五线式步进电机的负载容量可以较好满足要求。另外,出于对电流、步距角、静转矩三大要素的考虑,本设计选择四相五线式步进电机来模拟门禁系统的控制,可以直接插接方便使用。
3.4报警模块
作为人脸识别门禁系统的设备,声光报警电路不可或缺。在系统工作中,每当人脸数据匹配成功时,便会触发蜂鸣器和发光二极管实现声光报警,使监控人员得到开启大门信号,反之则不报警。半导体二极管和普通二极管都是是类似的PN结结构,具有单向导电性,可以将电能转化成光能。在将电流通到发光二极管之后,电子从N区移动到P区,并且从P区移动到N区的空穴在PN结附近与孔中的电子复合,N区域产生荧光发光提醒。
声光报警设计部分包括蜂鸣器和LED报警指示灯。声音报警电路如图3.11所示,由于微控制器驱动能力的I/O端口较低,所以需要增加蜂鸣器PNP晶体管驱动,可以让那个蜂鸣器的声音听起来更响,更好地发挥警报功能。为了避免错误的报警添加了三极管基电路,蜂鸣器只有在输出低时才会发出声音。
图3.8声音报警电路原理图
3.5显示模块
设计中为从一定程度上减小操作人员的工作量,特用电脑显示器作为显示模块,电脑显示器就不做过多阐述了。
3.6电源模块
本模块的作用是用来控制电源是否进入工作状态。电源模块一般分为以下几部分:滤波电路模块、全波整流电路模块、电源变压器模块等。一般电源提供的是220V交流电,经过门禁系统的电源模块中变压器的变压,变为直接可以供门禁使用的电压,然后进行全波整流,得到有尖峰脉冲的直流电,然后在滤波电路将有交流成分的电压滤除,最后得到可供系统使用的直流电。但我们的设计不需要这么大电流,电源直接是用两节充电锂电池18650共7v进行供电,所以不需要用稳压芯片。工作原理图如图3.1。
图3.9电源模块原理图
第4章人脸识别门禁系统软件设计
4.1安装系统
软件部分:win32DiskImager、SDFormatter、树莓派镜像文件
硬件部分:SD卡、读卡器
准备工作
1.16G的SD卡一张(树莓派3B专用microSD卡)2.下载树莓派系统镜像文件3.Windows下安装镜像的工具:Win32DiskImager
安装实战
1.解压下载的系统镜像压缩文件,得到img镜像文件2.将SD卡使用卡托或者读卡器后,连上电脑3.解压并运行Win32DiskImager工具4.在软件中选择系统镜像的img文件,“Device”下选择SD卡的盘符,然后点击“Write”然后就开始安装系统了,根据你的SD卡的速度,安装过程有快有慢5.安装结束后会弹出完成对话框,说明安装就完成了。
图4.1格式化软件工具
图4.2系统烧录软件工具
首先把SD卡连接到电脑,打开SDFormatter.注意观察盘符不要误将其他SD卡格式化。
接下来打开win32diskimager.打开存放镜像的路径,点击“write”/“yes”等待镜像烧录成功。
图4.3烧录成功提醒界面
图4.4树莓派官方系统Pixel
4.2配置中文环境以及扩展文件系统
树莓派3B默认是采用英文字库的,而且系统里没有预装中文字库,所以在locale中将其改成中文,也不会显示中文,只会显示一堆方块。因此需要手动来安装中文字体。
ssh中输入以下命令:
安装过程中如果碰到(Y/n),都选择y中文字库安装完成之后,还需要安装一个中文输入法。输入如下命令
一样的安装过程,安装完毕后输入
然后选择change_locale,在Defaultlocaleforthesystemenvironment:中选择zh_CN.UTF-8,配置完成之后,输入命令
重启完成好就可以在VNC连接上去后使用中文显示和中文输入法了,切换中文输入法一样也是ctrl+space。
图4.5树莓派安装中文
终端输入:sudoraspi-config扩展文件系统
图4.6树莓派扩展文件系统
“ExpandFilesystem”回车后将SD空间扩展(重启后生效)。配置中文环境如下所示。
图4.7树莓派设置中文(一)
图4.8树莓派设置中文(二)
图4.9树莓派设置中文(三)
空格选中”zh_CN.UTF-8“回车“ok”输入:sudoreboot重启后生效
图4.10树莓派设置中文(四)
图4.11树莓派设置中文(五)
4.3RPI.GPIO搭建及使用介绍
sudoapt-getinstallpython-dev
安装RPi.GPIO,依次输入以下指令。
·下载:$wget
·解压缩:$tarxvzfRPi.GPIO-0.5.3a.tar.gz
·进入解压之后的目录:$cdRPi.GPIO-0.5.3a
·启动安装:$sudopythonsetup.pyinstall
导入RPi.GPIO模块:
通过该操作,可以将模块名称映射为GPIO,以便接下来您其它脚本进行使用。
导入模块并检查它是否导入成功,可以尝试:
针脚编号
目前有两种方式可以通过RPi.GPIO对RaspberryPi上的IO针脚进行编号。
第一种方式是使用BOARD编号系统。该方式参考RaspberryPi主板上P1接线柱的针脚编号。使用该方式的优点是无需考虑主板的修订版本,您硬件始终都是可用的状态。您将无需从新连接线路和更改您的代码。
第二种方式是使用BCM编号。这是一种较低层的工作方式–该方式参考BroadcomSOC的通道编号。使用过程中,您始终要保证主板上的针脚与图表上标注的通道编号相对应。您的脚本可能在RaspberryPi主板进行修订版本更新时无法工作。
指定您所使用的方式(必须指定):
或者
RaspberryPi的GPIO上可能同时有多个脚本/循环。因此,如果RPi.GPIO检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),您会在尝试配置某脚本时得到警告消息。禁用该警告消息:
为每个用于输入或输出的针脚配置通道。配置为输入的通道:
通道编号是基于您所使用的编号系统所指定的(BOARD或BC)。配置为输出的通道:
通道编号是基于您所使用的编号系统所指定的(BOARD或BCM)。可以指定输出通道的初始值:
输入读取GPIO针脚的值:
通道编号是基于您所使用的编号系统所指定的(BOARD或BCM)。)这将返回0/GPIO.LOW/False或者1/GPIO.HIGH/True。
设置GPIO针脚的输出状态:
通道编号是基于您所使用的编号系统所指定的(BOARD或BCM)。)
状态可以为0/GPIO.LOW/False或者1/GPIO.HIGH/True。在任何程序结束后,请养成清理用过的资源的好习惯。使用RPi.GPIO也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的RaspberryPi针脚。注意,该操作仅会清理您的脚本使用过的GPIO通道。
脚本结束后进行清理:
4.4Opencv运行环境的搭建
首先进入RaspberryPi系统,将树莓派连上网络,然后Ctrl+Alt+t打开命令终端(直接点击终端图标可能会卡),如果终端窗口没有出现的话,从顶部任务栏可以找到,点开就好。首先是以下这几条更新命令,每次单独执行:
sudoapt-getupdate
sudoapt-getupgrade
sudorpi-update
sudoapt-getinstallbuild-essentialgitcmakepkg-config
然后是以下这几条命令安装图片工具包,每次单独执行(网上有很多一起执行的,但是经常出现问题)
sudoapt-getinstalllibjpeg8-dev
sudoapt-getinstalllibtiff5-dev
sudoapt-getinstalllibjasper-dev
sudoapt-getinstalllibpng12-dev
然后是视频I/O包:
sudoapt-getinstalllibavcodec-devlibavformat-devlibswscale-devlibv4l-dev
下面安装GTK:
sudoapt-getinstalllibgtk2.0-dev
然后安装优化函数的包:
sudoapt-getinstalllibatlas-base-devgfortran
然后执行以下命令下载opencv3.0:
cd/home/pi
cdopencv
gitcheckout3.0.0
然后安装opencv_contrib:
cdopencv_contrib
然后安装开发包:
sudoapt-getinstallpython2.7-dev
然后安装pip:SHAPE\*MERGEFORMAT
sudopythonget-pip.py
然后安装virtualenvvirtualenvwrapper:
sudopipinstallvirtualenvvirtualenvwrapper
sudorm-rf~/.cache/pip
下面这个步骤不仅仅是命令了,打开~/.profile文件,我是使用vim打开的:
sudonano~/.profile(”~”符号树莓派键盘打不出来用笔记本SSH连上去)
打开profile后,在这个文件最后,添加以下内容后保存退出:
#virtualenvandvirtualenvwrapper
exportVIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7
exportWORKON_HOME=$HOME/.virtualenvs
source/usr/local/bin/virtualenvwrapper.sh
然后执行下面这个命令:
source~/.profile
然后创建虚拟工作环境并进入:
sudomkvirtualenvLC
workonLC
一定要确保进去刚刚创建的虚拟环境了,进入虚拟环境的标志是进去后命令的最前面(绿字前面)都会增加“(LC)”。
下面在虚拟环境中安装numpy:
pipinstallnumpy
sudorm-rf~/.cache/pip/
一定确保在刚刚的虚拟环境下进行以下操作,如果新开了一个命令行窗口,那么就依次执行source~/.profile命令和workonLC命令进入虚拟环境再执行以下操作。
执行以下命令来设置编译:
cd~/opencv
mkdirbuild
cdbuild
cmake-DCMAKE_BUILD_TYPE=RELEASE\
-DCMAKE_INSTALL_PREFIX=/usr/local\
-DINSTALL_C_EXAMPLES=ON\
-DINSTALL_PYTHON_EXAMPLES=ON\
-DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules\
-DBUILD_EXAMPLES=ON..
执行以下命令开始正式编译opencv3.0:
make-j4
编译完后进行安装:
sudomakeinstall
sudoldconfig
配置完成
本次设计主要利用opencv进行拍照,确实是有点大材小用。但是通过opencv的使用,加深了对图形处理方面的简单认识和理解。在设计之余学会了opencv进行简易人脸识别的原理。
4.5系统程序设计
主程序设计
流程图
触摸开关
摄像头
步进电机
第5章系统运行以及源代码分析
5.1树莓派系统使用说明
树莓派系统:可以直接用显示器进入系统桌面也可以远程桌面进入系统,或者putty软件SSH。本设计以远程桌面登陆为例。登陆路由器查询分配给树莓派的ip地址。打电脑的远程桌面软件。输入树莓派的IP地址,本次设计中树莓派的IP是192.168.0.115。用户名为pi,密码:raspberry远程桌面进去系统后还可以再去连接本地wifi信号。
5.2旷视FACE++API使用说明
本次设计对图像的处理是通过云服务来实现的。主要是调用Face++的API来实现的照片中人脸的对比。首先将三张照片上传树莓派或者用树莓派摄像头采集三张照片。调用DetectAPI进行人脸检测和人脸分析。识别出的人脸会给出face_token,用于后续的人脸比对等操作。当触摸开关出发实时拍照之后,调用SearchAPI在Faceset中找出与目标人脸最相似的一张或多张人脸。支持传入face_token或者直接传入图片进行人脸搜索。使用图片进行比对时会选取图片中检测到人脸尺寸最大的一个人脸。
Sdk的facepp.py文件中包含如下底层api接口提供我们使用。
_APIS=[
'/detect',
'/detection/landmark'
'/compare',
'/search',
'/faceset/create',
'/faceset/addface',
'/faceset/removeface',
'/faceset/update',
'/faceset/getdetail',
'/faceset/delete',
'/faceset/getfacesets',
'/face/analyze',
'/face/getdetail',
'/face/setuserid'
]
图5.1创建FACE++APIkey
DetectAPI
调用者提供图片文件或者图片URL,进行人脸检测和人脸分析。识别出的人脸会给出face_token,用于后续的人脸比对等操作。请注意,只对人脸包围盒面积最大的5个人脸进行分析,其他人脸可以使用FaceAnalyzeAPI进行分析。如果您需要使用检测出的人脸于后续操作,建议将对应face_token添加到FaceSet中。如果一个face_token连续72小时没有存放在任意FaceSet中,则该face_token将会失效。如果对同一张图片进行多次人脸检测,同一个人脸得到的face_token是不同的。
SearchAPI
在Faceset中找出与目标人脸最相似的一张或多张人脸。支持传入face_token或者直接传入图片进行人脸搜索。使用图片进行比对时会选取图片中检测到人脸尺寸最大的一个人脸。
成功请求返回值示例:
5.3系统调试及运行
整体流程:将三张待检测人员的照片存储到程序所在目录,执行程序时,调用face++的detectAPI将三张照片中的人脸信息存储在开发者账号,然后执行search的API对程序过程中拍摄的照片进行处理。检测照片中的人脸信息与之前上传的人脸信息对比,如果相似度达到百分之80以上返回相似度最高的人脸信息。
图5.2程序目录
5.3.1程序初始设置
首先将自己的照片上传到本文件夹并修改图片文件名,然后在代码中将三张待对比照片赋值给face_one、face_two、face_three三个变量。并设置进行对比的照片名为customer.jpg。
face_one='face_one.jpg'
face_two='face_two.jpg'
face_three='face_three.jpg'
face_search='customer.jpg'
设置GPIO编码方式为board,GPIO13为输入模式,GPIO11,12,15,16,40为输出模式。
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(13,GPIO.IN)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(12,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(40,GPIO.OUT)
在python程序中设置调用API的key和secret。
key="xzFPqqR1q_fasM1D3s4yvUdcBoTovUMX"
secret="4GXhLafqDOmnfQRxx-6ZlEVwQpOlZoW-"
api=facepp.API(key,secret)
5.3.2各功能函数
#蜂鸣器,前面已经初始设置GPIO12为输出模式,此处bee()函数设置gpio12为干电平,延时0.5s后置为低。意味着当调用bee()函数时蜂鸣器鸣叫0.5s.
defbee():
GPIO.output(12,False)
time.sleep(0.5)
GPIO.output(12,True)
#步进电机,设置旋转角度为180°,closewise=1时,步进电机顺时针旋转,closewise=0时,步进电机逆时针旋转。步进电机驱动模块由树莓派的GPIO35、GPIO36、GPIO38、GPIO40四个GPIO驱动。
defmotor_open():
steps=180;
clockwise=1;
arr=[0,1,2,3];
ifclockwise!=1:
arr=[3,2,1,0];
ports=[40,38,36,35]#GPIO21(Pin40)GPIO20(Pin38)GPIO16(Pin36)GPIO19(Pin35)
forpinports:
GPIO.setup(p,GPIO.OUT)
forxinrange(0,steps):
forjinarr:
time.sleep(0.002)
foriinrange(0,4):
ifi==j:
GPIO.output(ports[i],True)
else:
GPIO.output(ports[i],False)
#流水灯:初始设置已经将GPIO11、GPIO15、GPIO16为输出模式。分别把三个LED发光二极管的长引脚接到这三个GPIO上,短引脚接至负极。通过把对应的引脚置为高电平延时0.3s后置为低,循环点亮三个小灯。
deflight():
GPIO.output(11,True)
time.sleep(0.3)
GPIO.output(11,False)
GPIO.output(15,True)
GPIO.output(15,False)
GPIO.output(16,True)
GPIO.output(16,False)
defprep():
print("欢迎使用人脸识别检测系统请面对摄像头5秒钟后进行人脸采集")
light()
print("************************5*********************")
print("************************4*********************")
print("************************3*********************")
print("************************2*********************")
print("************************1*********************")
bee()
#调用拍照函数时流水灯点亮,然后使用opencv利用摄像头采集一张照片,将照片保存为customer.jpg。
deftake_photo():
capture=cv2.VideoCapture(0)
ifnotcapture.isOpened():print('Capturefailedbecauseofcamera')
ret,img=capture.read()
cv2.imwrite('customer.jpg',img)
print("***********************照片采集完毕请稍等*************************")
print'='*60
#函数调用API将本地存储的照片进行人脸检测和人脸分析。识别出的人脸会给出face_token,用于后续的人脸比对等操作。然后调用searchAPI在Faceset中找出与目标人脸最相似的一张或多张人脸。进行比对时会选取图片中检测到人脸尺寸最大的一个人脸。
触发检测的监测函数det(),程序运行时开始检测触摸开关是否被触发。当触摸开关被触发时会发送高电平信号给树莓派。当检测GPIO13为真时,在终端输出确定信息,并调用主函数进行对比操作。主程序运行结束后继续检测是否被触发。一直循环指导程序退出。
defdet():
whileTrue:
ifGPIO.input(13)==True:
print"confirm"
main()
print"NOBODY"
time.sleep(2)
det()
提取API.search返回结果,并将返回的信息保存到s,并从中提取相似度的值。转换s[0][‘configdence’]为整形变量赋值给m。当m大于70时输出通过检测并调用步进电机转动。
5.3.3异常处理
当检测时由于没有拍摄到正常的人脸照片,程序则可能由于没有正常的人脸库而报错。此时须将下图中ret=api……注释掉,并将上一行的注释符号“#”取消。
图5.7处理报错信息(一)
保存并上传后再次运行。清除无用的人脸库。
然后再将代码修改为初始代码,再次进行正确的人脸采集,程序才可以正常运行。
图5.7创建一个faceset
这种方式解决报错是复杂的一个过程。由于目的只是删除无用的人脸库,所以新建了一个debug.py的python文件。当检测失败之后执行一次debug.py即可。
importfacepp
#创建一个Faceset用来存储FaceToken
#createaFacesettosaveFaceToken
defmain():
api.faceset.delete(outer_id='detect',check_empty=0)
#ret=api.faceset.create(outer_id='detect')
#print_result("facesetcreate",ret)
第6章结论
。。。。。。
参考文献
[1]爱上RaspberryPi:MattRichardson/ShawnWallace著;李凡希译,科学出版社(2013-10出版)[2]RaspberryPiPython编程入门:SimonMonk著;姜斐祚译,科学出版社(2014-02-01出版)[3]RaspberryPi快速入门指南:MaikSchmidt著;王峰、王江伟、王汝波译,科学出版社(2014-01出版)[4]树莓派应用速成网络应用秘方:(美)RickGolden著;符鹏飞译,科学出版社(2014-5-1出版)[5]树莓派应用速成Raspbmc媒体中心.(美)RickGolden著;符鹏飞译,科学出版社.2014年
[1]彭伟.嵌入式设备C语言程序设计实训100例.电子工业出版社.2009年
[2]吴运昌.模拟电子线路基础.广州:华南理工大学出版社,2004年
[3]胡汉才.嵌入式设备原理及其接口技术学习辅导与实践教程[M].清华大学出版社,2010.
[4]周润景等.Proteus在MCS-51&ARM7系统中的应用百例[M].电子工业出版社2006
[5]孙传友.编著.感测技术基础[M].电子工业出版社,2001.
[6]韩志军等.嵌入式设备应用系统设计[M].机械工业出版社,2004
[7]王俊峰.孟令启.现代传感器应用技术[M].机械工业出版社,2007.
[8]马忠梅等.嵌入式设备的C语言应用程序设计[M].北京航空航天大学出版社,2006
[9]刘树中.孙书膺.王春平.嵌入式设备和液晶显示驱动器串行接口的实现[J].微计信息,2007
[10]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerandThermoelectricModulesBasedonthePeltierEffect[J],2002
[11]YeagerBrent.Howtotroubleshootyourelectronicscale[J]..PowderandBulkEngineering.1995
[13]BehzadRazavi.DesignofAnalogCMOSIntegratedCircuits[M]..2001
[14]RheeW.Designofhigh-performanceCMOSchargepumpsinphase-lockedloops.IEEEInternationalSymposiumonCir-cuitsandSystems.1999[3]ToddCharlesWeigandt.Low-phase-noise,low-timing-jitterdesigntechniquesfordelaycellbasedVCOsandfrequencysynthesizers[C]//PHDthesis..1998
[15]GeorgeLee,KarinaNg,EdmondKwang.Designofringoscillatorbasedvoltagecontrolledoscillator.ProjectFinalReport[R].2005[5]T.C.Weigandt,B.Kim,andP.R.Gray.AnalysisofTimingJitterinCMOSRingOscillators.IEEEInternationalSymposiumonCircuitsandSystems.1994