溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

發(fā)布時(shí)間:2021-11-19 18:17:41 來(lái)源:億速云 閱讀:176 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

樹莓派人臉識(shí)別門禁系統(tǒng)的總體設(shè)計(jì)

硬件包括:樹莓派3B、電源模塊、轉(zhuǎn)5V降壓模塊、觸摸感應(yīng)傳感器模塊、聲光報(bào)警模塊和驅(qū)動(dòng)模塊。

由此設(shè)計(jì)出的人臉識(shí)別門禁系統(tǒng)總體結(jié)構(gòu)框圖如下:

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

總體結(jié)構(gòu)框圖

程序運(yùn)行時(shí)樹莓派會(huì)將本地照片中的面部圖像發(fā)送至云端服務(wù)進(jìn)行分析,識(shí)別出的人臉會(huì)給出face_token,用于后續(xù)的人臉比對(duì)等操作。觸摸傳感器觸發(fā)主函數(shù)實(shí)時(shí)拍照并發(fā)送至云服務(wù)調(diào)用Search API在Faceset中找出與目標(biāo)人臉最相似的一張或多張人臉。將比對(duì)結(jié)果發(fā)送到樹莓派本地終端,提取返回結(jié)果并將其顯示在樹莓派終端。

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

主流程圖

系統(tǒng)主要功能實(shí)現(xiàn)

當(dāng)觸摸開關(guān)被按下LED閃爍,接著進(jìn)行一張人臉的采集。并將此照片與已經(jīng)上傳的三張照片做對(duì)比。判斷出相似的人臉。當(dāng)相似度大于70%,則開門(電機(jī)正轉(zhuǎn)開門 、停止并發(fā)出警報(bào)聲、電機(jī)反轉(zhuǎn)關(guān)門)。

主要模塊各自的功能如下:

主控模塊。在本設(shè)計(jì)中主要起到集中分配的作用,不僅需要即時(shí)采集人臉圖像,調(diào)用API處理圖像,同時(shí)還要提供攝像頭檢測(cè)、驅(qū)動(dòng)芯片、顯示屏等數(shù)字器件的工作信號(hào)。

觸發(fā)模塊。系統(tǒng)的輸入部分,實(shí)現(xiàn)人機(jī)交互。通過(guò)接收觸控按鍵的電平信息,使得樹莓派得到需要的數(shù)據(jù)。

檢測(cè)模塊。對(duì)人臉進(jìn)行采集攝像的模塊,提供最原始的圖片信息。

驅(qū)動(dòng)模塊。大門開閉的過(guò)程控制的控制元件

顯示模塊。以連接一臺(tái)電腦液晶顯示器即可

系統(tǒng)電源模塊。系統(tǒng)電源模塊主要負(fù)責(zé)給系統(tǒng)提供符合要求的電流與電壓

報(bào)警模塊。系統(tǒng)的聲光報(bào)警模塊,利用LED燈和蜂鳴器來(lái)提示人臉即將檢測(cè)的信息。


主控板的選型

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

樹莓派3B

觸發(fā)模塊

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

觸摸開關(guān)模塊

檢測(cè)模塊

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

樹莓派攝像頭

樹莓派專用500W攝像頭提供了三個(gè)應(yīng)用程序,分別為:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉圖像,而 raspivid 用于捕捉視頻。

樹莓派上電即開機(jī)進(jìn)入系統(tǒng)。啟動(dòng)人臉識(shí)別檢測(cè)程序。程序啟動(dòng)后觸摸傳感器循環(huán)檢測(cè)是否被觸發(fā)。檢測(cè)周期時(shí)2S,當(dāng)觸摸感應(yīng)開關(guān)被觸發(fā)則啟動(dòng)攝像頭實(shí)時(shí)拍照。照片存儲(chǔ)到本地之后上傳云服務(wù)處理。之后判斷返回的處理結(jié)果是否通過(guò)。

搭建opencv環(huán)境將在下一個(gè)文章詳細(xì)介紹,此處跳過(guò)。除此之外安裝pycurl.使用apt-get的方式安裝$ sudo apt-get install python-pycurl。

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

流程圖

到Face++網(wǎng)站https://www.faceplusplus.com.cn/注冊(cè)自己的APIkey.

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'

]

