玩轉樹莓派2017-07-17 18:59
畢業論文
基于微型計算機的人臉識别門禁系統設計



1. 課題意義及目标
随科技的不斷發展,安全性的要求也不斷提高,IC卡等傳統身份識别工具已不能滿足社會需求。是以從通用性、安全性、成熟性和造價性等多方面綜合考慮,研究新的識别工具是一個必然的趨勢。基于人臉識别的門禁系統的設計,能夠提高傳統安保行業的安全性、友善性、直覺性等,最為有效的杜絕了門禁管理中的人為因素,充分展現了門禁管理的人工智能性,避免不必要的安全隐患和人員糾紛。是以本次畢業設計選擇了人臉識别門禁系統的研究與實作,以保證門禁資料的真實性,真正做到安全、友善和直覺的門禁管理,進而進一步提高公司、倉庫、家庭等地的安保水準和管理穩定性。
本次設計将以微型計算機為核心,需選擇合适的電源子產品、檢測子產品、、資料存儲子產品、鍵盤子產品、顯示子產品和聲光報警子產品,完成人臉識别系統的檢測并報警處理的設計。要求能夠将出入門禁系統的人員面部進行識别,能夠在人臉資料比對預存資料庫資料時啟動門禁系統中開門系統,當人臉資料不比對預存資料庫資料時啟動門禁系統中閉門系統,實作防範防盜的作用,創造安全良好的生活工作環境。
2.主要任務
(1)查閱資料,了解人臉識别門禁系統的原理和基本構成,提出系統總體設計方案。
(2)通過學習完成的各個控制硬體電路設計(如檢測子產品,A/D轉換子產品,聲光報警子產品,系統電源子產品等)。
(3)完成人臉識别門禁系統的軟體設計。
(4)完成人臉識别門禁系統的調試、仿真和實物制作。
(5)完成設計說明書。
基于微型計算機(樹莓派)的人臉識别門禁系統
摘 要
随科技的不斷發展,社會不斷的進步,人們的自身安全意識和要求也再不斷提高,IC卡等傳統身份識别工具已不能滿足社會需求。是以從通用性、安全性、成熟性和造價性等多方面綜合考慮,研究新的識别工具是一個必然的趨勢。為能夠提高傳統安保行業的安全性、友善性、直覺性和有效的杜絕了門禁管理中的人為因素,通過人工智能方式,避免不必要的安全隐患和人員糾紛。
提出一種基于微型計算機(樹莓派)的人臉識别門禁系統,該系統通過使用人臉識别雲服務可以實時對人員進行分析辨認,以保證門禁資料的真實性,真正做到安全、友善和直覺的門禁管理,進而進一步提高公司、倉庫、家庭等地的安保水準和管理穩定性。文中較長的描述了該系統的搭建和實作過程,為相關産品提供了一套很好的解決方案。對所設計的系統進行了模拟測試,其測試結果達到了設計目标。
關鍵詞: 微型計算機(樹莓派),人臉識别,雲服務,Python
目錄
第 1 章 緒 論
1.1 研究背景
随着社會的發展,安全教育不斷的深化,人們的安全防範意識也逐漸贈強,這裡面不光包括個人安全,還涉及到了财産和知識産權的保護,安檢的高效,貿易的順利流通等方面的需求增加,這種生物
由此可設計出人臉識别門禁系統的總體結構框圖,如圖2-1所示:

圖2.1 人臉識别門禁系統的總結構框圖
本次設計中測試及最終使用,一直采用Python2.7程式設計語言對微型計算機(樹莓派)系統進行開發和設計,其中人臉識别調用了face++的API, 官網提供了基于Python的SDK,該語言的可讀性高很适合本系統的開發。本系統總體結構圖如上。本地終端為微型計算機(樹莓派),雲服務采用了FACE++人工智能開發平台。
2.2系統主要功能實作
本論文中所設計的系統是對人臉圖像進行處理識别并與門禁系統配合起到安全防盜的基本功能。工作原理是首先将三張待檢測人員的照片存儲到樹莓派檔案系統,執行此段程式時,調用face++的detectAPI将三張照片中的人臉資訊存儲在開發者賬号,然後執行search的API,對現在進行的人臉識别程式中拍攝的照片進行處理,檢測照片中的人臉資訊并與之前上傳的人臉資訊對比,并傳回相似度最高的人臉資訊。我們在程式中隻提取confidence的值,即人臉相似度。當觸摸開關被按下,程式會發出警報LED閃爍,接着進行一張人臉的采集。并将此照片與已經上傳的三張照片做對比。判斷出相似的人臉。當相似度大于70%,則開門(電機正轉開門 、停止并發出警報聲、電機反轉關門)。
系統由微型計算機(樹莓派),驅動子產品,檢測子產品,顯示子產品,報警子產品,電源子產品等組成。系統帶有按鍵,使用者可以通過按鍵觸發人臉識别功能;系統具有采集和檢測人臉功能,可以當進入人員比對成功時,開啟大門,同時報警裝置啟動;當進入人員比對失敗時,大門不開啟以保障安全。
在本設計中,系統主要子產品各自的功能如下:
(1)主要子產品。在本設計中主要起到集中配置設定的作用,不僅需要即時采集人臉圖像,調用API處理圖像,同時還要提供攝像頭檢測、驅動晶片、顯示屏等數字器件的工作信号。
(2)按鍵子產品。系統的輸入部分,實作人機互動。通過接收觸控按鍵的電平資訊,使得微型計算機(樹莓派)得到需要的資料。
(3)驅動子產品。廠門電極作為大門開閉的過程控制的控制元件,其驅動主要由驅動晶片實作。通過操縱大門電機正轉和反轉,實作對大門的開閉控制。
(4)顯示子產品。以連接配接一台電腦顯示器即可
(5)系統電源子產品。系統電源子產品主要負責給系統提供符合要求的電流與電壓,由于微型計算機(樹莓派)使用低壓直流電壓,就需要将兩節锂電池18650電源7V轉換為符合要求的電壓、電流。進而使整個系統有持續的供電保證。[4]
本系統的設計具有半自動門禁系統的特點。待檢測人員需要用手按下觸摸開關,進而觸發人臉識别。系統将對其進行攝像并将圖像發送至雲端服務進行處理,待處理完之後微型計算機(樹莓派)對傳回的比對資料結果進行判斷。如果對比成功,則驅動步進電機開始旋轉。系統的實時性是使用者體驗的關鍵要素,系統正常工作時待識别的人員感覺不到卡頓狀況 ,實時性良好。
第3章人臉識别門禁系統硬體設計
3.1主要子產品

