天天看點

200行代碼落地人臉識别開鎖應用

1.案例概述

1.1 背景

2019年國慶,幫朋友實作了一個人臉識别進行開鎖的功能,用在他的真人實景遊戲業務中。幾個月來運作穩定,體驗良好,借着這個春節宅家的時間,整理一下這個應用的實作過程。

總的來說需求描述簡單,但由于限制比較多,在架構與選型上還是花了些心思。

1.2 部署效果

200行代碼落地人臉識别開鎖應用

部署效果

由于該遊戲還線上上服務中,此處就不放出具體操作的視訊了。

1.3 玩家體驗

  • 玩家發現并進入空間後,在顯示屏看到自己在目前場景出鏡的實時畫面。
  • 玩家靠近觀察時,捕獲目前幀進行人臉識别,實時畫面中出現水印字幕“認證中”
  • 人臉認證失敗時,實時畫面水印字幕變更為“認證失敗”,字幕維持2秒後消失,恢複初始狀态。玩家繼續尋找遊戲線索,重新進行認證。
  • 人臉認證成功時,實時畫面水印字幕變更為“認證成功”,并彈開保險箱門。進入後續遊戲環節。

2.産品要求

2.1 需求說明

需求提出時比較明确,核心邏輯不複雜。

  • 人臉識别:通過人臉識别進行鑒權。
  • 開鎖管理:通過鑒權則打開箱門,未通過則保持鎖定。
  • 回報提示:需要有實時視訊回報,指引明确,便于優化玩家體驗。

2.2 限制說明

畢竟是生意,是以在商言商,對實用性和成本要求很高,關鍵是不要影響遊戲過程,同時保證玩家體驗。

  • 低成本:需要低建設成本,低維護成本。
  • 易維護:對維護人員技術水準要求低,出現軟硬體故障時,任意店員可以快速恢複。
  • 高可靠:識别準确率高,容錯能力強,系統持續運作中故障率低。
  • 有限空間:整套系統在去除顯示屏、電磁鎖、保險箱後,其它結構實施空間不能超過20cm*15cm*15cm 體積。
  • 采光不足:實景空間小,有頂光無側光,曝光時間較長。
  • 通用供電:隻提供5V、12V兩種直流電接口。
  • 并行處理:鑒權流程與回報流程并行,鑒權過程中,回報系統不能出現中斷、阻塞等情況,使玩家有明顯的中斷、卡死體驗。
  • 弱網絡環境:由于房間隔斷多,網絡共用,是以網速有限,有突發延遲情況。

2.3 功能設計

可能的架構方案有多種(不同方案間的比較,在文末進行),下面展開說明一下最終上線的方案。

2.3.1 設定流程

流程與效果,請參考 1.3 玩家體驗 部分

2.3.2 可配置内容

  • 騰訊雲密鑰對

修改配置檔案,用于适配騰訊雲賬号切換功能(測試賬号/正式賬号)。

  • 人員庫ID

修改配置檔案,用于指定不同人員庫(測試庫/正式庫)。

  • 水印提示

更換對應圖檔,實作更換水印。使用圖檔管理,而不是文字配置的原因,是由于圖檔配置模式無需字庫支援,無需配置顯示大小,易于圖案嵌入。由于所見即所得,對維護人員要求低。

  • 關機選項

可配置任務完成後,是否自動關機。用于遊戲環境複位準備,減少複位工作量。

2.3.3 營運與維護

  • 系統營運管理

場景啟動時,統一上電。認證通過後,自動關機,完成複位。

  • 故障處理

軟硬體故障:無法開機、可開機無顯示、可開機顯示系統異常,可開機未知異常等等,更換樹莓派或其它硬體。

網絡故障:正常運作,無法認證,可查網絡+查雲日志,解決網絡問題;

雲産品異常:運作4個月,未發生過,可以忽略,如發生則聯系雲售後;

2.3.4 成本分析

  • 硬體成本:500~600元。
  • 備件成本:按1:1備件,500~600元。
  • 運作成本:雲端0元,使用免費額度;電費網費,忽略不計。

3.技術實作

3.1 系統架構

200行代碼落地人臉識别開鎖應用

系統架構

3.1.1 硬體組成:

200行代碼落地人臉識别開鎖應用

硬體組成

  • 樹莓派:終端主要
  • 攝像頭:視訊輸入
  • 傳感器:超音波測距
  • 顯示屏:視訊輸出
  • 繼電器:控制電磁鎖
  • 電磁鎖:控制保險箱門

