畢業(yè)論文:基于樹莓派的人臉識別門禁系統(tǒng)本科畢業(yè)設(shè)計文章

玩轉(zhuǎn)樹莓派2017-07-17 18:59

畢業(yè)論文

基于微型計算機的人臉識別門禁系統(tǒng)設(shè)計

1. 課題意義及目標(biāo)

隨科技的不斷發(fā)展,安全性的要求也不斷提高,IC卡等傳統(tǒng)身份識別工具已不能滿足社會需求。所以從通用性、安全性、成熟性和造價性等多方面綜合考慮,研究新的識別工具是一個必然的趨勢?;谌四樧R別的門禁系統(tǒng)的設(shè)計,能夠提高傳統(tǒng)安保行業(yè)的安全性、方便性、直觀性等,最為有效的杜絕了門禁管理中的人為因素,充分體現(xiàn)了門禁管理的人工智能性,避免不必要的安全隱患和人員糾紛。因此本次畢業(yè)設(shè)計選擇了人臉識別門禁系統(tǒng)的研究與實現(xiàn),以保證門禁數(shù)據(jù)的真實性,真正做到安全、方便和直觀的門禁管理,從而進一步提高公司、倉庫、家庭等地的安保水平和管理穩(wěn)定性。

本次設(shè)計將以微型計算機為核心,需選擇合適的電源模塊、檢測模塊、、數(shù)據(jù)存儲模塊、鍵盤模塊、顯示模塊和聲光報警模塊,完成人臉識別系統(tǒng)的檢測并報警處理的設(shè)計。要求能夠?qū)⒊鋈腴T禁系統(tǒng)的人員面部進行識別,能夠在人臉數(shù)據(jù)匹配預(yù)存數(shù)據(jù)庫資料時啟動門禁系統(tǒng)中開門系統(tǒng),當(dāng)人臉數(shù)據(jù)不匹配預(yù)存數(shù)據(jù)庫資料時啟動門禁系統(tǒng)中閉門系統(tǒng),實現(xiàn)防范防盜的作用,創(chuàng)造安全良好的生活工作環(huán)境。

2.主要任務(wù)

(1)查閱資料,了解人臉識別門禁系統(tǒng)的原理和基本構(gòu)成,提出系統(tǒng)總體設(shè)計方案。

(2)通過學(xué)習(xí)完成的各個控制硬件電路設(shè)計(如檢測模塊,A/D轉(zhuǎn)換模塊,聲光報警模塊,系統(tǒng)電源模塊等)。

(3)完成人臉識別門禁系統(tǒng)的軟件設(shè)計。

(4)完成人臉識別門禁系統(tǒng)的調(diào)試、仿真和實物制作。

(5)完成設(shè)計說明書。

基于微型計算機(樹莓派)的人臉識別門禁系統(tǒng)

摘 要

隨科技的不斷發(fā)展,社會不斷的進步,人們的自身安全意識和要求也再不斷提高,IC卡等傳統(tǒng)身份識別工具已不能滿足社會需求。所以從通用性、安全性、成熟性和造價性等多方面綜合考慮,研究新的識別工具是一個必然的趨勢。為能夠提高傳統(tǒng)安保行業(yè)的安全性、方便性、直觀性和有效的杜絕了門禁管理中的人為因素,通過人工智能方式,避免不必要的安全隱患和人員糾紛。

提出一種基于微型計算機(樹莓派)的人臉識別門禁系統(tǒng),該系統(tǒng)通過使用人臉識別云服務(wù)可以實時對人員進行分析辨認(rèn),以保證門禁數(shù)據(jù)的真實性,真正做到安全、方便和直觀的門禁管理,從而進一步提高公司、倉庫、家庭等地的安保水平和管理穩(wěn)定性。文中詳細(xì)描述了該系統(tǒng)的搭建和實現(xiàn)過程,為相關(guān)產(chǎn)品提供了一套很好的解決方案。對所設(shè)計的系統(tǒng)進行了模擬測試,其測試結(jié)果達(dá)到了設(shè)計目標(biāo)。

關(guān)鍵詞: 微型計算機(樹莓派),人臉識別,云服務(wù),Python

目錄

第 1 章 緒 論

1.1 研究背景

隨著社會的發(fā)展,安全教育不斷的深化,人們的安全防范意識也逐漸贈強,這里面不光包括個人安全,還涉及到了財產(chǎn)和知識產(chǎn)權(quán)的保護,安檢的高效,貿(mào)易的順利流通等方面的需求增加,這種生物

由此可設(shè)計出人臉識別門禁系統(tǒng)的總體結(jié)構(gòu)框圖,如圖2-1所示:

圖2.1 人臉識別門禁系統(tǒng)的總結(jié)構(gòu)框圖

本次設(shè)計中測試及最終使用,一直采用Python2.7編程語言對微型計算機(樹莓派)系統(tǒng)進行開發(fā)和設(shè)計,其中人臉識別調(diào)用了face++的API, 官網(wǎng)提供了基于Python的SDK,該語言的可讀性高很適合本系統(tǒng)的開發(fā)。本系統(tǒng)總體結(jié)構(gòu)圖如上。本地終端為微型計算機(樹莓派),云服務(wù)采用了FACE++人工智能開發(fā)平臺。

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

本論文中所設(shè)計的系統(tǒng)是對人臉圖像進行處理識別并與門禁系統(tǒng)配合起到安全防盜的基本功能。工作原理是首先將三張待檢測人員的照片存儲到樹莓派文件系統(tǒng),執(zhí)行此段程序時,調(diào)用face++的detectAPI將三張照片中的人臉信息存儲在開發(fā)者賬號,然后執(zhí)行search的API,對現(xiàn)在進行的人臉識別程序中拍攝的照片進行處理,檢測照片中的人臉信息并與之前上傳的人臉信息對比,并返回相似度最高的人臉信息。我們在程序中只提取confidence的值,即人臉相似度。當(dāng)觸摸開關(guān)被按下,程序會發(fā)出警報LED閃爍,接著進行一張人臉的采集。并將此照片與已經(jīng)上傳的三張照片做對比。判斷出相似的人臉。當(dāng)相似度大于70%,則開門(電機正轉(zhuǎn)開門 、停止并發(fā)出警報聲、電機反轉(zhuǎn)關(guān)門)。

系統(tǒng)由微型計算機(樹莓派),驅(qū)動模塊,檢測模塊,顯示模塊,報警模塊,電源模塊等組成。系統(tǒng)帶有按鍵,用戶可以通過按鍵觸發(fā)人臉識別功能;系統(tǒng)具有采集和檢測人臉功能,可以當(dāng)進入人員匹配成功時,開啟大門,同時報警裝置啟動;當(dāng)進入人員匹配失敗時,大門不開啟以保障安全。

在本設(shè)計中,系統(tǒng)主要模塊各自的功能如下:

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

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

(3)驅(qū)動模塊。廠門電極作為大門開閉的過程控制的控制元件,其驅(qū)動主要由驅(qū)動芯片實現(xiàn)。通過操縱大門電機正轉(zhuǎn)和反轉(zhuǎn),實現(xiàn)對大門的開閉控制。

(4)顯示模塊。以連接一臺電腦顯示器即可

(5)系統(tǒng)電源模塊。系統(tǒng)電源模塊主要負(fù)責(zé)給系統(tǒng)提供符合要求的電流與電壓,由于微型計算機(樹莓派)使用低壓直流電壓,就需要將兩節(jié)鋰電池18650電源7V轉(zhuǎn)換為符合要求的電壓、電流。從而使整個系統(tǒng)有持續(xù)的供電保證。[4]

本系統(tǒng)的設(shè)計具有半自動門禁系統(tǒng)的特點。待檢測人員需要用手按下觸摸開關(guān),進而觸發(fā)人臉識別。系統(tǒng)將對其進行攝像并將圖像發(fā)送至云端服務(wù)進行處理,待處理完之后微型計算機(樹莓派)對返回的比對數(shù)據(jù)結(jié)果進行判斷。如果對比成功,則驅(qū)動步進電機開始旋轉(zhuǎn)。系統(tǒng)的實時性是用戶體驗的關(guān)鍵要素,系統(tǒng)正常工作時待識別的人員感覺不到卡頓狀況 ,實時性良好。

第3章人臉識別門禁系統(tǒng)硬件設(shè)計

3.1主控模塊

圖3.1 主控模板實物圖

本次設(shè)計的主控模塊是使用微型計算機──樹莓派3代B型主板。樹莓派3代B型主板,該主控板模塊的優(yōu)勢是擁有良好的標(biāo)準(zhǔn)模塊擴展性,主板上預(yù)留的接口可完美對接與之配套的樹莓派500萬像素專用攝像頭、7英寸液晶觸摸屏、Sense Hat傳感器模塊等。除了可以在愛好者論壇下載網(wǎng)民大神們做好的系統(tǒng)包之外,如今還可以直接購買預(yù)裝了樹莓派代3代B型主板專用NOOBs系統(tǒng)的MicroSD卡。說到這里就又促生了樹莓派代3代B型主板的進一步優(yōu)勢,那便是與微軟的結(jié)合,微軟為該產(chǎn)品推出了與之適配的Windows 10 IoT版操作系統(tǒng),用戶可以使用到更加熟悉的UI,使得通過標(biāo)準(zhǔn)擴展模塊和GPIO接口擴展模塊操作變得簡單,IP等協(xié)議的配置也變得更加簡單,同時驅(qū)動又在不斷更新,不斷完善,所以不用再去考慮重新開發(fā)Windows的驅(qū)動程序,以上這些與樹莓派代3代B型主板的結(jié)合,對新入門的玩家以及互聯(lián)網(wǎng)開發(fā)者來說是意義非凡的。

主要包括以下幾點:

【Raspberry Pi 3 Model B】

· BCM2837

· 64位的1.2GHz四核ARM Cortex-A53

· 1GB內(nèi)存

· 10/100自適應(yīng)網(wǎng)卡

· 802.11n WiFi無線網(wǎng)卡

· 低功耗藍(lán)牙4.1 (BLE)

· HDMI接口

· USB 2.0接口 x 4

· MicroSD 卡插槽

· 3.5 mm 音頻輸出接口

· 40PIN GPIO接口

· CSI攝像頭接口

· DSI顯示接口

· 升級后的電源管理系統(tǒng),以便使用更多耗電的外設(shè)(須用2.5A以上電源供電) 樹莓派3代B型是一款基于ARM的微型計算機主板,以SD/MicroSD卡進行存儲,該主板提供USB接口和以太網(wǎng)接口,可以連接鍵盤、鼠標(biāo)和網(wǎng)線,該主板具備所有PC的基本功能,例如:高清視頻播放、電子表格書寫、玩游戲等諸多功能,還整合了視頻模擬信號的電視輸出接口和HDMI高清視頻輸出接口。 樹莓派將Python作為主要編程語言,支持Java、BBC BASIC (通過 RISC OS 映像或者Linux的"Brandy Basic"克隆)、C 和Perl等編程語言。本設(shè)計使用的是最新樹莓派官方系統(tǒng)。是基于debian的一種linux32位操作系統(tǒng)。本次設(shè)計使用系統(tǒng)中安裝的python2.7運行程序。

3.2檢測模塊

3.2攝像頭模塊實物圖

本次設(shè)計的檢測模塊是使用樹莓派專用500W像素攝像頭。該攝像頭提供了三個應(yīng)用程序,分別為:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉圖像,而 raspivid 用于捕捉視頻。

應(yīng)用程序使用了四個 OpenMAX(mmal)組件:camera(攝像)、preview(預(yù)覽)、encoder(編碼)、null_sink。所有應(yīng)用程序均使用了攝像組件,raspistill 使用了圖像編碼組件,raspivid 使用了視頻編碼組件,raspistillyuv 沒有使用編碼組件,而是直接將 YUV 或 RGB 從攝像組件輸出到文件。所有應(yīng)用程序均基于命令行方式運行,通過 OpenMAX 的 mmal API 進行編寫。我們在設(shè)計中結(jié)合Opencv調(diào)用攝像頭進行拍照操作。

攝像頭電路板與樹莓派通過一條 15 芯的排線進行連接。具體連接操作如下:先將樹莓派上連接座兩端卡扣拉起,再把排線插入座中,并豎直,然后按下兩端的卡扣。攝像頭電路板連接同上。

3.3 驅(qū)動模塊

當(dāng)輸入信號相對而言比較微弱時,相應(yīng)功率較小無法正常工作。驅(qū)動模塊實質(zhì)是通過放大功率,從而滿足負(fù)載額定功率使得負(fù)載可以正常工作,從而可以響應(yīng)微弱的輸入信號。微型計算機(樹莓派)上有IN1, IN2, IN3, IN4四個接口,根據(jù)資料,設(shè)置為低電平就可以驅(qū)動,用杜邦線分別將IN1,IN2,IN3,IN4和GPIO 21(Pin 40),GPIO 20(Pin 38), GPIO 16(Pin 36), GPIO 19(Pin 35)進行連接。每次將四個GPIO端口按下表依次設(shè)置好電平后,可以sleep幾十毫秒來控制轉(zhuǎn)速

圖3.3 步進電機驅(qū)動原理

圖3.4 樹莓派GPIO編碼圖

3.3.1 步進電機工作原理

在不超過額定負(fù)載時,脈沖信號的頻率控制電機轉(zhuǎn)動的速度、脈沖數(shù)決定電機止步的位置,均不會因為負(fù)載變化而受到任何的影響[8]。步進電機每走一步,就要加一個激磁信號,假如適當(dāng)?shù)男盘?,轉(zhuǎn)子以一定的步數(shù)轉(zhuǎn)動;無激磁信號輸入時,轉(zhuǎn)子保持一定的位置。步進電機工作的基本原理如下:

(1)換相順序的控制

電機通電后,主要通過脈沖分配來實現(xiàn)工作相序的變化。以步進電機四相八拍工作方式為例,要求各相按照A-AB-B-BC-C-CD-D-DA的順序來工作,控制脈沖就要按照該順序來控制A、B、C、D相的通斷。

(2)步進電機轉(zhuǎn)向的改變

按照既定工作方式正向轉(zhuǎn)動的順序來給電機通電,電機就會正向轉(zhuǎn)動;但是按照相反順序來通電的話,電機會向相反方向轉(zhuǎn)動。

(3)步進電機轉(zhuǎn)動速度的改變

步進電機每一次接收到一個控制脈沖,它就會相應(yīng)轉(zhuǎn)動一步,轉(zhuǎn)動固定角度。因此步進電機的轉(zhuǎn)動速度就由兩脈沖的間隔長短來決定,即是兩脈沖發(fā)送間隔越長,相應(yīng)的步進電機轉(zhuǎn)動就越慢。如果要實現(xiàn)對步進電機轉(zhuǎn)動速度調(diào)節(jié),就需要改變單位時間內(nèi)控制模塊發(fā)出的脈沖個數(shù)。