圖3.1 主要模闆實物圖
本次設計的主要子產品是使用微型計算機──樹莓派3代B型主機闆。樹莓派3代B型主機闆,該主要闆子產品的優勢是擁有良好的标準子產品擴充性,主機闆上預留的接口可完美對接與之配套的樹莓派500萬像素專用攝像頭、7英寸液晶觸摸屏、Sense Hat傳感器子產品等。除了可以在愛好者論壇下載下傳網民大神們做好的系統包之外,如今還可以直接購買預裝了樹莓派代3代B型主機闆專用NOOBs系統的MicroSD卡。說到這裡就又促生了樹莓派代3代B型主機闆的進一步優勢,那便是與微軟的結合,微軟為該産品推出了與之适配的Windows 10 IoT版作業系統,使用者可以使用到更加熟悉的UI,使得通過标準擴充子產品和GPIO接口擴充子產品操作變得簡單,IP等協定的配置也變得更加簡單,同時驅動又在不斷更新,不斷完善,是以不用再去考慮重新開發Windows的驅動程式,以上這些與樹莓派代3代B型主機闆的結合,對新入門的玩家以及網際網路開發者來說是意義非凡的。
主要包括以下幾點:
【Raspberry Pi 3 Model B】
· BCM2837
· 64位的1.2GHz四核ARM Cortex-A53
· 1GB記憶體
· 10/100自适應網卡
· 802.11n WiFi無線網卡
· 低功耗藍牙4.1 (BLE)
· HDMI接口
· USB 2.0接口 x 4
· MicroSD 卡插槽
· 3.5 mm 音頻輸出接口
· 40PIN GPIO接口
· CSI攝像頭接口
· DSI顯示接口
· 更新後的電源管理系統,以便使用更多耗電的外設(須用2.5A以上電源供電) 樹莓派3代B型是一款基于ARM的微型計算機主機闆,以SD/MicroSD卡進行存儲,該主機闆提供USB接口和以太網接口,可以連接配接鍵盤、滑鼠和網線,該主機闆具備所有PC的基本功能,例如:高清視訊播放、電子表格書寫、玩遊戲等諸多功能,還整合了視訊模拟信号的電視輸出接口和HDMI高清視訊輸出接口。 樹莓派将Python作為主要程式設計語言,支援Java、BBC BASIC (通過 RISC OS 映像或者Linux的"Brandy Basic"克隆)、C 和Perl等程式設計語言。本設計使用的是最新樹莓派官方系統。是基于debian的一種linux32位作業系統。本次設計使用系統中安裝的python2.7運作程式。
3.2檢測子產品
3.2攝像頭子產品實物圖
本次設計的檢測子產品是使用樹莓派專用500W像素攝像頭。該攝像頭提供了三個應用程式,分别為:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉圖像,而 raspivid 用于捕捉視訊。
應用程式使用了四個 OpenMAX(mmal)元件:camera(攝像)、preview(預覽)、encoder(編碼)、null_sink。所有應用程式均使用了攝像元件,raspistill 使用了圖像編碼元件,raspivid 使用了視訊編碼元件,raspistillyuv 沒有使用編碼元件,而是直接将 YUV 或 RGB 從攝像元件輸出到檔案。所有應用程式均基于指令行方式運作,通過 OpenMAX 的 mmal API 進行編寫。我們在設計中結合Opencv調用攝像頭進行拍照操作。
攝像頭電路闆與樹莓派通過一條 15 芯的排線進行連接配接。具體連接配接操作如下:先将樹莓派上連接配接座兩端卡扣拉起,再把排線插入座中,并豎直,然後按下兩端的卡扣。攝像頭電路闆連接配接同上。
3.3 驅動子產品
當輸入信号相對而言比較微弱時,相應功率較小無法正常工作。驅動子產品實質是通過放大功率,進而滿足負載額定功率使得負載可以正常工作,進而可以響應微弱的輸入信号。微型計算機(樹莓派)上有IN1, IN2, IN3, IN4四個接口,根據資料,設定為低電平就可以驅動,用杜邦線分别将IN1,IN2,IN3,IN4和GPIO 21(Pin 40),GPIO 20(Pin 38), GPIO 16(Pin 36), GPIO 19(Pin 35)進行連接配接。每次将四個GPIO端口按下表依次設定好電平後,可以sleep幾十毫秒來控制轉速
圖3.3 步進電機驅動原理

圖3.4 樹莓派GPIO編碼圖
3.3.1 步進電機工作原理
在不超過額定負載時,脈沖信号的頻率控制電機轉動的速度、脈沖數決定電機止步的位置,均不會因為負載變化而受到任何的影響[8]。步進電機每走一步,就要加一個激磁信号,假如适當的信号,轉子以一定的步數轉動;無激磁信号輸入時,轉子保持一定的位置。步進電機工作的基本原理如下:
(1)換相順序的控制
電機通電後,主要通過脈沖配置設定來實作工作相序的變化。以步進電機四相八拍工作方式為例,要求各相按照A-AB-B-BC-C-CD-D-DA的順序來工作,控制脈沖就要按照該順序來控制A、B、C、D相的通斷。
(2)步進電機轉向的改變
按照既定工作方式正向轉動的順序來給電機通電,電機就會正向轉動;但是按照相反順序來通電的話,電機會向相反方向轉動。
(3)步進電機轉動速度的改變
步進電機每一次接收到一個控制脈沖,它就會相應轉動一步,轉動固定角度。是以步進電機的轉動速度就由兩脈沖的間隔長短來決定,即是兩脈沖發送間隔越長,相應的步進電機轉動就越慢。如果要實作對步進電機轉動速度調節,就需要改變機關時間内控制子產品發出的脈沖個數。
步進電機驅動方法有四相四拍運作方式,即AB-BC-CD-DA-AB;四相八拍運作方式,即A-AB-B-BC-C-CD-D-DA-A。
四相步進電機,供電電源為5伏,5伏電源的正極性端連接配接電機公共端,而 5伏電源的接地端需要分别和電機剩餘的四根控制線順次接觸,可以發現電源地線與電機控制線每接觸一下,步進電機就會轉動一定角度,電機轉動完整一圈的時間,恰好需要如此來回轉動的次數可以達到5次。由此可以計算出該步進電機的步進角度為
度。若四條控制線與電源地線接觸的順序恰好相反,那麼電機也就随之向相反方向轉動。
3.3.2 步進電機驅動電路
由于步進電機的驅動電流的數值相對較高,是以單片機與步進電機不能直接連接配接,常常采用專門的接口及驅動電路。驅動器可以采用功率比較高的複合管,如ULN2003,L298N,或者購買專用的步進電機驅動器。驅動電路的工作狀态是由控制信号來決定的,控制信号需要由主要子產品,即單片機來産生。期望實作以下的步進電機驅動要求:
(1)期望驅動電路提供的電流上升和下降速度可以比較快,這樣可以使電流的波形盡可能的接近矩形波。
(2)期望驅動電路功率和效率相對比較高,提高運作經濟性。
單片機的輸出電流太小,無法直接連接配接步進電機,需要加驅動電路。對于電流小于0.5A的步進電機,可以采用ULN2003類的驅動IC。驅動晶片ULN2003内部結構如圖3.4所示。

圖3.4 ULN2003内部結構框圖
ULN2003是由複合達林頓半導體排列組成,使耐受電壓比較高,允許通過電流較大。共有7對NPN達林頓管,分别為晶片7個控制單元,包括功率驅動單元、保護單元等。ULN2003采用DIP-16或者SOP-16雙列16腳塑膠封裝,驅動單元可以與步進電動機直接耦合,連接配接友善,其數字邏輯電路為非門電路,取反控制。
選取ULN2003作為電機驅動晶片,價格經濟,且可以充分發揮功能,實作穩定驅動。可以直接通過電源來調節輸出電壓,可以直接用單片機的IO口提供信号,而且電路簡單。晶片采用單片機作為控制核心,在程式互相調用的方面,更加的友善靈活。

