陳萬澤 陳家禎
(福建師范大學計算機與網(wǎng)絡空間安全學院,福建 福州 350117)
人機交互、機器人技術、虛擬現(xiàn)實、增強現(xiàn)實等領域通過手勢識別這一技術迸發(fā)出無窮的應用潛力[1]。傳統(tǒng)的手勢識別大都需要使用如深度傳感器、紅外傳感器等硬件設備才能達到高精度的要求。無論是通過傳感器還是觸摸屏的推廣運用,人機交互為人們提供了諸多便利。然而,2020年初新冠肺炎疫情的暴發(fā),使得許多日常生活需要觸摸的人機交互產(chǎn)品成了病毒擴散的幫兇,“無接觸式”服務應運而生,成為培育新動能、構筑新優(yōu)勢、搶占產(chǎn)業(yè)制高點的著力點之一。因此,人們需要一種更安全的人機交互方式,如無接觸式查詢、無接觸式導購,文章所提系統(tǒng)通過手勢估計這一技術將人機交互轉變?yōu)闊o接觸式交互,從而可以大幅減少病毒接觸式的傳播風險。
現(xiàn)階段,學術界提出了多種技術來識別基于圖像的手勢,主流的解決方案依靠深度學習框架,摒棄了傳感器對使用場景的限制,解決了在顏色空間中進行凸包檢測的不準確性,并在各種光照條件及各種使用場景下都表現(xiàn)出優(yōu)異的性能。已有研究如CHEVTCHENKO等[2]提出了基于特征融合的CNN網(wǎng)絡,從輸入的手勢圖像中提取Zemike矩、Gabor濾波器及輪廓特征,將上述特征輸入至全連接層上進行融合得到手勢分類。LEE等[3]提出了一種基于腕帶的輪廓特征(wristband-based contour features,WBCFs)用于識別復雜環(huán)境中的靜態(tài)手勢,具體是在雙手腕部添加黑色腕帶,從而準確地分割手部區(qū)域。CHEVTCHENKO等[4]使用多目標遺傳算法對特征和維度的組合進行了優(yōu)化。FANG等[5]使用Fisher向量優(yōu)化局部描述符,并使用支持向量機(SVM)分類器識別手勢,其中局部描述符為手勢輪廓中的角度、距離和曲率特征。BARBHUIYA等[6]從AlexNet和VGGNet的全連接層中提取深度特征,并將其輸入至SVM分類器進行分類,最終實現(xiàn)了手勢識別。
系統(tǒng)采用客戶端-服務端模型,服務器負責手勢視頻流數(shù)據(jù)的解析,客戶端負責顯示數(shù)據(jù)、展示數(shù)據(jù)結果及發(fā)送用戶請求。
該系統(tǒng)選擇C/S模式,客戶端顯示界面開發(fā)采用PyQt5編寫,功能是負責與用戶進行交互,服務器端使用Python進行編寫,負責對手勢視頻數(shù)據(jù)流的處理,最終結果返回至前端調用。
2.1.1 MediaPipe-Hands模型
MediaPipe-Hands[7]模型是高效的手部跟蹤解決方案,其使用機器學習從單個幀中推斷出手的21個骨骼點。模型共有兩個部分組成:手掌檢測器與手部骨骼關節(jié)標注器。相比于檢測面部,手勢估計較為復雜,面部圖像有大面積高對比區(qū)域(如眼睛、嘴巴),而手掌圖像無上述高對比特征,故檢測難度較高。此外,模型需適應各種大小的手掌(跨度約為20倍),同時還要求能夠檢測被遮擋和被自遮擋的剩余部分,故使用下述不同的策略來應對上述問題。
因手掌的輪廓在視頻流中較為穩(wěn)定,故首先對整個圖像進行手掌檢測,通過定向的手邊界框來定位手掌。手掌可以使用正方形邊界框來建模[8],因此可將錨點的數(shù)量減少3~5倍。將精確裁剪的手掌圖像輸入至手部骨骼關節(jié)標注模型可以較大地減少對數(shù)據(jù)增廣(如旋轉、平移和縮放)的需求,并使得整個模型可以將大部分算力用于骨骼關節(jié)定位的準確性。在實時跟蹤的情況下,以往的方案大多需使用前一幀的標注,進而預測出一個邊界框作為當前幀的輸入,使模型在每個幀上都進行檢測,最終造成性能浪費。新方案僅將檢測器應用于第一幀或當手形預測指示手丟失時使用。
2.1.2 PyQt5框架
Qt是一組跨平臺C++庫,其包含的API用于訪問現(xiàn)代桌面和移動系統(tǒng)。PyQt5是針對Qtv5版本的一套全面的Python跨平臺語言實現(xiàn)。在Python中實現(xiàn)了超過35個擴展模塊,每一個PyQt控件都對應一個Qt控件,使得在所有支持Python的平臺可以開發(fā)如C++平臺相同的應用程序。同時,PyQt5還可以嵌入基于C++的應用程序中,以方便不同用戶配置的跨平臺使用。
2.2.1 系統(tǒng)整體流程
該系統(tǒng)實現(xiàn)了手勢識別和手指關節(jié)移動的識別。首先,設置相機識別目標,并設定兩個單點識別結點,分別為食指和中指的指尖和指根,接著設定相應的識別規(guī)則,如圖1所示,啟動密碼解鎖時,當手指指尖觸碰到設定的九宮格區(qū)域附近時,系統(tǒng)會自動記錄觸碰的結點,若觸碰到任意兩個結點系統(tǒng)會自動連線,其中觸碰距離可以自行設置,圖2 為軟件運行畫面,左圖為錄入成功,右圖為重新輸入密碼,當觸碰距離較大時,觸碰靈敏度高,系統(tǒng)判定較為簡單,反之同理。為了保證實驗者手勢密碼指令的復雜度,同時保證系統(tǒng)識別手勢密碼的精度,將系統(tǒng)設置為:任意一個結點只能在當前設置的手勢密碼中出現(xiàn)一次。換言之,設置的指令結點信息,任意一個九宮格代表的結點只能被識別記錄一次。當圖案是解鎖者想要的結果時可以使用“ok”手勢進行確認,此時服務器端的系統(tǒng)會進行判斷,或者打開全手掌形成重新錄入手勢。此外,本作品可以重新錄入手勢密碼,并將密碼上傳至服務器。為了防止顯示保存造成的密碼泄露問題,該系統(tǒng)對輸入的密碼使用AES算法(ECB模式)進行了加密,可以將記錄的手勢密碼錄入成功的向量加工成一些看似無意義的字符串。其中,以手勢密碼錄入的數(shù)據(jù)保存在服務器端的數(shù)據(jù)結構為列表,但在加密過后變成字符串,如可將[0,3,4,5,8,7,6]加密成1a95cce20408cc2efe5f2651ced8c8d4,其中,列表序列為手指觸碰到九宮格的序列。通過對序列加密大幅提高了系統(tǒng)的安全性。為了檢驗本作品的魯棒性,設置了一些現(xiàn)實場景,分別是光線充足與光線昏暗,效果分別如圖3和圖4所示,其中黑色圓點是骨骼結構點,灰色線條為各個骨骼的連線,最終可以看出本系統(tǒng)對于光線具有魯棒性。
圖1 系統(tǒng)流程圖
圖2 軟件運行畫面,左圖為錄入成功,右圖為重新輸入密碼
圖3 光線充足的情況
圖4 光線昏暗的情況
2.2.2 系統(tǒng)手勢判斷
3種不同手勢示意圖如圖5所示,服務器端接收客戶端視頻數(shù)據(jù)流時會判斷用戶手掌是否出現(xiàn),若出現(xiàn)會計算21個手掌各個部位的骨骼節(jié)點,如圖5(a)所示,其中黑色圓點為計算出的骨骼節(jié)點,黑色線條為節(jié)點之間的連線,手掌出現(xiàn)在視頻中時,節(jié)點和連線會跟隨手掌實時移動。計算出的21個骨骼節(jié)點的位置是以整體視頻畫面左上角為原點的二維數(shù)組,通過數(shù)組可以計算骨骼節(jié)點之間構成的角度及距離,進而判斷用戶是否在做系統(tǒng)提前預設好的固定手勢。本系統(tǒng)內(nèi)置了10個不同的手勢,列舉了如圖5(a)的張開手勢、圖5(b)的“ok”手勢、圖5(c)的“手槍”手勢3種。
以圖5(a)為例,詳細介紹系統(tǒng)對手勢的判斷方法。當人做出張開手勢時,四個手指需要伸直且不同手指微微張開,故此時的骨骼節(jié)點滿足以下條件:0~4號骨骼節(jié)點可以分為兩組,第1組為0、1、2號節(jié)點,第2組為2、3、4號節(jié)點,兩組分別可以構成以1號點及3號點為角點,其他兩條線為邊的角。理想情況下,即手指伸直時,兩個角應同時為180°,但考慮到不同用戶的手勢習慣及增加系統(tǒng)魯棒性,系統(tǒng)中將閾值設定為167°,其中的閾值是通過在不同環(huán)境及光線下收集到的同一手勢圖片相同部位的角度平均值。系統(tǒng)中角度是通過不同組的節(jié)點坐標使用余弦定理進行計算,算法步驟如表1所示,通過distance函數(shù)計算輸入的兩個節(jié)點間的距離,接著使用余弦定理計算的角度值,其中,極小值min防止出現(xiàn)如分母為0等計算錯誤。當兩個角同時大于167°時,代表此時由0~4號節(jié)點構成的拇指為伸直狀態(tài),同理可以計算其他手指的狀態(tài),當手指均為伸直狀態(tài)、且手指間的四個角度為25°時,系統(tǒng)將判定手勢為張開手勢。在系統(tǒng)中除了使用角度判定外,還有不同節(jié)點的距離判斷,所有的API內(nèi)部判斷遵循責任鏈的設計原則,通過不同判斷方式的組合及閾值設計,實現(xiàn)不同手勢的實時判別。
表1 骨骼結構點角度算法
圖5 不同手勢示意圖:(a)張開手勢;(b)“ok”手勢;(c)“手槍”手勢
選取不同光照條件、不同受試者性別樣本,不同拍攝設備進行模型魯棒性分析。測試環(huán)境選取實驗室、電梯、室外自然場景。拍攝設備為Spedal 120°廣角攝像頭,模型運行環(huán)境如下:GPU為Nvidia GeForce RTX 2060 (6 GB),CPU為Intel Core i7-10875H八核處理器。視頻幀率為30fps左右。在不同場景的各種光照條件下對該系統(tǒng)進行多次測試,結果顯示,在陽光充足的條件下正確識別率可以達到98%,但在場景較為昏暗時,正確識別率會有所下降,其表現(xiàn)為無法成功定位到手指坐標。對于失敗的情況,經(jīng)過分析發(fā)現(xiàn)原因如下:首先,受膚色的影響,手部在畫面光線比較強烈的區(qū)域會影響識別結果。其次,由于場景某些物體的影響,若畫面中沒有手部,那么模型會有極小的概率將物體誤判為手。再次,受手部拍攝距離的影響,會造成算法對手勢的判斷出現(xiàn)錯誤,建議使用本算法時手部與攝像頭的距離在2 m之內(nèi)效果最好。最后,若手部運動大于一定速度,則可能會出現(xiàn)追蹤不到手勢的情況。
疫情時代背景下,按鈕和觸摸屏等簡單、方便的人機交互方式已經(jīng)成了疫情防控的阻礙。無接觸手勢操作可以減少病毒交叉感染,保證人民的健康安全。近年來,雖然動態(tài)手勢識別算法已經(jīng)取得了長足發(fā)展,但仍存在較大的提升空間。該系統(tǒng)通過模擬手機九宮格解鎖來說明通過無接觸的手勢操作可以完成復雜操作,在不同的光線條件及不同場景中準確進行手勢追蹤和手勢識別。但由于該系統(tǒng)的部署方式比較復雜,未來需要對算法及系統(tǒng)整體流程有較為深入的了解才能根據(jù)實際的使用場景進行調整。