本文主要介紹實現(xiàn)一個人臉識別進行開鎖的功能,用在真人實景游戲業(yè)務(wù)中。
來源:騰訊技術(shù)工程微信號
作者:eckygao,騰訊 CSIG 云產(chǎn)品部
1.案例概述
1.1 背景
實現(xiàn)一個人臉識別進行開鎖的功能,用在他的真人實景游戲業(yè)務(wù)中。總的來說,需求描述簡單,但由于約束比較多,在架構(gòu)與選型上需要花些心思。
1.2 部署效果
由于該游戲還在線上服務(wù)中,此處就不放出具體操作的視頻了。
1.3 玩家體驗
- 玩家發(fā)現(xiàn)并進入空間后,在顯示屏看到自己在當前場景出鏡的實時畫面。
- 玩家靠近觀察時,捕獲當前幀進行人臉識別,實時畫面中出現(xiàn)水印字幕“認證中”
- 人臉認證失敗時,實時畫面水印字幕變更為“認證失敗”,字幕維持 2 秒后消失,恢復(fù)初始狀態(tài)。玩家繼續(xù)尋找游戲線索,重新進行認證。
- 人臉認證成功時,實時畫面水印字幕變更為“認證成功”,并彈開保險箱門。進入后續(xù)游戲環(huán)節(jié)。
2.產(chǎn)品要求
2.1 需求說明
需求提出時比較明確,核心邏輯不復(fù)雜。
- 人臉識別:通過人臉識別進行鑒權(quán)。
- 開鎖管理:通過鑒權(quán)則打開箱門,未通過則保持鎖定。
- 反饋提示:需要有實時視頻反饋,指引明確,便于優(yōu)化玩家體驗。
2.2 約束說明
畢竟是生意,所以在商言商,對實用性和成本要求很高,關(guān)鍵是不要影響游戲過程,同時保證玩家體驗。
- 低成本:需要低建設(shè)成本,低維護成本。
- 易維護:對維護人員技術(shù)水平要求低,出現(xiàn)軟硬件故障時,任意店員可以快速恢復(fù)。
- 高可靠:識別準確率高,容錯能力強,系統(tǒng)持續(xù)運行中故障率低。
- 有限空間:整套系統(tǒng)在去除顯示屏、電磁鎖、保險箱后,其它結(jié)構(gòu)實施空間不能超過 20cm15cm15cm 體積。
- 采光不足:實景空間小,有頂光無側(cè)光,曝光時間較長。
- 通用供電:只提供 5V、12V 兩種直流電接口。
- 并行處理:鑒權(quán)流程與反饋流程并行,鑒權(quán)過程中,反饋系統(tǒng)不能出現(xiàn)中斷、阻塞等情況,使玩家有明顯的中斷、卡死體驗。
- 弱網(wǎng)絡(luò)環(huán)境:由于房間隔斷多,網(wǎng)絡(luò)共用,所以網(wǎng)速有限,有突發(fā)延遲情況。
2.3 功能設(shè)計
可能的架構(gòu)方案有多種(不同方案間的比較,在文末進行),下面展開說明一下最終上線的方案。
2.3.1 設(shè)定流程
流程與效果,請參考 1.3 玩家體驗 部分
2.3.2 可配置內(nèi)容
- 騰訊云密鑰對
修改配置文件,用于適配騰訊云賬號切換功能(測試賬號/正式賬號)。
- 人員庫 ID
修改配置文件,用于指定不同人員庫(測試庫/正式庫)。
- 水印提示
更換對應(yīng)圖片,實現(xiàn)更換水印。使用圖片管理,而不是文字配置的原因,是由于圖片配置模式無需字庫支持,無需配置顯示大小,易于圖案嵌入。由于所見即所得,對維護人員要求低。
- 關(guān)機選項
可配置任務(wù)完成后,是否自動關(guān)機。用于游戲環(huán)境復(fù)位準備,減少復(fù)位工作量。
2.3.3 運營與維護
- 系統(tǒng)運營管理
場景啟動時,統(tǒng)一上電。認證通過后,自動關(guān)機,完成復(fù)位。
- 故障處理
軟硬件故障:無法開機、可開機無顯示、可開機顯示系統(tǒng)異常,可開機未知異常等等,更換樹莓派或其它硬件。
網(wǎng)絡(luò)故障:正常運行,無法認證,可查網(wǎng)絡(luò)+查云日志,解決網(wǎng)絡(luò)問題;
云產(chǎn)品異常:運行 4 個月,未發(fā)生過,可以忽略,如發(fā)生則聯(lián)系云售后;
2.3.4 成本分析
- 硬件成本:500 ~ 600 元。
- 備件成本:按 1:1 備件,500 ~ 600 元。
- 運行成本:云端 0 元,使用免費額度;電費網(wǎng)費,忽略不計。
3.技術(shù)實現(xiàn)
3.1 系統(tǒng)架構(gòu)
3.1.1 硬件組成
- 樹莓派:終端主控
- 攝像頭:視頻輸入
- 傳感器:超聲波測距
- 顯示屏:視頻輸出
- 繼電器:控制電磁鎖
- 電磁鎖:控制保險箱門
3.1.2 關(guān)鍵特性
- 圖片識別:使用圖片識別,而非視頻流,減少對網(wǎng)絡(luò)帶寬要求。
- 識別要求低:欠曝光照片也有高識別率。
- 觸發(fā)識別:玩家在場景內(nèi)活動時間長,觸發(fā)模式避免了高頻認證、誤開鎖情況,同時降低認證成本。
- 測距選型:超聲波傳感器技術(shù)成熟,成本低(3 元);激光傳感器成本高(30 元)
- 多進程:視頻處理與監(jiān)測鑒權(quán)由兩個進程實現(xiàn),避免了阻塞等情況,同時使用進程間通信,實現(xiàn)可靠交互。
3.2 系統(tǒng)搭建
3.2.1 騰訊云配置
- 注冊賬號
- 配置人臉識別
訪問官網(wǎng)控制臺,通過“新建人員庫->創(chuàng)建人員->上傳照片”,建立認證基礎(chǔ)。
其中所使用的“人員庫 ID”是關(guān)鍵信息,用于后續(xù) API 調(diào)用識別時,指定認證動作匹配的人員庫。
注:由于此案例只識別一個人員,無需對人員 ID 進行匹配,故不用指定人員 ID。
3.2.2 樹莓派配置
- 安裝系統(tǒng)
訪問 www.raspberrypi.org 獲取鏡像,并進行安裝。注意必須安裝桌面版,否則需要單獨管理 HDMI 輸出。
- 配置網(wǎng)絡(luò)
進入命令行,執(zhí)行 “raspi-config”,選擇"Network Options",配置 WiFi 接入點。為了固定 IP,編輯 /etc/dhcpcd.conf 文件,添加配置信息。
# 具體內(nèi)容請參考你的本地網(wǎng)絡(luò)規(guī)劃
interface wlan0
static ip_address=192.168.0.xx/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 192.168.0.2
- 安裝騰訊云 SDK
參考指引文檔,安裝調(diào)用騰訊云 API 的依賴庫。
sudo apt-get install python-pip -y
pip install tencentcloud-sdk-python
- 安裝圖像處理庫
系統(tǒng)默認安裝 python2.7,但沒有 opencv 庫,需要安裝。(下載包體積較大,默認源為國外站,比較慢。樹莓派改國內(nèi)源方法,請自行百度,并挑選離自己近的源站)
sudo apt-get install libopencv-dev -y
sudo apt-get install python-opencv -y
- 部署代碼
訪問github獲取源碼,將 src 文件夾內(nèi)容,復(fù)制到 /home/pi/faceid 下。
更改 /home/pi/faceid/config.json 中的配置信息,必須改為你的云 API 密鑰(sid/skey)、人員庫 ID(facegroupid),其它配置按需調(diào)整。
- 配置自啟動
需要配置圖形界面自啟動,保證視頻輸出由 HDMI 接口輸出至顯示屏,編輯
/home/pi/.config/autostart/faceid.desktop 寫入如下內(nèi)容
Type=Application
Exec=python /home/pi/faceid/main.py
3.2.3 硬件接線
樹莓派 GPIO 圖示
攝像頭
- CSI 接口
超聲波傳感器
- TrigPin:BCM-24 / GPIO24
- EchoPin:BCM-23 / GPIO23
- VCC :接 5V
- GND :接 GND
繼電器
4 引腳側(cè) 接 樹莓派 GPIO 引腳
- VCC :接 5V
- GND/RGND :接 GND
- CH1 : BCM-12 / GPIO12
3 端口側(cè) 接 電磁鎖
- 初始狀態(tài)為電磁鎖接常閉端。
- 繼電器原理請參考 3.3.4 硬件相關(guān) 部分。
3.2.4 測試運行
完成上述工作后,接電啟動系統(tǒng),本地反饋查看顯示屏,云端識別結(jié)果可查看系統(tǒng)日志。
3.3 代碼邏輯與涉及技術(shù)
3.3.1 流程偽代碼
# 監(jiān)測鑒權(quán)進程-主進程
獲取應(yīng)用配置(API ID/Key 等)
初始化GPIO引腳(準備控制 傳感器、繼電器)
啟動視頻管理進程(輔進程)
循環(huán)開始:
if not 測距達到觸發(fā)標準:
continue
與輔進程通信(捕獲當前幀,并存入指定路徑,并添加“認證中”水印)
調(diào)用云API,使用該幀圖片人臉識別
if 識別成功:
與輔進程通信(變更水印為“認證成功”)
等待5秒
關(guān)機 或 繼續(xù)運行(由config.json中 su2halt 字段指定)
else:
與輔進程通信(變更水印為“認證失敗”)
等待2秒
與輔進程通信(清除水印)
# 視頻管理進程-輔進程
初始化攝像頭
循環(huán)開始:
取幀
取進程間共享隊列
按消息進行不同操作(幀圖像保存/加不同水印/不處理)
輸出幀
3.3.2 視頻與識別
- 實時視頻
如上文偽代碼所示,通過逐幀處理,并連續(xù)輸出,顯示實時視頻。
- 觸發(fā)識別
測距傳感器確認物體靠近,且 0.3 秒內(nèi)距離變化小于 2cm,確認為待認證狀態(tài)。再延時 0.3 秒,進行圖像幀捕獲。再次延時的原因是物體停止時,會有扭轉(zhuǎn)、微調(diào)等動作,若直接取幀,會由于采光不足(上文提到的約束)出現(xiàn)模糊情況,所以再次延時,確保捕獲穩(wěn)定圖像。
- 人臉識別
請參考文檔介紹。
3.3.3 圖像水印
- 水印原理
opencv 中,提供了多種圖像處理函數(shù),如:圖文處理(圖加字)、圖圖處理(圖間加/減/乘/除/位運算)等等。通過不同的處理方式,可以實現(xiàn)底圖加字、底圖加圖、掩膜處理等等多種效果。本案例中使用的是基于位運算的掩膜處理方式。
- 水印圖片
為了便于維護和更新,本案例中使用圖片做為水印來源,避免字庫約束,也增大了靈活性,易于在水印中增加圖形,并以分辨率直接定義水印大小,所見即所得。
默認水印圖片為白底黑字。
- 水印處理邏輯
為突出水印的浮動效果,將水印圖片中的黑色區(qū)域透明化后,疊加到原始圖片中。由于字體透明效果,水印字體顏色隨基礎(chǔ)視頻變化,效果比較明顯。
源碼說明
# img1為當前視頻幀(底圖),img2為已讀取水印圖
def addpic(img1,img2):
# 關(guān)注區(qū)域ROI-取底圖中將被水印圖編輯的圖像
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]
# 圖片灰化-避免水印圖非純黑純白情況
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 生成掩膜-過濾淺色,位運算取非
ret, mask = cv2.threshold(img2gray, 220, 255, 3) #cv2.THRESH_BINARY
mask_inv = cv2.bitwise_not(mask)
# 生成水印區(qū)圖像-底圖裁出字體部分,生成水印區(qū)最終圖像,替換原圖水印區(qū)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
dst = cv2.add(img1_bg, img2)
img1[:rows, :cols] = dst
return img1
水印效果示意圖(示意圖擴大了水印區(qū),用于突出效果,實際應(yīng)用方案中水印區(qū)較小)
3.3.4 硬件相關(guān)
- 超聲波測距
超聲波傳感器(4 引腳:VCC、Trig、Echo、GND),Trig 端輸出一個大于 10μs 的高電平,激活發(fā)出超聲波,并在收到反射波后,Echo 端會輸出一個持續(xù)高電平,持續(xù)時間就是“發(fā)波至收波”的時間。
即:測距結(jié)果(米)=Echo 端高電平時長*340 米/2
- 繼電器
使用的 5V 繼電器模塊有雙側(cè)接線,一側(cè)為供電與信號(4 引腳,兼容 3.3V 信號),一側(cè)為通路開閉管理(3 端口)。
繼電器在“通路管理側(cè)”實現(xiàn)了一個“單刀雙開關(guān)”的模式,通過“供電與信號”側(cè)“CH1 引腳”的高低電平,控制單刀的方向。
在安裝過程中,電磁鎖供電默認接繼電器常閉端,對繼電器給出信號后,繼電器切換到常開端,則電磁鎖斷電開鎖.
- GPIO
GPIO(General-purpose input/output 通用輸入輸出),以引腳方式提供硬件間的聯(lián)系能力。樹莓派 3B+,有 40 個 GPIO 引腳(請參考 3.2.3 硬件接線 中的參考圖示),樹莓派官方操作系統(tǒng) Raspbian 下,可以使用系統(tǒng)默認安裝的 python 中 RPi.GPIO 庫,進行操作。
4.其它
4.1 方案選型對比
設(shè)計的核心在于人臉鑒權(quán)模塊,這里直接影響成本和穩(wěn)定性,最后選擇了上文方案(平衡成本、維護性及可靠性)。曾經(jīng)的其它幾種備選人臉識別方案:
4.1.1 本地識別 A 方案:
使用 ESP-EYE 芯片,均由芯片完成,依賴 ESP-IDF、ESP—WHO,使用 C 進行開發(fā)。
低硬件成本(模塊成本 189* 2),高開發(fā)維護成本(C 開發(fā))。
問題:難于更新配置與故障分析處理。適用于大量部署場景。
4.1.2 本地識別 B 方案:
使用樹莓派直接進行人臉識別,方案成熟,開源代碼豐富。
中硬件成本,低開發(fā)成本,高維護成本。
問題:樹莓派負載高,即使用間隔幀算法,也僅維持在 20fps 以下,卡頓明顯。如進一步調(diào)優(yōu),受限于個人經(jīng)驗問題,恐難以保持長期穩(wěn)定運行。
4.1.3 本地識別 C 方案:
使用 BM1880 邊緣計算開發(fā)板 或其它圖像處理板,社區(qū)口碑不錯,有框架支持。
問題:高硬件成本(模塊成本 1000*2),高開發(fā)維護成本(C 開發(fā))。如果使用算力棒,需要 X86_64 做基礎(chǔ)平臺,成本降低有限,復(fù)雜度不變。適用于擴展能力場景。
4.1.4 云端識別 A 方案:
使用騰訊云的視頻智能分析產(chǎn)品,簡化終端架構(gòu),使用樹莓派 zero 推流上云(后續(xù)放出實現(xiàn)方案),即可獲取識別結(jié)果,且支持高頻多次檢索等特性。
部署成本低(終端視頻相關(guān)模塊 150 元),運營成本低(當前 0.28 元/分鐘,按該場景下單次運行 20 分鐘計算,單次游戲成本 5.6 元)
問題:對網(wǎng)絡(luò)穩(wěn)定性依賴大,斷流等情況影響體驗。在本案例的網(wǎng)絡(luò)約束下,影響使用效果,更適于網(wǎng)絡(luò)條件較好、高頻檢索的應(yīng)用場景。
更多騰訊AI相關(guān)技術(shù)干貨,請關(guān)注專欄騰訊技術(shù)工程
審核編輯 黃昊宇
-
人工智能
+關(guān)注
關(guān)注
1794文章
47642瀏覽量
239626 -
人臉識別
+關(guān)注
關(guān)注
76文章
4015瀏覽量
82163 -
樹莓派
+關(guān)注
關(guān)注
117文章
1710瀏覽量
105805
發(fā)布評論請先 登錄
相關(guān)推薦
評論