3.1.2 關鍵特性

  • 圖檔識别:使用圖檔識别,而非視訊流,減少對網絡帶寬要求。
  • 識别要求低:欠曝光照片也有高識别率。
  • 觸發識别:玩家在場景内活動時間長,觸發模式避免了高頻認證、誤開鎖情況,同時降低認證成本。
  • 測距選型:超音波傳感器技術成熟,成本低(3元);雷射傳感器成本高(30元)
  • 多程序:視訊處理與監測鑒權由兩個程序實作,避免了阻塞等情況,同時使用程序間通信,實作可靠互動。

3.2 系統搭建

3.2.1 騰訊雲配置

  • 新增賬號

按文檔指引擷取API密鑰

  • 配置人臉識别

通路官網控制台,通過“建立人員庫->建立人員->上傳照片”,建立認證基礎。

其中所使用的“人員庫ID”是關鍵資訊,用于後續API調用識别時,指定認證動作比對的人員庫。

注:由于此案例隻識别一個人員,無需對人員ID進行比對,故不用指定人員ID。

3.2.2 樹莓派配置

  • 安裝系統

通路 www.raspberrypi.org 擷取鏡像,并進行安裝。注意必須安裝桌面版,否則需要單獨管理HDMI輸出。

  • 配置網絡

進入指令行,執行 "raspi-config",選擇"Network Options",配置WiFi接入點。為了固定IP,編輯 /etc/dhcpcd.conf 檔案,添加配置資訊。

# 具體内容請參考你的本地網絡規劃
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

參考指引文檔,安裝調用騰訊雲API的依賴庫。

sudo apt-get install python-pip -y
pip install tencentcloud-sdk-python           

複制

  • 安裝圖像處理庫

系統預設安裝python2.7,但沒有 opencv 庫,需要安裝。(下載下傳包體積較大,預設源為國外站,比較慢。樹莓派改國内源方法,請自行百度,并挑選離自己近的源站)

sudo apt-get install libopencv-dev -y
sudo apt-get install python-opencv -y           

複制

  • 部署代碼

通路github擷取源碼,将src檔案夾内容,複制到 /home/pi/faceid 下。

更改 /home/pi/faceid/config.json 中的配置資訊,必須改為你的 雲API密鑰(sid/skey)、人員庫ID(facegroupid),其它配置按需調整。

  • 配置自啟動

需要配置圖形界面自啟動,保證視訊輸出由HDMI接口輸出至顯示屏,編輯 /home/pi/.config/autostart/faceid.desktop 寫入如下内容

Type=Application
Exec=python /home/pi/faceid/main.py           

複制

3.2.3 硬體接線

樹莓派GPIO圖示

200行代碼落地人臉識别開鎖應用

GPIO

攝像頭

  • CSI接口
200行代碼落地人臉識别開鎖應用

camera+rpi.png

超音波傳感器

  • TrigPin: BCM-24 / GPIO24
  • EchoPin: BCM-23 / GPIO23
  • VCC :接5V
  • GND :接GND

繼電器

4引腳側 接 樹莓派GPIO引腳

  • VCC :接5V
  • GND/RGND :接GND
  • CH1 : BCM-12 / GPIO12

3端口側 接 電磁鎖

  • 初始狀态為電磁鎖接常閉端。
  • 繼電器原理請參考 3.3.4 硬體相關 部分。

3.2.4 測試運作

完成上述工作後,接電啟動系統,本地回報檢視顯示屏,雲端識别結果可檢視系統日志。

3.3 代碼邏輯與涉及技術

3.3.1 流程僞代碼

# 監測鑒權程序-主程序
擷取應用配置(API ID/Key 等)
初始化GPIO引腳(準備控制 傳感器、繼電器)
啟動視訊管理程序(輔程序)
循環開始:
  if not 測距達到觸發标準:
    continue
  與輔程序通信(捕獲目前幀,并存入指定路徑,并添加“認證中”水印)
  調用雲API,使用該幀圖檔人臉識别
  if 識别成功:
    與輔程序通信(變更水印為“認證成功”)
    等待5秒
    關機 或 繼續運作(由config.json中 su2halt 字段指定)
  else:
    與輔程序通信(變更水印為“認證失敗”)
    等待2秒
  與輔程序通信(清除水印)

# 視訊管理程序-輔程序
初始化攝像頭
循環開始:
  取幀
  取程序間共享隊列
    按消息進行不同操作(幀圖像儲存/加不同水印/不處理)
  輸出幀           

複制

3.3.2 視訊與識别

  • 實時視訊

如上文僞代碼所示,通過逐幀處理,并連續輸出,顯示實時視訊。

  • 觸發識别

測距傳感器确認物體靠近,且0.3秒内距離變化小于2cm,确認為待認證狀态。再延時0.3秒,進行圖像幀捕獲。再次延時的原因是物體停止時,會有扭轉、微調等動作,若直接取幀,會由于采光不足(上文提到的限制)出現模糊情況,是以再次延時,確定捕獲穩定圖像。

  • 人臉識别

