现在实验室用的门禁都是刷卡进入,经常忘记带卡而进不去,所以就用树莓派自己做了一个刷脸认证的门禁系统,简单易用,准确性还挺高。接下来详细的说下具体的制作过程:
1.准备树莓派
首先你得有一块树莓派,淘宝卖家很多,选择三代性能相对好一点。
然后得需要电源,电源使用的microUSB供电。
树莓派安装系统得需要外接SD卡,一般16G大小的便足够了。其他的配件如显示屏,鼠标,键盘这些就不用细说啦,肯定需要准备的。
2.树莓派安装系统
如果买来的树莓派已经刷好系统了,那么就可以跳过这一步。官方提供的操作系统是 Raspbian,这是 Debian 系统的定制版。
下载完成镜像后,解压,再下载一个工具Win32 Disk Imager,专门用来写“.img"文件到SD和USB卡中的软件Win32 Disk Imager怎么下载?百度一下“Win32 Disk Imager”即可,下载安装之后
写入镜像,ImageFile就是镜像文件,Device就是你的SD卡。到此为止准备工作已经做好了。
3.注册百度云
由于树莓派的性能限制,运行神经网络来进行人脸识别的难度较大,所以我们采用了开源的人脸识别SDK来进行人脸的识别和检测,对比了国内几家的SDK,个人觉得百度人脸识别的效果要好一点,特别是并发数要比其他的好很多。下面介绍下百度云注册和SDK的使用方法:
1) 注册百度云
首先你要注册一个百度云账号,注册完成之后进入控制台:
创建一个自己的应用,这里我创建好了一个刷脸门禁应用:
这里要记住APPID,API Key,Secret Key。这三个后面的程序需要用到。然后在百度开放平台下载人脸识别SDK:
我是用的python语言,所以下载对应的python的SDK,如果你用的别的语言可以下载对应的SDK来使用,具体的SDK怎么安装使用可以详细的看下SDK文档,按照文档来操作就OK啦~
2)识别程序
百度云注册完成、下载完成SDK后我们就开始写程序,程序的思路很简单,通过树莓派拍一张照片,然后通过SDK来检测照片里面的人是谁,如果这个人在人脸库里面,而且有权限的话,那么就开门,如果不在人脸库就关门。同时我还添加了语音播报的功能,而且还能将开门信息推送到微信上,这样就可以试试的看到有谁来开门了。先上代码:
1 \'\'\' 2 通过摄像头拍一张照片,然后识别出人是谁,进而控制门禁系统 3 @author: zutterhao 4 @date:2018年5月19日 5 \'\'\' 6 7 from aip import AipFace 8 from picamera import PiCamera 9 import urllib.request 10 import RPi.GPIO as GPIO 11 import base64 12 import time 13 import pyttsx3 14 import pygame 15 16 #百度人脸识别API账号信息 17 APP_ID = \'********\' 18 API_KEY = \'*******************\' 19 SECRET_KEY = \'*********************‘ 20 client = AipFace(APP_ID, API_KEY, SECRET_KEY) 21 #图像编码方式 22 IMAGE_TYPE=\'BASE64\' 23 #用户组信息 24 GROUP = \'fanghao\' 25 camera = PiCamera() 26 engine = pyttsx3.init() 27 pygame.mixer.init() 28 GPIO_IN_PIN = 15 29 GPIO_OUT_PIN1 = 11 30 GPIO_OUT_PIN2 = 13 31 #定义一个摄像头对象 32 def getimage(): 33 camera.resolution = (1024,768) 34 camera.start_preview() 35 time.sleep(2) 36 camera.capture(\'faceimage.jpg\') 37 pygame.mixer.music.load(\'./voice/start.mp3\') 38 pygame.mixer.music.play() 39 time.sleep(2) 40 41 #对图片的格式进行转换 42 def transimage(): 43 f = open(\'faceimage.jpg\',\'rb\') 44 img = base64.b64encode(f.read()) 45 return img 46 #播放声音 47 def playvioce(name): 48 pygame.mixer.music.load(\'./voice/\' +name) 49 pygame.mixer.music.play() 50 #发送信息到微信上 51 def sendmsg(name,main): 52 url = "https://sc.ftqq.com/***********************************.send?" 53 urllib.request.urlopen(url + "text="+name+"&desp="+main) 54 55 #上传到百度api进行人脸检测 56 def go_api(image): 57 result = client.search(str(image, \'utf-8\'), IMAGE_TYPE, GROUP); 58 if result[\'error_msg\'] == \'SUCCESS\': 59 name = result[\'result\'][\'user_list\'][0][\'user_id\'] 60 score = result[\'result\'][\'user_list\'][0][\'score\'] 61 if score > 80: 62 print("Welcome %s !" % name) 63 if name == \'fanghao\': 64 sendmsg("DoorOpen",name) 65 playvioce(\'fanghao.mp3\') 66 time.sleep(3) 67 if name == \'chengjiayu\': 68 sendmsg("DoorOpen",name) 69 playvioce(\'chengjiayu.mp3\') 70 time.sleep(3) 71 playvioce(\'despacito.mp3\') 72 time.sleep(5) 73 if name == \'zhangzhijian\': 74 sendmsg("DoorOpen",name) 75 playvioce(\'zhangzhijian.mp3\') 76 time.sleep(3) 77 else: 78 print("Sorry...I don\'t know you !") 79 playvioce(\'noroot.mp3\') 80 name = \'Unknow\' 81 return 0 82 curren_time = time.asctime(time.localtime(time.time())) 83 f = open(\'Log.txt\',\'a\') 84 f.write("Person: " + name + " " + "Time:" + str(curren_time)+\'\n\') 85 f.close() 86 return 1 87 if result[\'error_msg\'] == \'pic not has face\': 88 print(\'There is no face in image!\') 89 playvioce(\'face.mp3\') 90 time.sleep(2) 91 return 0 92 else: 93 print(result[\'error_code\']+\' \' + result[\'error_code\']) 94 return 0 95 #主函数 96 if __name__ == \'__main__\': 97 GPIO.setmode(GPIO.BOARD) 98 GPIO.setup(GPIO_IN_PIN,GPIO.IN) 99 GPIO.setup(GPIO_OUT_PIN1,GPIO.OUT) 100 GPIO.setup(GPIO_OUT_PIN2,GPIO.OUT) 101 while True: 102 print(\'OK\') 103 if True: 104 #if GPIO.input(GPIO_IN_PIN) == GPIO.LOW: 105 getimage() 106 img = transimage() 107 res = go_api(img) 108 if(res == 1): 109 GPIO.output(GPIO_OUT_PIN2,GPIO.HIGH) 110 time.sleep(1) 111 GPIO.output(GPIO_OUT_PIN2,GPIO.LOW) 112 else: 113 GPIO.output(GPIO_OUT_PIN1,GPIO.HIGH) 114 time.sleep(1) 115 GPIO.output(GPIO_OUT_PIN1,GPIO.LOW) 116 print(\'waite 3 seconds to do next\') 117 playvioce(\'waite.mp3\') 118 time.sleep(3) 119 120 121
这里拍照用的picamera,是专门为树莓派定制的摄像头,淘宝可以买到。picamera的使用方法可以在这里看到。播放音乐我用的pygame的播放音乐模块,我请小姐姐给我录的音,哈哈炒鸡好听~,推送微信我用的一个很好的工具server酱,真的非常好用,只需一行代码就OK~
下面贴一张丑照:
外壳还在打印,所以暂时就用红绿灯表示门的开关了,等外壳打印好了再更新一波实测视频~