步進電機驅(qū)動方法有四相四拍運行方式,即AB-BC-CD-DA-AB;四相八拍運行方式,即A-AB-B-BC-C-CD-D-DA-A。

四相步進電機,供電電源為5伏,5伏電源的正極性端連接電機公共端,而 5伏電源的接地端需要分別和電機剩余的四根控制線順次接觸,可以發(fā)現(xiàn)電源地線與電機控制線每接觸一下,步進電機就會轉(zhuǎn)動一定角度,電機轉(zhuǎn)動完整一圈的時間,恰好需要如此來回轉(zhuǎn)動的次數(shù)可以達(dá)到5次。由此可以計算出該步進電機的步進角度為

度。若四條控制線與電源地線接觸的順序恰好相反,那么電機也就隨之向相反方向轉(zhuǎn)動。

3.3.2 步進電機驅(qū)動電路

由于步進電機的驅(qū)動電流的數(shù)值相對較高,所以單片機與步進電機不能直接連接,常常采用專門的接口及驅(qū)動電路。驅(qū)動器可以采用功率比較高的復(fù)合管,如ULN2003,L298N,或者購買專用的步進電機驅(qū)動器。驅(qū)動電路的工作狀態(tài)是由控制信號來決定的,控制信號需要由主控模塊,即單片機來產(chǎn)生。期望實現(xiàn)以下的步進電機驅(qū)動要求:

(1)期望驅(qū)動電路提供的電流上升和下降速度可以比較快,這樣可以使電流的波形盡可能的接近矩形波。

(2)期望驅(qū)動電路功率和效率相對比較高,提高運行經(jīng)濟性。

單片機的輸出電流太小,無法直接連接步進電機,需要加驅(qū)動電路。對于電流小于0.5A的步進電機,可以采用ULN2003類的驅(qū)動IC。驅(qū)動芯片ULN2003內(nèi)部結(jié)構(gòu)如圖3.4所示。

圖3.4 ULN2003內(nèi)部結(jié)構(gòu)框圖

ULN2003是由復(fù)合達(dá)林頓晶體管排列組成,使耐受電壓比較高,允許通過電流較大。共有7對NPN達(dá)林頓管,分別為芯片7個控制單元,包括功率驅(qū)動單元、保護單元等。ULN2003采用DIP-16或者SOP-16雙列16腳塑料封裝,驅(qū)動單元可以與步進電動機直接耦合,連接方便,其數(shù)字邏輯電路為非門電路,取反控制。

選取ULN2003作為電機驅(qū)動芯片,價格經(jīng)濟,且可以充分發(fā)揮功能,實現(xiàn)穩(wěn)定驅(qū)動??梢灾苯油ㄟ^電源來調(diào)節(jié)輸出電壓,可以直接用單片機的IO口提供信號,而且電路簡單。芯片采用單片機作為控制核心,在程序相互調(diào)用的方面,更加的方便靈活。

圖3.5 ULN2003引腳圖

圖3.5所示為驅(qū)動器引腳圖,圖左邊1~7引腳為輸入端,有單片機直接控制,接單片機輸出端,引腳8直接接地;右側(cè)10~16引腳為輸出端,接步進電機,引腳9接電源+5V,必要時也可以什么都不接懸空而置,該驅(qū)動器可提供最高0.5A的電流。

ULN2003的主要特點是:

(1)驅(qū)動ULN2003電流比較大。ULN2003可以較好的用于單片機控制的電路。

(2)ULN2003連接上拉電阻,在驅(qū)動電機時可以提高其抵抗干擾的能力。ULN2003的每兩個達(dá)林頓管視為一個單元,都會串聯(lián)一定阻值的高值電阻可以直接和TTL 或承載電壓為5V的CMOS 裝置連接 。

(3)ULN2003的輸出采用集電極開路,電流輸出值比較大,可以達(dá)到500mA。因此可以用來驅(qū)動電機。

另外,ULN2003的極限參數(shù)分別如表3.1、3.2所列。

表3.1 ULN2003的極限參數(shù)

表3.2 ULN2003的極限參數(shù)

接線時需要把步進電機電路圖的紅色線懸空,其它線接驅(qū)動板。如果驅(qū)動不起來,有可能接線不對或電壓低。如果用單片機來控制此步進電機,則只需分別依次給各線一定時間的脈沖電流,電機便可連續(xù)轉(zhuǎn)動起來。

ULN2003驅(qū)動電機的電路圖如下圖3.6所示。由單片機P3.4—P3.7口經(jīng)上拉電阻作為驅(qū)動芯片ULN2003的輸入。COM端供電12V,輸出端10至12引腳均接地。四相五線式步進電機的A、B、C、D四相分別與ULN2003的輸出端1C—4C連接,接收控制脈沖,實現(xiàn)控制。