請參考文檔介紹。

3.3.3 圖像水印

  • 水印原理

opencv中,提供了多種圖像處理函數,如:圖文處理(圖加字)、圖圖處理(圖間加/減/乘/除/位運算)等等。通過不同的處理方式,可以實作 底圖加字、底圖加圖、掩膜處理等等多種效果。本案例中使用的是基于位運算的掩膜處理方式。

  • 水印圖檔

為了便于維護和更新,本案例中使用圖檔做為水印來源,避免字庫限制,也增大了靈活性,易于在水印中增加圖形,并以分辨率直接定義水印大小,所見即所得。

預設水印圖檔為白底黑字。

  • 水印處理邏輯

為突出水印的浮動效果,将水印圖檔中的黑色區域透明化後,疊加到原始圖檔中。由于字型透明效果,水印字型顔色随基礎視訊變化,效果比較明顯。

源碼說明

# img1為目前視訊幀(底圖),img2為已讀取水印圖
def addpic(img1,img2):
    # 關注區域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)

    # 生成水印區圖像-底圖裁出字型部分,生成水印區最終圖像,替換原圖水印區
    img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
    dst = cv2.add(img1_bg, img2)
    img1[:rows, :cols] = dst
    return img1           

複制

水印效果示意圖(示意圖擴大了水印區,用于突出效果,實際應用方案中水印區較小)

200行代碼落地人臉識别開鎖應用

示意圖.jpg

3.3.4 硬體相關

  • 超音波測距

超音波傳感器(4引腳:VCC、Trig、Echo、GND),Trig端輸出一個大于10μs的高電平,激活發出超音波,并在收到反射波後,Echo端會輸出一個持續高電平,持續時間就是“發波至收波”的時間。

即:測距結果(米)=Echo端高電平時長*340米/2

  • 繼電器

使用的5V繼電器子產品有雙側接線,一側為供電與信号(4引腳,相容3.3V信号),一側為通路開閉管理(3端口)。

繼電器在“通路管理側”實作了一個“單刀雙開關”的模式,通過“供電與信号”側“CH1引腳”的高低電平,控制單刀的方向。

在安裝過程中,電磁鎖供電預設接繼電器常閉端,對繼電器給出信号後,繼電器切換到常開端,則電磁鎖斷電開鎖.

  • GPIO

GPIO(General-purpose input/output 通用輸入輸出),以引腳方式提供硬體間的聯系能力。樹莓派 3B+,有40個GPIO引腳(請參考 3.2.3 硬體接線 中的參考圖示),樹莓派官方作業系統 Raspbian 下,可以使用系統預設安裝的 python 中 RPi.GPIO 庫,進行操作。

4.其它

4.1 方案選型對比

設計的核心在于人臉鑒權子產品,這裡直接影響成本和穩定性,最後選擇了上文方案(平衡成本、維護性及可靠性)。曾經的其它幾種備選人臉識别方案:

4.1.1 本地識别A方案:

使用ESP-EYE晶片,均由晶片完成,依賴ESP-IDF、ESP—WHO,使用C進行開發。

低硬體成本(子產品成本189*2),高開發維護成本(C開發)。

問題:難于更新配置與故障分析處理。适用于大量部署場景。

4.1.2 本地識别B方案:

使用樹莓派直接進行人臉識别,方案成熟,開源代碼豐富。

中硬體成本,低開發成本,高維護成本。

問題:樹莓派負載高,即使用間隔幀算法,也僅維持在20fps以下,卡頓明顯。如進一步調優,受限于個人經驗問題,恐難以保持長期穩定運作。

4.1.3 本地識别C方案:

使用 BM1880邊緣計算開發闆 或其它圖像處理闆,社群口碑不錯,有架構支援。

問題:高硬體成本(子產品成本1000*2),高開發維護成本(C開發)。如果使用算力棒,需要X86_64做基礎平台,成本降低有限,複雜度不變。适用于擴充能力場景。

4.1.4 雲端識别A方案:

使用騰訊雲的視訊智能分析産品,簡化終端架構,使用樹莓派zero推流上雲(後續放出實作方案),即可擷取識别結果,且支援高頻多次檢索等特性。

部署成本低(終端視訊相關子產品150元),營運成本低(目前0.28元/分鐘,按該場景下單次運作20分鐘計算,單次遊戲成本5.6元)

問題:對網絡穩定性依賴大,斷流等情況影響體驗。在本案例的網絡限制下,影響使用效果,更适于網絡條件較好、高頻檢索的應用場景。