輸入自己在Face++網(wǎng)站注冊(cè)的APIkey。

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

FACE++的API

Detect API

調(diào)用者提供圖片文件或者圖片URL,進(jìn)行人臉檢測(cè)和人臉分析。識(shí)別出的人臉會(huì)給出face_token,用于后續(xù)的人臉比對(duì)等操作。請(qǐng)注意,只對(duì)人臉包圍盒面積最大的5個(gè)人臉進(jìn)行分析,其他人臉可以使用Face Analyze API進(jìn)行分析。如果您需要使用檢測(cè)出的人臉于后續(xù)操作,建議將對(duì)應(yīng)face_token添加到FaceSet中。如果一個(gè)face_token連續(xù)72小時(shí)沒有存放在任意FaceSet中,則該face_token將會(huì)失效。如果對(duì)同一張圖片進(jìn)行多次人臉檢測(cè),同一個(gè)人臉得到的face_token是不同的。

Search API

在Faceset中找出與目標(biāo)人臉最相似的一張或多張人臉。支持傳入face_token或者直接傳入圖片進(jìn)行人臉?biāo)阉?。使用圖片進(jìn)行比對(duì)時(shí)會(huì)選取圖片中檢測(cè)到人臉尺寸最大的一個(gè)人臉。

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

調(diào)用正確的返回值

系統(tǒng)調(diào)試及運(yùn)行

樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析

等待對(duì)比的照片先存儲(chǔ)在本地 等待代碼中上傳


程序初始設(shè)置

首先拍攝的照片上傳到本文件夾并修改圖片文件名,然后在代碼中將三張待對(duì)比照片賦值給face_one、face_two、face_three三個(gè)變量。并設(shè)置進(jìn)行對(duì)比的照片名為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程序中設(shè)置調(diào)用API的key和secret。

#http_url='https://api-cn.faceplusplus.com/facepp/v3/detect'

key = "XXXXXXXXXXXXXXXXXXXX"

secret = "XXXXXXXXXXXXXXXXXXXXXXXX"

api = facepp.API(key, secret)


各功能函數(shù)

蜂鳴器,前面已經(jīng)初始設(shè)置GPIO12為輸出模式,此處bee()函數(shù)設(shè)置GPIO12為高電平,延時(shí)0.5s后置為低。意味著當(dāng)調(diào)用bee()函數(shù)時(shí)蜂鳴器鳴叫0.5s.

def bee():

GPIO.output(12, False)

time.sleep(0.5)

GPIO.output(12, True)


步進(jìn)電機(jī),設(shè)置旋轉(zhuǎn)角度為180°,closewise=1時(shí),步進(jìn)電機(jī)順時(shí)針旋轉(zhuǎn),closewise=0時(shí),步進(jìn)電機(jī)逆時(shí)針旋轉(zhuǎn)。步進(jìn)電機(jī)驅(qū)動(dòng)模塊由樹莓派的GPIO35、 GPIO36、 GPIO38 、GPIO40四個(gè)GPIO驅(qū)動(dòng)。

def motor_open():

steps = 180;

clockwise = 1;

arr = [0,1,2,3];

if clockwise!=1:

arr = [3,2,1,0];

ports = [40,38,36,35] # GPIO 21(Pin 40) GPIO 20(Pin 38) GPIO 16(Pin 36) GPIO 19(Pin 35)

for p in ports:

GPIO.setup(p,GPIO.OUT)

for x in range(0,steps):

for j in arr:

time.sleep(0.002)

for i in range(0,4):

if i == j:

GPIO.output(ports[i],True)

else:

GPIO.output(ports[i],False)


(3)流水燈:初始設(shè)置已經(jīng)將GPIO11、GPIO15、GPIO16為輸出模式。分別把三個(gè)LED發(fā)光二極管的長(zhǎng)引腳接到這三個(gè)GPIO上,短引腳接至負(fù)極。通過(guò)把對(duì)應(yīng)的引腳置為高電平延時(shí)0.3s后置為低,循環(huán)點(diǎn)亮三個(gè)小燈。

def light():

GPIO.output(11, True)

time.sleep(0.3)

GPIO.output(11, False)

GPIO.output(15, True)

time.sleep(0.3)

GPIO.output(15, False)

GPIO.output(16, True)