圖3.6 ULN2003驅(qū)動電機的電路圖

3.3.3 步進電機的選型

步進電機是一種專門用于位置與速度精確控制的特種電機,雖然同為電機件,步進電機區(qū)別于其他控制電機的最大特點是,它主要采用無反饋環(huán)節(jié)的開環(huán)控制,將微觀的電脈沖信號轉(zhuǎn)變?yōu)楹暧^電機轉(zhuǎn)動的角位移或線位移。它通過數(shù)字來實現(xiàn)電機控制,控制信號以脈沖形式發(fā)出,它所接受到的脈沖可以驅(qū)使電機轉(zhuǎn)動,即被轉(zhuǎn)化為相應(yīng)的角位移,所以只要給步進電機一個合適的脈沖信號,它就隨之動作固定角度,當(dāng)采用單片機來控制步進電機相對簡單易操作。繞在定子的線圈配置作為步進電機相數(shù)分類的主要依據(jù),主要可分為2相、4相、5相等;根據(jù)外部引線步進電機又被分為三線式、五線式、六線式等,但各種類型的電機其控制方法并沒有發(fā)生太大的變化,均采用脈沖信號進行驅(qū)動。

門禁系統(tǒng)的運動不需要加速、減速過程,所需轉(zhuǎn)速較低,所以步進電機選用自啟動運行方式。自啟動運行方式是指在驅(qū)動電機旋轉(zhuǎn)和停止時不經(jīng)過加速、減速階段,而直接以驅(qū)動脈沖速度啟動和停止的運行方式。同時,因為在啟動、停止時存在一個突然的速度變化,所以這種方式需要較大的加、減速力矩。由于具體負(fù)載重量也會影響其是否產(chǎn)生過大的工作噪音,所以四相五線式步進電機的負(fù)載容量可以較好滿足要求。另外,出于對電流、步距角、靜轉(zhuǎn)矩三大要素的考慮,本設(shè)計選擇四相五線式步進電機來模擬門禁系統(tǒng)的控制,可以直接插接方便使用。

3.4 報警模塊

作為人臉識別門禁系統(tǒng)的設(shè)備,聲光報警電路不可或缺。在系統(tǒng)工作中,每當(dāng)人臉數(shù)據(jù)匹配成功時,便會觸發(fā)蜂鳴器和發(fā)光二極管實現(xiàn)聲光報警,使監(jiān)控人員得到開啟大門信號,反之則不報警。半導(dǎo)體二極管和普通二極管都是是類似的PN結(jié)結(jié)構(gòu),具有單向?qū)щ娦?,可以將電能轉(zhuǎn)化成光能。 在將電流通到發(fā)光二極管之后,電子從N區(qū)移動到P區(qū),并且從P區(qū)移動到N區(qū)的空穴在PN結(jié)附近與孔中的電子復(fù)合,N區(qū)域產(chǎn)生熒光發(fā)光提醒。

聲光報警設(shè)計部分包括蜂鳴器和LED報警指示燈。聲音報警電路如圖3.11所示,由于微控制器驅(qū)動能力的I / O端口較低,所以需要增加蜂鳴器PNP晶體管驅(qū)動,可以讓那個蜂鳴器的聲音聽起來更響,更好地發(fā)揮警報功能。為了避免錯誤的報警添加了三極管基電路,蜂鳴器只有在輸出低時才會發(fā)出聲音。

圖3.8 聲音報警電路原理圖

3.5 顯示模塊

設(shè)計中為從一定程度上減小操作人員的工作量,特用電腦顯示器作為顯示模塊,電腦顯示器就不做過多闡述了。

3.6電源模塊

本模塊的作用是用來控制電源是否進入工作狀態(tài)。電源模塊一般分為以下幾部分:濾波電路模塊、全波整流電路模塊、電源變壓器模塊等。一般電源提供的是220V交流電,經(jīng)過門禁系統(tǒng)的電源模塊中變壓器的變壓,變?yōu)橹苯涌梢怨╅T禁使用的電壓,然后進行全波整流,得到有尖峰脈沖的直流電,然后在濾波電路將有交流成分的電壓濾除,最后得到可供系統(tǒng)使用的直流電。但我們的設(shè)計不需要這么大電流,電源直接是用兩節(jié)充電鋰電池18650共7v進行供電,所以不需要用穩(wěn)壓芯片。工作原理圖如圖3.1。

圖3.9 電源模塊原理圖

第4章人臉識別門禁系統(tǒng)軟件設(shè)計

4.1安裝系統(tǒng)

軟件部分:win32 DiskImager、SDFormatter、樹莓派鏡像文件

硬件部分:SD卡、讀卡器

準(zhǔn)備工作

1.16G的SD卡一張(樹莓派3B專用micro SD卡)2.下載樹莓派系統(tǒng)鏡像文件3.Windows下安裝鏡像的工具:Win32DiskImager

安裝實戰(zhàn)

1.解壓下載的系統(tǒng)鏡像壓縮文件,得到img鏡像文件2.將SD卡使用卡托或者讀卡器后,連上電腦3.解壓并運行Win32DiskImager工具4.在軟件中選擇系統(tǒng)鏡像的img文件,“Device”下選擇SD卡的盤符,然后點擊“Write”然后就開始安裝系統(tǒng)了,根據(jù)你的SD卡的速度,安裝過程有快有慢5.安裝結(jié)束后會彈出完成對話框,說明安裝就完成了。

圖4.1 格式化軟件工具

圖4.2系統(tǒng)燒錄軟件工具

首先把SD卡連接到電腦,打開SDFormatter.注意觀察盤符不要誤將其他SD卡格式化。

接下來打開win32 diskimager.打開存放鏡像的路徑,點擊“write” /“yes” 等待鏡像燒錄成功。

圖4.3 燒錄成功提醒界面

圖4.4 樹莓派官方系統(tǒng)Pixel

4.2 配置中文環(huán)境以及擴展文件系統(tǒng)

樹莓派3B默認(rèn)是采用英文字庫的,而且系統(tǒng)里沒有預(yù)裝中文字庫,所以在locale中將其改成中文,也不會顯示中文,只會顯示一堆方塊。因此需要手動來安裝中文字體。

ssh中輸入以下命令:

安裝過程中如果碰到(Y/n),都選擇y中文字庫安裝完成之后,還需要安裝一個中文輸入法。輸入如下命令

一樣的安裝過程,安裝完畢后輸入

然后選擇change_locale,在Default locale for the system environment:中選擇zh_CN.UTF-8,配置完成之后,輸入命令

重啟完成好就可以在VNC連接上去后使用中文顯示和中文輸入法了,切換中文輸入法一樣也是ctrl+space。

圖4.5 樹莓派安裝中文

終端輸入:sudo raspi-config 擴展文件系統(tǒng)

圖4.6 樹莓派擴展文件系統(tǒng)

“Expand Filesystem” 回車后將SD空間擴展(重啟后生效)。配置中文環(huán)境如下所示。

圖4.7 樹莓派設(shè)置中文(一)

圖4.8 樹莓派設(shè)置中文(二)

圖4.9 樹莓派設(shè)置中文(三)

空格選中”zh_CN.UTF-8 “ 回車 “ok” 輸入:sudo reboot 重啟后生效

圖4.10 樹莓派設(shè)置中文(四)

圖4.11 樹莓派設(shè)置中文(五)

4.3 RPI.GPIO搭建及使用介紹

本系統(tǒng)使用的是樹莓派官方系統(tǒng)raspbian。系統(tǒng)預(yù)裝了python和C編譯器等軟件。運行本次系統(tǒng)前需要對環(huán)境進行搭建。樹莓派內(nèi)核中已經(jīng)編譯自帶GPIO的驅(qū)動,本次設(shè)計采用第三方編寫好的庫函數(shù)來完成具體的操作。python GPIO 是一個小型的 python 庫,可以幫助用戶完成 raspberry 相關(guān) IO 口操作,但是 python GPIO 庫還沒有支持 SPI、I2C 或者 1-wire 等總線接口。先安裝 python-dev,輸入以下指令。

sudo apt-get install python-dev

安裝 RPi.GPIO,依次輸入以下指令。

· 下載:$ wget

· 解壓縮:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz

· 進入解壓之后的目錄 :$ cd RPi.GPIO-0.5.3a

· 啟動安裝 :$ sudo python setup.py install

導(dǎo)入 RPi.GPIO 模塊:

通過該操作,可以將模塊名稱映射為 GPIO,以便接下來您其它腳本進行使用。

導(dǎo)入模塊并檢查它是否導(dǎo)入成功,可以嘗試:

針腳編號

目前有兩種方式可以通過 RPi.GPIO 對 Raspberry Pi 上的 IO 針腳進行編號。

第一種方式是使用 BOARD 編號系統(tǒng)。該方式參考 Raspberry Pi 主板上 P1 接線柱的針腳編號。使用該方式的優(yōu)點是無需考慮主板的修訂版本,您硬件始終都是可用的狀態(tài)。您將無需從新連接線路和更改您的代碼。

第二種方式是使用 BCM 編號。這是一種較低層的工作方式 – 該方式參考 Broadcom SOC 的通道編號。使用過程中,您始終要保證主板上的針腳與圖表上標(biāo)注的通道編號相對應(yīng)。您的腳本可能在 Raspberry Pi 主板進行修訂版本更新時無法工作。

指定您所使用的方式(必須指定):

或者

Raspberry Pi 的 GPIO 上可能同時有多個腳本/循環(huán)。因此,如果 RPi.GPIO 檢測到某個針腳被設(shè)置為其它用途而非默認(rèn)的狀態(tài)(默認(rèn)為輸入),您會在嘗試配置某腳本時得到警告消息。禁用該警告消息:

為每個用于輸入或輸出的針腳配置通道。配置為輸入的通道:

通道編號是基于您所使用的編號系統(tǒng)所指定的(BOARD 或 BC)。配置為輸出的通道:

通道編號是基于您所使用的編號系統(tǒng)所指定的(BOARD 或 BCM)??梢灾付ㄝ敵鐾ǖ赖某跏贾担?/p>

輸入讀取 GPIO 針腳的值:

通道編號是基于您所使用的編號系統(tǒng)所指定的(BOARD 或 BCM)。)這將返回 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。

設(shè)置 GPIO 針腳的輸出狀態(tài):

通道編號是基于您所使用的編號系統(tǒng)所指定的(BOARD 或 BCM)。)

狀態(tài)可以為 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。在任何程序結(jié)束后,請養(yǎng)成清理用過的資源的好習(xí)慣。使用 RPi.GPIO 也同樣需要這樣。恢復(fù)所有使用過的通道狀態(tài)為輸入,您可以避免由于短路意外損壞您的 Raspberry Pi 針腳。注意,該操作僅會清理您的腳本使用過的 GPIO 通道。

腳本結(jié)束后進行清理:

4.4 Opencv運行環(huán)境的搭建

首先進入Raspberry Pi系統(tǒng),將樹莓派連上網(wǎng)絡(luò),然后Ctrl + Alt +t打開命令終端(直接點擊終端圖標(biāo)可能會卡),如果終端窗口沒有出現(xiàn)的話,從頂部任務(wù)欄可以找到,點開就好。首先是以下這幾條更新命令,每次單獨執(zhí)行:

sudo apt-get update

sudo apt-get upgrade

sudo rpi-update

然后執(zhí)行安裝opencv的構(gòu)建相關(guān)命令:

sudo apt-get install build-essential git cmake pkg-config

然后是以下這幾條命令安裝圖片工具包,每次單獨執(zhí)行(網(wǎng)上有很多一起執(zhí)行的,但是經(jīng)常出現(xiàn)問題)

sudo apt-get install libjpeg8-dev

sudo apt-get install libtiff5-dev

sudo apt-get install libjasper-dev

sudo apt-get install libpng12-dev

然后是視頻I/O包:

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

下面安裝GTK:

sudo apt-get install libgtk2.0-dev

然后安裝優(yōu)化函數(shù)的包:

sudo apt-get install libatlas-base-dev gfortran

然后執(zhí)行以下命令下載opencv3.0:

cd /home/pi

git clone https://github.com/opencv/opencv.git

cd opencv

git checkout 3.0.0

然后安裝opencv_contrib:

cd /home/pi

git clone https://github.com/opencv/opencv_contrib.git

cd opencv_contrib

git checkout 3.0.0

然后安裝開發(fā)包:

sudo apt-get install python2.7-dev

然后安裝pip: SHAPE * MERGEFORMAT

wget https://bootstrap.pypa.io/get-pip.py

sudo python get-pip.py

然后安裝virtualenv virtualenvwrapper:

sudo pip install virtualenv virtualenvwrapper

sudo rm -rf ~/.cache/pip

下面這個步驟不僅僅是命令了,打開~/.profile文件,我是使用vim打開的:

sudo nano ~/.profile(”~”符號樹莓派鍵盤打不出來 用筆記本SSH連上去)

打開profile后,在這個文件最后,添加以下內(nèi)容后保存退出:

# virtualenv and virtualenvwrapper

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7

export WORKON_HOME=$HOME/.virtualenvs

source /usr/local/bin/virtualenvwrapper.sh

然后執(zhí)行下面這個命令:

source ~/.profile

然后創(chuàng)建虛擬工作環(huán)境并進入:

sudo mkvirtualenv LC

workon LC

一定要確保進去剛剛創(chuàng)建的虛擬環(huán)境了,進入虛擬環(huán)境的標(biāo)志是進去后命令的最前面(綠字前面)都會增加“(LC)”。

下面在虛擬環(huán)境中安裝numpy:

pip install numpy

sudo rm -rf ~/.cache/pip/

pip install numpy

一定確保在剛剛的虛擬環(huán)境下進行以下操作,如果新開了一個命令行窗口,那么就依次執(zhí)行 source ~/.profile 命令和 workon LC 命令進入虛擬環(huán)境再執(zhí)行以下操作。

執(zhí)行以下命令來設(shè)置編譯:

cd ~/opencv

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE

-D CMAKE_INSTALL_PREFIX=/usr/local

-D INSTALL_C_EXAMPLES=ON

-D INSTALL_PYTHON_EXAMPLES=ON

-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules

-D BUILD_EXAMPLES=ON ..

執(zhí)行以下命令開始正式編譯opencv3.0:

make -j4

編譯完后進行安裝:

sudo make install

安裝后進行相關(guān)配置:

sudo ldconfig

配置完成

本次設(shè)計主要利用opencv進行拍照,確實是有點大材小用。但是通過opencv的使用,加深了對圖形處理方面的簡單認(rèn)識和理解。在設(shè)計之余學(xué)會了opencv進行簡易人臉識別的原理。

4.5 系統(tǒng)程序設(shè)計

主程序設(shè)計

流程圖

觸摸開關(guān)

流程圖

攝像頭

流程圖

步進電機

流程圖

第5章系統(tǒng)運行以及源代碼分析

5.1 樹莓派系統(tǒng)使用說明

樹莓派系統(tǒng):可以直接用顯示器進入系統(tǒng)桌面也可以遠(yuǎn)程桌面進入系統(tǒng),或者putty軟件SSH。本設(shè)計以遠(yuǎn)程桌面登陸為例。登陸路由器查詢分配給樹莓派的ip地址。打電腦的遠(yuǎn)程桌面軟件。輸入樹莓派的IP地址,本次設(shè)計中樹莓派的IP是192.168.0.115。用戶名為pi,密碼:raspberry遠(yuǎn)程桌面進去系統(tǒng)后還可以再去連接本地wifi信號。

5.2 曠視FACE++ API使用說明

本次設(shè)計對圖像的處理是通過云服務(wù)來實現(xiàn)的。主要是調(diào)用Face++的API來實現(xiàn)的照片中人臉的對比。首先將三張照片上傳樹莓派或者用樹莓派攝像頭采集三張照片。調(diào)用Detect API進行人臉檢測和人臉分析。識別出的人臉會給出face_token,用于后續(xù)的人臉比對等操作。當(dāng)觸摸開關(guān)出發(fā)實時拍照之后,調(diào)用Search API在Faceset中找出與目標(biāo)人臉最相似的一張或多張人臉。支持傳入face_token或者直接傳入圖片進行人臉?biāo)阉鳌J褂脠D片進行比對時會選取圖片中檢測到人臉尺寸最大的一個人臉。

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 創(chuàng)建FACE++ API key

Detect API

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

Search API

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

成功請求返回值示例:

5.3 系統(tǒng)調(diào)試及運行

整體流程:將三張待檢測人員的照片存儲到程序所在目錄,執(zhí)行程序時,調(diào)用face++的detectAPI將三張照片中的人臉信息存儲在開發(fā)者賬號,然后執(zhí)行search的API對程序過程中拍攝的照片進行處理。檢測照片中的人臉信息與之前上傳的人臉信息對比,如果相似度達(dá)到百分之80以上返回相似度最高的人臉信息。

圖5.2 程序目錄

5.3.1程序初始設(shè)置

首先將自己的照片上傳到本文件夾并修改圖片文件名,然后在代碼中將三張待對比照片賦值給face_one、face_two、face_three三個變量。并設(shè)置進行對比的照片名為customer.jpg。

face_one = 'face_one.jpg'

face_two = 'face_two.jpg'

face_three = 'face_three.jpg'

face_search = 'customer.jpg'

設(shè)置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 = "xzFPqqR1q_fasM1D3s4yvUdcBoTovUMX"

secret = "4GXhLafqDOmnfQRxx-6ZlEVwQpOlZoW-"

api = facepp.API(key, secret)

5.3.2 各功能函數(shù)

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

def bee():

GPIO.output(12, False)

time.sleep(0.5)

GPIO.output(12, True)

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

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)

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

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)

#提示做好準(zhǔn)備 ,一段時間后進行拍照。在終端窗口輸出提示信息。并調(diào)用light()來實現(xiàn)LED發(fā)光二極管的流水燈效果。并調(diào)用bee()讓蜂鳴器發(fā)出提示聲音。

def prep():

print("歡迎使用人臉識別檢測系統(tǒng) 請面對攝像頭 5秒鐘后進行人臉采集")

light()

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

light()

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

light()

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

light()

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

light()

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

bee()

#調(diào)用拍照函數(shù)時流水燈點亮,然后使用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("***********************照片采集完畢 請稍等*************************")

print '=' * 60

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

觸發(fā)檢測的監(jiān)測函數(shù)det(),程序運行時開始檢測觸摸開關(guān)是否被觸發(fā)。當(dāng)觸摸開關(guān)被觸發(fā)時會發(fā)送高電平信號給樹莓派。當(dāng)檢測GPIO13為真時,在終端輸出確定信息,并調(diào)用主函數(shù)進行對比操作。主程序運行結(jié)束后繼續(xù)檢測是否被觸發(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時輸出通過檢測并調(diào)用步進電機轉(zhuǎn)動。

5.3.3異常處理

當(dāng)檢測時由于沒有拍攝到正常的人臉照片,程序則可能由于沒有正常的人臉庫而報錯。此時須將下圖中ret=api……注釋掉,并將上一行的注釋符號“#”取消。

圖5.7 處理報錯信息(一)

保存并上傳后再次運行。清除無用的人臉庫。

然后再將代碼修改為初始代碼,再次進行正確的人臉采集,程序才可以正常運行。

圖5.7 創(chuàng)建一個faceset

這種方式解決報錯是復(fù)雜的一個過程。由于目的只是刪除無用的人臉庫,所以新建了一個debug.py的python文件。當(dāng)檢測失敗之后執(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)建一個Faceset用來存儲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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容