硬件
- 樹莓派4B一個
- CSI攝像頭一個
筆者使用的是樹莓派4B和CSI攝像頭,但是樹莓派3和USB攝像頭等相似設備均可。
百度云智能設置
Step 1 登錄
百度云智能 網址https://cloud.baidu.com/
首先登錄百度賬號,與百度云、百度貼吧等互通,可直接掃碼登錄。如果沒有百度賬號請先自行注冊。
Step 2 實名認證
百度的產品用了這么多年了,想必大家都已經認證過了,沒有認證的讀者現在認證即可,很快。
Step 3 領取免費資源
實名認證之后可以領取免費的智能云資源,一定要領取,否則之后我們測試程序時會報qps不足,不知道在哪領取的話先往后看,后面也會有鏈接。
Step 4 創建應用
鼠標放到右上角的三道橫杠,依次選擇產品服務、人工智能、人臉識別。
進來以后創建應用:
沒有什么特別好說的,都無關乎我們的程序,按自己想的填寫即可:(注意前面沒有領取免費資源的話,可以在這里點擊去領取)
Step 5 下載SDK
創建好應用后回到這個界面,點擊下載SDK,一會兒要用。
本文采用Python語言實現,后續可能會出C++版本的教程,這里先直接選擇Python的SDK:
Step 6 保存關鍵信息、創建組、新建用戶并上傳圖片
下載好后我們進入到應用詳情,首先保存好AppID、API Key、Secret Key三個字段的值,一會兒程序中要用。
保存好后我們點擊左側的“可視化人臉庫”,然后根據頁面提示創建組、創建用戶、并上傳用戶的人臉圖片,這里筆者只上傳了一張自拍照,經測試在正常條件下也是可以識別出本人的。
到這里百度云智能的配置就告一段落了。
樹莓派攝像頭設置及必要視覺庫的安裝
Step 1 樹莓派及攝像頭的硬件安裝及開啟
首先我們將樹莓派和攝像頭安裝好,并通過raspi-config開啟攝像頭權限,不熟悉的同學可以參考博客:樹莓派攝像頭基礎配置及測試
Step 2 安裝必要的視覺庫
安裝picamera,這是樹莓派原生的圖像和攝像頭庫。
pip install picamera
這里假設大家已經安裝好python3。
安裝opencv,筆者的程序中使用opencv庫來做的圖像采集。
sudo apt-get install -y libopencv-dev python3-opencv
如果要使用Python來使用GPIO信號,需要使用RPi.GPIO模塊。如果你使用的是Python2版本,樹莓派默認安裝了RPi.GPIO模塊(python-rpi.gpio)。
目前大多數的人都是使用Python3了,所以我們要手動安裝Python 3版本的模塊。
GPIO在本文中暫時不需要,但是還是安裝一下,以后可以通過GPIO傳輸控制信號玩法有很多,筆者私以為樹莓派最有魅力的一個點就在與除了可以看作一臺電腦,它還帶有豐富的GPIO接口。
sudo apt-get install python3-rpi.gpio
Step 3 安裝百度云智能相關模塊
安裝百度AI模塊
sudo pip install baidu-aip
安裝SDK,將下載好的人臉識別SDK解壓并安裝:
sudo python3 setup.py install
測試
首先創建一個客戶端來訪問百度云智能,這里傳入的參數就是剛才讓大家保存的幾個字段APP_ID, API_KEY, SECRET_KEY
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
以下是核心測試函數,筆者在代碼中做了比較詳細的注釋。
def check():stranger_count = 0while True:img_np = get_image() # opencv讀取圖像img_base64 = image_to_base64(img_np) # 將opencv讀取到的圖像轉base64編碼result = client.search(str(img_base64), 'base64', 'admin'); #在百度云人臉庫中尋找匹配的人臉if result['error_msg'] == 'SUCCESS': # 如果成功了,說明檢測到人,但不一定是成員name = result['result']['user_list'][0]['user_id'] # 獲取名字score = result['result']['user_list'][0]['score'] # 獲取相似度分數# print(name, score)if score > 80: #如果相似度大于80print('檢測到成員:{}, 匹配度:{}'.format(name, score))with open('Log.txt','a') as f:f.write('Person: {},\t score: {:.4f}\t, time: {}\n'.format(name, score, get_curr_time()))time.sleep(2)else:print("檢測到非成員,")name = 'stranger'stranger_count += 1stranger_path = os.path.join(STRANGER_DIR, str(stranger_count)+'.jpg')with open('Log.txt','a') as f:f.write('Person: {},\t saved as: {},\t time: {}\n'.format(name, stranger_path, get_curr_time()))cv2.imwrite(stranger_path, img_np)time.sleep(2)elif result['error_msg'] == 'pic not has face':print('未檢測到人臉')time.sleep(2)else:print(result['error_code']+' ' + result['error_code'])time.sleep(2)
Log.txt文件的部分輸出:
Person: stranger, saved as: strangers/16.jpg, time: Thu Aug 5 19:07:31 2021
Person: stranger, saved as: strangers/17.jpg, time: Thu Aug 5 19:07:34 2021
Person: Song, score: 95.0842 , time: Thu Aug 5 19:07:37 2021
Person: stranger, saved as: strangers/18.jpg, time: Thu Aug 5 19:07:43 2021
stranger是筆者請師哥露臉時的輸出。Song是筆者本人露臉的識別結果及分數。識別的精度還是可以滿足一般日常場景的需要的。
除了與百度之間的接口之外就是一些簡單控制邏輯,大家也可以自行設計一些控制邏輯,根據是否檢測到人臉、檢測到的人臉能否被識別為用戶組里的人臉來配合GPIO做一些控制邏輯,比如開關門、開關燈之類等智能家居,或者人臉識別打卡等。
后續筆者可能會做一個C++語言版的分享。
源碼地址:https://github.com/Adenialzz/Rpi-BaiduSDK/tree/main
有其他報錯或者困惑的朋友歡迎留言交流,有其他有趣的樹莓派或計算機視覺想法的朋友也歡迎留言討論。