基於樹莓派的人臉認證門禁


 

 現在實驗室用的門禁都是刷卡進入,經常忘記帶卡而進不去,所以就用樹莓派自己做了一個刷臉認證的門禁系統,簡單易用,准確性還挺高。接下來詳細的說下具體的制作過程:

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~

下面貼一張丑照:

  

 

外殼還在打印,所以暫時就用紅綠燈表示門的開關了,等外殼打印好了再更新一波實測視頻~

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM