現在實驗室用的門禁都是刷卡進入,經常忘記帶卡而進不去,所以就用樹莓派自己做了一個刷臉認證的門禁系統,簡單易用,准確性還挺高。接下來詳細的說下具體的制作過程:
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~
下面貼一張丑照:
外殼還在打印,所以暫時就用紅綠燈表示門的開關了,等外殼打印好了再更新一波實測視頻~