time.sleep(0.3)

GPIO.output(16, False)


系統(tǒng)預(yù)熱好,提示做好準(zhǔn)備 ,一段時(shí)間后進(jìn)行拍照。在終端窗口輸出提示信息。并調(diào)用light()來(lái)實(shí)現(xiàn)LED發(fā)光二極管的流水燈效果。并調(diào)用bee()讓蜂鳴器發(fā)出提示聲音。

def prep():

print("歡迎使用人臉識(shí)別檢測(cè)系統(tǒng) 請(qǐng)面對(duì)攝像頭 5秒鐘后進(jìn)行人臉采集")

light()

print("************************5*********************")

light()

print("************************4*********************")

light()

print("************************3*********************")

light()

print("************************2*********************")

light()

print("************************1*********************")

bee()


調(diào)用拍照函數(shù)時(shí)流水燈點(diǎn)亮,然后使用opencv利用攝像頭采集一張照片,將照片保存為customer.jpg。

def take_photo():

light()

capture = cv2.VideoCapture(0)

if not capture.isOpened(): print('Capture failed because of camera')

ret, img = capture.read()

cv2.imwrite('customer.jpg', img)

print("***********************照片采集完畢 請(qǐng)稍等*************************")

print '=' * 60

函數(shù)調(diào)用API將本地存儲(chǔ)的照片進(jìn)行人臉檢測(cè)和人臉分析。識(shí)別出的人臉會(huì)給出face_token,用于后續(xù)的人臉比對(duì)等操作。然后調(diào)用searchAPI在Faceset中找出與目標(biāo)人臉最相似的一張或多張人臉。進(jìn)行比對(duì)時(shí)會(huì)選取圖片中檢測(cè)到人臉尺寸最大的一個(gè)人臉。


觸發(fā)檢測(cè)的監(jiān)測(cè)函數(shù)det(),程序運(yùn)行時(shí)開始檢測(cè)觸摸開關(guān)是否被觸發(fā)。當(dāng)觸摸開關(guān)被觸發(fā)時(shí)會(huì)發(fā)送高電平信號(hào)給樹莓派。當(dāng)檢測(cè)GPIO13為真時(shí),在終端輸出確定信息,并調(diào)用主函數(shù)進(jìn)行對(duì)比操作。主程序運(yùn)行結(jié)束后繼續(xù)檢測(cè)是否被觸發(fā)。一直循環(huán)指導(dǎo)程序退出。

def det():

while True:

if GPIO.input(13)==True:

print "confirm"

main()

else:

print "NO BODY"

time.sleep(2)

det()

提取API.search返回結(jié)果,并將返回的信息保存到s,并從中提取相似度的值。轉(zhuǎn)換s[0][‘configdence’]為整形變量賦值給m。當(dāng)m大于70時(shí)輸出通過(guò)檢測(cè)并調(diào)用步進(jìn)電機(jī)轉(zhuǎn)動(dòng)。


異常處理

目的是刪除無(wú)用的人臉庫(kù),所以新建了一個(gè)debug.py的python文件。當(dāng)檢測(cè)失敗之后執(zhí)行一次debug.py即可。

import facepp

#http_url='https://api-cn.faceplusplus.com/facepp/v3/detect'

key = "xzFPqqR1q_fasM1D3s4yvUdcBoTovUMX"

secret = "4GXhLafqDOmnfQRxx-6ZlEVwQpOlZoW-"

api = facepp.API(key, secret)

# 創(chuàng)建一個(gè)Faceset用來(lái)存儲(chǔ)FaceToken

# create a Faceset to save FaceToken

def main():

api.faceset.delete(outer_id='detect', check_empty=0)

#ret = api.faceset.create(outer_id='detect')

#print_result("faceset create", ret)

main()

文中為了節(jié)省篇幅 省略了opencv搭建的步驟。其實(shí)拍照功能可以換成調(diào)用os使用命令行的方式拍照:

def take_photo():

os.system('raspistill -w 480 -h 360 -o customer.jpg -t 2000')

print("***********************首次照片采集完畢 請(qǐng)稍等*************************")

print '=' * 60

看完上述內(nèi)容,你們對(duì)樹莓派人臉識(shí)別門禁系統(tǒng)代碼以及代碼分析有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI