玩轉(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()