圖3.5 ULN2003引腳圖
圖3.5所示為驅動器引腳圖,圖左邊1~7引腳為輸入端,有單片機直接控制,接單片機輸出端,引腳8直接接地;右側10~16引腳為輸出端,接步進電機,引腳9接電源+5V,必要時也可以什麼都不接懸空而置,該驅動器可提供最高0.5A的電流。
ULN2003的主要特點是:
(1)驅動ULN2003電流比較大。ULN2003可以較好的用于單片機控制的電路。
(2)ULN2003連接配接上拉電阻,在驅動電機時可以提高其抵抗幹擾的能力。ULN2003的每兩個達林頓管視為一個單元,都會串聯一定阻值的高值電阻可以直接和TTL 或承載電壓為5V的CMOS 裝置連接配接 。
(3)ULN2003的輸出采用集電極開路,電流輸出值比較大,可以達到500mA。是以可以用來驅動電機。
另外,ULN2003的極限參數分别如表3.1、3.2所列。
表3.1 ULN2003的極限參數
表3.2 ULN2003的極限參數
接線時需要把步進電機電路圖的紅色線懸空,其它線接驅動闆。如果驅動不起來,有可能接線不對或電壓低。如果用單片機來控制此步進電機,則隻需分别依次給各線一定時間的脈沖電流,電機便可連續轉動起來。
ULN2003驅動電機的電路圖如下圖3.6所示。由單片機P3.4—P3.7口經上拉電阻作為驅動晶片ULN2003的輸入。COM端供電12V,輸出端10至12引腳均接地。四相五線式步進電機的A、B、C、D四相分别與ULN2003的輸出端1C—4C連接配接,接收控制脈沖,實作控制。
圖3.6 ULN2003驅動電機的電路圖
3.3.3 步進電機的選型
步進電機是一種專門用于位置與速度精确控制的特種電機,雖然同為電機件,步進電機差別于其他控制電機的最大特點是,它主要采用無回報環節的開環控制,将微觀的電脈沖信号轉變為宏觀電機轉動的角位移或線位移。它通過數字來實作電機控制,控制信号以脈沖形式發出,它所接受到的脈沖可以驅使電機轉動,即被轉化為相應的角位移,是以隻要給步進電機一個合适的脈沖信号,它就随之動作固定角度,當采用單片機來控制步進電機相對簡單易操作。繞在定子的線圈配置作為步進電機相數分類的主要依據,主要可分為2相、4相、5相等;根據外部引線步進電機又被分為三線式、五線式、六線式等,但各種類型的電機其控制方法并沒有發生太大的變化,均采用脈沖信号進行驅動。
門禁系統的運動不需要加速、減速過程,所需轉速較低,是以步進電機選用自啟動運作方式。自啟動運作方式是指在驅動電機旋轉和停止時不經過加速、減速階段,而直接以驅動脈沖速度啟動和停止的運作方式。同時,因為在啟動、停止時存在一個突然的速度變化,是以這種方式需要較大的加、減速力矩。由于具體負載重量也會影響其是否産生過大的工作噪音,是以四相五線式步進電機的負載容量可以較好滿足要求。另外,出于對電流、步距角、靜轉矩三大要素的考慮,本設計選擇四相五線式步進電機來模拟門禁系統的控制,可以直接插接友善使用。
3.4 報警子產品
作為人臉識别門禁系統的裝置,聲光報警電路不可或缺。在系統工作中,每當人臉資料比對成功時,便會觸發蜂鳴器和發光二極管實作聲光報警,使監控人員得到開啟大門信号,反之則不報警。半導體二極管和普通二極管都是是類似的PN結結構,具有單向導電性,可以将電能轉化成光能。 在将電流通到發光二極管之後,電子從N區移動到P區,并且從P區移動到N區的空穴在PN結附近與孔中的電子複合,N區域産生熒光發光提醒。
聲光報警設計部分包括蜂鳴器和LED報警訓示燈。聲音報警電路如圖3.11所示,由于微控制器驅動能力的I / O端口較低,是以需要增加蜂鳴器PNP半導體驅動,可以讓那個蜂鳴器的聲音聽起來更響,更好地發揮警報功能。為了避免錯誤的報警添加了三極管基電路,蜂鳴器隻有在輸出低時才會發出聲音。

圖3.8 聲音報警電路原理圖
3.5 顯示子產品
設計中為從一定程度上減小操作人員的工作量,特用電腦顯示器作為顯示子產品,電腦顯示器就不做過多闡述了。
3.6電源子產品
本子產品的作用是用來控制電源是否進入工作狀态。電源子產品一般分為以下幾部分:濾波電路子產品、全波整流電路子產品、電源變壓器子產品等。一般電源提供的是220V交流電,經過門禁系統的電源子產品中變壓器的變壓,變為直接可以供門禁使用的電壓,然後進行全波整流,得到有尖峰脈沖的直流電,然後在濾波電路将有交流成分的電壓濾除,最後得到可供系統使用的直流電。但我們的設計不需要這麼大電流,電源直接是用兩節充電锂電池18650共7v進行供電,是以不需要用穩壓晶片。工作原理圖如圖3.1。
圖3.9 電源子產品原理圖
第4章人臉識别門禁系統軟體設計
4.1安裝系統
軟體部分:win32 DiskImager、SDFormatter、樹莓派鏡像檔案
硬體部分:SD卡、讀卡器
準備工作
1.16G的SD卡一張(樹莓派3B專用micro SD卡)2.下載下傳樹莓派系統鏡像檔案3.Windows下安裝鏡像的工具:Win32DiskImager
安裝實戰
1.解壓下載下傳的系統鏡像壓縮檔案,得到img鏡像檔案2.将SD卡使用卡托或者讀卡器後,連上電腦3.解壓并運作Win32DiskImager工具4.在軟體中選擇系統鏡像的img檔案,“Device”下選擇SD卡的盤符,然後點選“Write”然後就開始安裝系統了,根據你的SD卡的速度,安裝過程有快有慢5.安裝結束後會彈出完成對話框,說明安裝就完成了。

圖4.1 格式化軟體工具

圖4.2系統燒錄軟體工具
首先把SD卡連接配接到電腦,打開SDFormatter.注意觀察盤符不要誤将其他SD卡格式化。
接下來打開win32 diskimager.打開存放鏡像的路徑,點選“write” /“yes” 等待鏡像燒錄成功。

圖4.3 燒錄成功提醒界面

圖4.4 樹莓派官方系統Pixel
4.2 配置中文環境以及擴充檔案系統
樹莓派3B預設是采用英文字庫的,而且系統裡沒有預裝中文字庫,是以在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 擴充檔案系統

圖4.6 樹莓派擴充檔案系統
“Expand Filesystem” 回車後将SD空間擴充(重新開機後生效)。配置中文環境如下所示。

圖4.7 樹莓派設定中文(一)

圖4.8 樹莓派設定中文(二)

圖4.9 樹莓派設定中文(三)
空格選中”zh_CN.UTF-8 “ 回車 “ok” 輸入:sudo reboot 重新開機後生效

圖4.10 樹莓派設定中文(四)

圖4.11 樹莓派設定中文(五)
4.3 RPI.GPIO搭建及使用介紹
本系統使用的是樹莓派官方系統raspbian。系統預裝了python和C編譯器等軟體。運作本次系統前需要對環境進行搭建。樹莓派核心中已經編譯自帶GPIO的驅動,本次設計采用第三方編寫好的庫函數來完成具體的操作。python GPIO 是一個小型的 python 庫,可以幫助使用者完成 raspberry 相關 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
導入 RPi.GPIO 子產品:
通過該操作,可以将子產品名稱映射為 GPIO,以便接下來您其它腳本進行使用。
導入子產品并檢查它是否導入成功,可以嘗試:
針腳編号
目前有兩種方式可以通過 RPi.GPIO 對 Raspberry Pi 上的 IO 針腳進行編号。
第一種方式是使用 BOARD 編号系統。該方式參考 Raspberry Pi 主機闆上 P1 接線柱的針腳編号。使用該方式的優點是無需考慮主機闆的修訂版本,您硬體始終都是可用的狀态。您将無需從新連接配接線路和更改您的代碼。
第二種方式是使用 BCM 編号。這是一種較低層的工作方式 – 該方式參考 Broadcom SOC 的通道編号。使用過程中,您始終要保證主機闆上的針腳與圖表上标注的通道編号相對應。您的腳本可能在 Raspberry Pi 主機闆進行修訂版本更新時無法工作。
指定您所使用的方式(必須指定):
或者
Raspberry Pi 的 GPIO 上可能同時有多個腳本/循環。是以,如果 RPi.GPIO 檢測到某個針腳被設定為其它用途而非預設的狀态(預設為輸入),您會在嘗試配置某腳本時得到警告消息。禁用該警告消息:
為每個用于輸入或輸出的針腳配置通道。配置為輸入的通道:
通道編号是基于您所使用的編号系統所指定的(BOARD 或 BC)。配置為輸出的通道:
通道編号是基于您所使用的編号系統所指定的(BOARD 或 BCM)。可以指定輸出通道的初始值:
輸入讀取 GPIO 針腳的值:
通道編号是基于您所使用的編号系統所指定的(BOARD 或 BCM)。)這将傳回 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。
設定 GPIO 針腳的輸出狀态:
通道編号是基于您所使用的編号系統所指定的(BOARD 或 BCM)。)
狀态可以為 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。在任何程式結束後,請養成清理用過的資源的好習慣。使用 RPi.GPIO 也同樣需要這樣。恢複所有使用過的通道狀态為輸入,您可以避免由于短路意外損壞您的 Raspberry Pi 針腳。注意,該操作僅會清理您的腳本使用過的 GPIO 通道。
腳本結束後進行清理:
4.4 Opencv運作環境的搭建
首先進入Raspberry Pi系統,将樹莓派連上網絡,然後Ctrl + Alt +t打開指令終端(直接點選終端圖示可能會卡),如果終端視窗沒有出現的話,從頂部工作列可以找到,點開就好。首先是以下這幾條更新指令,每次單獨執行:
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
然後執行安裝opencv的建構相關指令:
sudo apt-get install build-essential git cmake pkg-config
然後是以下這幾條指令安裝圖檔工具包,每次單獨執行(網上有很多一起執行的,但是經常出現問題)
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
然後安裝優化函數的包:
sudo apt-get install libatlas-base-dev gfortran
然後執行以下指令下載下傳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
然後安裝開發包:
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後,在這個檔案最後,添加以下内容後儲存退出:
# virtualenv and virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
然後執行下面這個指令:
source ~/.profile
然後建立虛拟工作環境并進入:
sudo mkvirtualenv LC
workon LC
一定要確定進去剛剛建立的虛拟環境了,進入虛拟環境的标志是進去後指令的最前面(綠字前面)都會增加“(LC)”。
下面在虛拟環境中安裝numpy:
pip install numpy
sudo rm -rf ~/.cache/pip/
pip install numpy
一定確定在剛剛的虛拟環境下進行以下操作,如果新開了一個指令行視窗,那麼就依次執行 source ~/.profile 指令和 workon LC 指令進入虛拟環境再執行以下操作。
執行以下指令來設定編譯:
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 ..
執行以下指令開始正式編譯opencv3.0:
make -j4
編譯完後進行安裝:
sudo make install
安裝後進行相關配置:
sudo ldconfig
配置完成
本次設計主要利用opencv進行拍照,确實是有點大材小用。但是通過opencv的使用,加深了對圖形處理方面的簡單認識和了解。在設計之餘學會了opencv進行簡易人臉識别的原理。
4.5 系統程式設計
主程式設計
流程圖
觸摸開關
流程圖
攝像頭
流程圖
步進電機
流程圖
第5章系統運作以及源代碼分析
5.1 樹莓派系統使用說明
樹莓派系統:可以直接用顯示器進入系統桌面也可以遠端桌面進入系統,或者putty軟體SSH。本設計以遠端桌面登陸為例。登陸路由器查詢配置設定給樹莓派的ip位址。打電腦的遠端桌面軟體。輸入樹莓派的IP位址,本次設計中樹莓派的IP是192.168.0.115。使用者名為pi,密碼:raspberry遠端桌面進去系統後還可以再去連接配接本地wifi信号。


5.2 曠視FACE++ API使用說明
本次設計對圖像的處理是通過雲服務來實作的。主要是調用Face++的API來實作的照片中人臉的對比。首先将三張照片上傳樹莓派或者用樹莓派攝像頭采集三張照片。調用Detect API進行人臉檢測和人臉分析。識别出的人臉會給出face_token,用于後續的人臉比對等操作。當觸摸開關出發實時拍照之後,調用Search API在Faceset中找出與目标人臉最相似的一張或多張人臉。支援傳入face_token或者直接傳入圖檔進行人臉搜尋。使用圖檔進行比對時會選取圖檔中檢測到人臉尺寸最大的一個人臉。
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 建立FACE++ API key
Detect API
調用者提供圖檔檔案或者圖檔URL,進行人臉檢測和人臉分析。識别出的人臉會給出face_token,用于後續的人臉比對等操作。請注意,隻對人臉包圍盒面積最大的5個人臉進行分析,其他人臉可以使用Face Analyze API進行分析。如果您需要使用檢測出的人臉于後續操作,建議将對應face_token添加到FaceSet中。如果一個face_token連續72小時沒有存放在任意FaceSet中,則該face_token将會失效。如果對同一張圖檔進行多次人臉檢測,同一個人臉得到的face_token是不同的。
Search API
在Faceset中找出與目标人臉最相似的一張或多張人臉。支援傳入face_token或者直接傳入圖檔進行人臉搜尋。使用圖檔進行比對時會選取圖檔中檢測到人臉尺寸最大的一個人臉。
成功請求傳回值示例:


