Raspberry Pi臉孔辨識藏寶盒

April 8, 2014
Facebook
Twitter

不用記住一連串的密碼、也不用拎著鑰匙跑來跑去,使用你的臉部影像就可以保護藏寶盒裡的寶藏喔!這個專題將會告訴你如何使用Raspberry Pi和它附設的攝影機來製作透過臉孔辨識來解鎖的箱子。
這個專題用到的軟體使用OpenCV的電腦視覺程式庫,而Raspberry Pi是製作這個專題的絕佳平臺,因為它不僅可執行OpenCV,而且體積小到幾乎可以放在任何地方。

這是一個難度中等的專題,需要懂得如何編譯程式,以及在Raspberry Pi上面安裝軟體,如果你有動手作專題的經驗,而且不會害怕指令列的話,只要跟著這篇文章中的步驟,製作這個專題對你來說應該不會有太大的問題。另外,如果製作過程中遇到困難,也可以到Adafruit學習系統上找到更多資訊

值得一提的是,這篇文章提到的專題是最近舉辦的Raspberry Pi專題比賽中其中一個很棒的參賽專題。

零件

Raspberry Pi版本A或B 
Raspberry Pi應該要能執行Raspbian或者Occidentalis作業系統,並且可以在專題製作過程中連接網路。

Raspberry Pi攝影機

木盒子
可以自己做一個,也可以直接去藝品材料店買,請儘量使用可從上面打開的盒子,然後空間要大到足以容納Raspberry Pi。

伺服


4顆裝三號電池座
這要用來做為伺服機的電源。

木條與木釘
可以去藝品材料店找木條和木釘,這是要用來作鎖栓和Raspberry Pi的外殼用的。

按鈕開關
請挑選夠大的按鈕開關,這樣才有辦法裝在盒子側邊。

10 K歐姆電阻器

小型麵包板

漆包線

透明漆或合成酯塗漆
在盒子做好之後塗上一層透明漆雖然不是必要的步驟,但是我們十分推薦你這麼做。

機械螺絲與螺栓


工具

電鑽
手持鋸
木膠與填料
焊鐵與焊料

步驟一:製作藏寶盒
图片

图片

· 在盒子上方鑽一個直徑為7/16″的孔洞,用來放置Raspberry Pi的攝影機。

· 接著,在盒子背後鑽兩個洞,孔洞的大小要可以安裝按鈕與穿過電源線。

 
步驟二:製作鎖栓
图片

图片

图片

· 在盒子前面裝一個卡榫,將用來卡住伺服機轉動的鎖栓。

· 製作一個小的方框來固定Raspberry Pi和驅動鎖栓用的伺服機,可以使用零碎的木塊與螺絲來固定馬達。

· 將兩段木條以正確的角度黏好來製作鎖栓,並用螺絲固定在伺服機上。


步驟三:將藏寶盒組裝完成
图片

· 挑選最佳的位置來固定Raspberry Pi的方框和鎖栓,並確認伺服機可將鎖栓準確地卡到盒子前面的卡榫上。

· 將木條橫跨在蓋子上,並將Raspberry Pi外框固定在木條上。

· 用補土、砂紙來修補木頭的缺損,當然也可以依個人喜好塗上木漆與亮光漆。

步驟四:連接線路
图片

Pushbutton:按鈕/Lock Servo:裝有鎖栓的伺服機/Servo Power:伺服機電源

· 將伺服機的訊號線連接到Raspberry PiGPIO 18號針腳上,而伺服機的電源和接地端則連接到電池座的供電端和接地端。

· 將按鈕的其中一端電線接到Raspberry PiGPIO 25號針腳上,跨接一個10kΩ的電阻再接到Raspberry Pi3.3V針腳上,再將按鈕的另外一端接地。

· 將電池的接地端與Raspberry Pi的接地端連接在一起。

· 將攝影機穿過孔洞裝在盒子的上方,並把導線接到Raspberry Pi上。


步驟五:編譯OpenCV程式

图片

· 這個步驟可以在Raspberry Pi上安裝最新版本的OpenCV ,不幸的是, OpenCV需要由原始碼編譯而來,因為二進位的版本太老了,無法執行這個專題要用的臉孔辨識演算法。所以,要花五個小時左右在Raspberry Pi上編譯OpenCV

· Raspberry Pi的電源打開,然後進入終端機模式。

· 執行以下指令來安裝OpenCV的附加元件:

sudo apt-get update && sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig

· 執行以下指令來下載並打開OpenCV最新版本的原始碼:

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.7/opencv-2.4.7.tar.gz && tar zxvf opencv-2.4.7.tar.gz

· 執行以下指令,將OpenCV的原始碼設定成準備編譯的狀態:

cd opencv-2.4.7 && cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF

· 執行以下指令,開始編譯OpenCV (請注意,此過程大約需要五小時):

Make

· 等到OpenCV編譯完畢之後執行以下指令讓Raspberry Pi開始安裝程式:

sudo make install

· 最後輸入以下指令來安裝一些需要用到的Python附加元件

sudo apt-get install python-pip && sudo pip install picamera && sudo pip install rpio

步驟六:臉孔辨識訓練

图片

· 在這一步驟當中,你需要使用臉孔照片來訓練臉孔辨認演算法,使其可正常打開盒子。

· 請從https://github.com/tdicola/pi-facerec-box(可以點選右邊的連結下載壓縮檔)下載專題需要用到的軟體

· 將檔案解壓縮之後,將檔案內容複製到Raspberry Pi的資料夾中。

· 請在Raspberry Pi的終端機模式中找出軟體所在的路徑位置,並執行以下指令來啟動訓練程式:

sudo python capture-positives.py

· 等到程式開始運作之後,就可以按下盒子上的按鈕,用Raspberry Pi的攝影機拍一張照片,接著,程式會試著偵測照片中的臉孔,並將這張照片以訓練用影像的方式儲存在./training/positive子目錄中。

· 每當程式捕捉了一個影像就會寫入capture.pgm當中,你可以用圖像編輯器開啟這個檔案,來檢視Raspberry Pi擷取到的影像,並確保程式可成功偵測你的臉孔。

· 請用按鈕拍下五張以上的臉孔照片當作訓練程式用的影像。建議你可以試著以不同的角度與不同的光線來拍攝照片,上面是我的訓練用影像。

· 如果有興趣的話,你可以在 ./training/negative 目錄中找到AT&T的臉孔辨識資料庫,裡面有許多照片被程式拿來當作無法打開盒子的影像。

· 最後,等你拍完所有的訓練用影像,就可以執行以下指令,讓程式開始處理正確與錯誤的臉孔影像 ,來訓練臉孔辨識演算法(注意,這個訓練階段大約需要十分鐘左右):

python train.py

步驟七:設定伺服機
图片

图片

·在這一個步驟當中,你需要確認伺服機在上鎖與解鎖兩個位置的脈衝頻寬數值。

·Raspberry Pi和鎖栓的電源都接上後,打開終端機模式 ,請將盒子保持開啟的狀態,這樣才可以看到鎖栓的移動方式,而不至於卡住打不開。

·執行以下指令,以root使用者的權限來啟動互動Python模式(這樣才能連到GPIO針腳並控制伺服機)

sudo python

· Python >>> 提示字元中輸入以下指令來載入RPIO伺服機程式庫

from RPIO import PWM

· 接著請輸入以下指令來新增伺服機物件

servo = PWM.Servo()

· 最後執行以下指令將伺服機上的鎖栓移到中心位置

servo.set_servo(18, 1500)

· set_servo函數中的1500這個參數值代表的是伺服脈衝寬度,單位是毫秒(ms),此參數值可以位在10002000這兩個極值之間。

· 試著在set_servo函數中使用不同的脈衝寬度參數值,如圖所示,慢慢地找到可使鎖栓正確上鎖與解鎖參數值。

·別忘了你可以調整伺服機擺臂的位置,找出更適合的鎖栓位置。

·一旦你確定上鎖與解鎖的脈衝寬度參數值後,請打開專題中根目錄的config.py檔案 ,並用文字編輯器改變以下的數值:

·LOCK_SERVO_UNLOCKED的數值設為解鎖時鎖栓位置的脈衝寬度值,在我的裝置上,我發現數值大約是2000左右。

·LOCK_SERVO_LOCKED 的數值設為上鎖時鎖栓位置的脈衝寬度值,在我的裝置上,我發現數值大約是1100左右。


步驟八:執行藏寶盒程式
图片

· 當臉孔辨識訓練與伺服機刻度校正完成之後,就可以執行藏寶盒程式囉!

· 將電源接到Raspberry Pi和伺服機上,請使用Raspberry Pi的終端機模式,並瀏覽專題的根目錄。

· 執行以下的指令來啟動藏寶盒程式(小心,執行之後,伺服機會立刻回到上鎖的位置):

sudo python box.py

· 等到程式載入訓練資料數據之後(這可能需要幾分鐘),就可以將攝影機面向你的臉,按下按鈕,讓它試著辨認你的臉孔。

· 如果盒子認得你的臉它就會把馬達轉到開鎖的位置;如果你的臉沒有被認出來,那麼終端機模式會顯示這筆資料與訓練用的資料數據有多少差距。

· 如果臉孔要被成功辨識,電腦的辨認信賴指數必須要低於2000,如果你的臉孔與訓練用影像相符,但是信賴指數過高,你可以在config.py (在POSITIVE_THRESHOLD設定中調整門檻數值。如果還是不行,建議你可以試著放入更多訓練用影像,並再次執行訓練程式。這個專題使用的臉孔辨識演算法對光線很敏感,所以,試著將光線維持在訓練階段的亮度(或者也可以加入更多不同光線下的訓練影像)。

· 盒子打開之後,只要再按一次按鈕,盒子就會鎖起來了,上鎖時並不需要用到臉孔辨識。

· 如果你沒有成功辨識臉孔來開啟藏寶盒,可以照著伺服機設定步驟,使用set_servo指令,手動將伺服機移動到開鎖的位置。


[原文]

Social media & sharing icons powered by UltimatelySocial