5.3 系統調試及運作
整體流程:将三張待檢測人員的照片存儲到程式所在目錄,執行程式時,調用face++的detectAPI将三張照片中的人臉資訊存儲在開發者賬号,然後執行search的API對程式過程中拍攝的照片進行處理。檢測照片中的人臉資訊與之前上傳的人臉資訊對比,如果相似度達到百分之80以上傳回相似度最高的人臉資訊。

圖5.2 程式目錄
5.3.1程式初始設定
首先将自己的照片上傳到本檔案夾并修改圖檔檔案名,然後在代碼中将三張待對比照片指派給face_one、face_two、face_three三個變量。并設定進行對比的照片名為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程式中設定調用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 各功能函數
#蜂鳴器,前面已經初始設定GPIO12為輸出模式,此處bee()函數設定gpio12為幹電平,延時0.5s後置為低。意味着當調用bee()函數時蜂鳴器鳴叫0.5s.
def bee():
GPIO.output(12, False)
time.sleep(0.5)
GPIO.output(12, True)
#步進電機,設定旋轉角度為180°,closewise=1時,步進電機順時針旋轉,closewise=0時,步進電機逆時針旋轉。步進電機驅動子產品由樹莓派的GPIO35、 GPIO36、 GPIO38 、GPIO40四個GPIO驅動。
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)
#流水燈:初始設定已經将GPIO11、GPIO15、GPIO16為輸出模式。分别把三個LED發光二極管的長引腳接到這三個GPIO上,短引腳接至負極。通過把對應的引腳置為高電平延時0.3s後置為低,循環點亮三個小燈。
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)
#提示做好準備 ,一段時間後進行拍照。在終端視窗輸出提示資訊。并調用light()來實作LED發光二極管的流水燈效果。并調用bee()讓蜂鳴器發出提示聲音。
def prep():
print("歡迎使用人臉識别檢測系統 請面對攝像頭 5秒鐘後進行人臉采集")
light()
print("************************5*********************")
light()
print("************************4*********************")
light()
print("************************3*********************")
light()
print("************************2*********************")
light()
print("************************1*********************")
bee()
#調用拍照函數時流水燈點亮,然後使用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
#函數調用API将本地存儲的照片進行人臉檢測和人臉分析。識别出的人臉會給出face_token,用于後續的人臉比對等操作。然後調用searchAPI在Faceset中找出與目标人臉最相似的一張或多張人臉。進行比對時會選取圖檔中檢測到人臉尺寸最大的一個人臉。

觸發檢測的監測函數det(),程式運作時開始檢測觸摸開關是否被觸發。當觸摸開關被觸發時會發送高電平信号給樹莓派。當檢測GPIO13為真時,在終端輸出确定資訊,并調用主函數進行對比操作。主程式運作結束後繼續檢測是否被觸發。一直循環指導程式退出。
def det():
while True:
if GPIO.input(13)==True:
print "confirm"
main()
else:
print "NO BODY"
time.sleep(2)
det()
提取API.search傳回結果,并将傳回的資訊儲存到s,并從中提取相似度的值。轉換s[0]["configdence’]為整形變量指派給m。當m大于70時輸出通過檢測并調用步進電機轉動。
5.3.3異常處理

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

圖5.7 處理報錯資訊(一)
儲存并上傳後再次運作。清除無用的人臉庫。
然後再将代碼修改為初始代碼,再次進行正确的人臉采集,程式才可以正常運作。

圖5.7 建立一個faceset
這種方式解決報錯是複雜的一個過程。由于目的隻是删除無用的人臉庫,是以建立了一個debug.py的python檔案。當檢測失敗之後執行一次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)
# 建立一個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()