基于 Leap Motion 和卷積神經網(wǎng)絡的手勢識別
0 引 言
傳統(tǒng)人機交互模式大多依賴鍵盤鼠標等直接接觸的設備,但這種交互方式不夠自然有效,已無法滿足人們的需求。人們迫切需要一種更自然、更符合人們生活習慣的交互方式,如語音、意念、手勢等。其中,手勢憑借自然、直觀等特點 [1] 在人機交互中得到廣泛運用,如今手勢識別已成為國內外學者研究的重點。文獻 [2] 利用豪斯多夫(Hausdorff)距離模板匹配的思想實現(xiàn)手勢識別,將模版手勢與待識別手勢進行邊緣特征提取后變換到歐氏空間距離,其最短距離即對應的模版手勢。文獻 [3] 基于 SVM 構造多類分類器的手勢識別,對手勢分別進行一對一、一對多的數(shù)據(jù)分類,SVM算法是在樣本空間或特征空間構造出最優(yōu)超平面 [3],使超平面與樣本數(shù)集合之間的距離最大。文獻 [4] 采用 Kinect 傳感器對手勢圖像進行獲取,采用動態(tài)時間規(guī)整(Dynamic TimeWarping,DTW)的方法將不對齊的兩個序列在某一時刻點進行壓縮,實現(xiàn)兩個點歐氏空間距離最小。文獻 [5] 利用 BP算法訓練多層前饋網(wǎng)絡。
分析上述文獻,發(fā)現(xiàn)以下問題 :
(1)模版匹配的方法無法解決時間可變性問題,識別精度低 ;
(2)基于 SVM 算法對大規(guī)模樣本訓練集的訓練時間較長,難以運用在實際問題中 ;
(3)DTW 存在時間規(guī)整引入誤差的問題,降低了識別精度 ;
(4)采用傳統(tǒng)人工神經網(wǎng)絡結構需要人工對參數(shù)進行提取。
針對以上問題,本文采用卷積神經網(wǎng)絡算法對采集的手勢進行識別。
市面上有兩種深度視覺傳感器 :一種是 Kinect 傳感器,側重于識別人體骨骼,也能識別人臉與人手,但識別人手的精度不高 ;另一種是 Leap Motion 傳感器,能夠采集人體手部的關鍵點信息,故能更好地應用在手勢識別中。
1 Leap Motion 手勢數(shù)據(jù)采集
Leap Motion 是一種采用立體視覺原理的傳感器,內部配備雙攝像頭,如同人眼從不同角度捕捉畫面。骨骼追蹤模型如圖 1 所示,此模型在視野不清晰時能夠預測手指與手的位置,即使手指交叉也可被 Leap Motion 追蹤。當 LeapMotion 檢測到手或桿狀物體時,系統(tǒng)會給 Frame 里的每一個Hand 分配一個唯一的 ID 標識符。Leap Motion 能夠對手部信息進行描述,并在 Hand ::pointable()函數(shù)里提供指尖、關節(jié)點等的位置以及手掌的方向向量、法向量信息 [6],最后將 Leap Motion 采集到的人體手勢數(shù)據(jù)通過 USB 接口傳輸給PC 端。

2 卷積神經網(wǎng)絡
卷積神經網(wǎng)絡(Convolutional Neural Networks,CNN)是一種前饋神經網(wǎng)絡,其神經元可響應一部分覆蓋范圍內的周圍單元,對于大規(guī)模模式識別有著非常好的泛化能力。CNN 還是一個分類器,是一種具有監(jiān)督功能的機器學習工具,與傳統(tǒng)神經網(wǎng)絡相比,避免了對圖像進行復雜的前期預處理,可直接將原始圖像輸入模型,圖像經過卷積層、池化層、全局平均池化層,最后輸出分類圖像結果。CNN 主要用來識別位移、縮放及其他形式扭曲不變性的二維圖像。 CNN 同一特征平面映射面上的神經元權值相同,所以局部權值共享的特殊結構在圖像識別方面有著獨特的優(yōu)越性。
2.1 卷積神經網(wǎng)絡結構
卷積層的作用是對局部進行感知,在原始圖像的一個小區(qū)域上進行特征提取,池化層的作用是將卷積層輸出的特征面繼續(xù)進行特征化。本文選用最大值池化法(Max Pooling),可保留區(qū)域矩陣塊中的最大數(shù)值,忽略其他值,并能提高模型的魯棒性。全局平均池化層的作用是經過若干卷積池化后將所有特征全連接起來組成一個特征向量,這個特征向量更能表達原始圖像 ;Filter(過濾器)的作用是將輸入的圖像劃分為多個區(qū)域,同時 Filter 在映射圖像中的參數(shù)共享,且相互獨立 ;激活函數(shù)的作用是使整個網(wǎng)絡呈現(xiàn)出非線性。本文采用線性整流函數(shù)(Rectified Linear Unit,ReLU),ReLU 函數(shù)可將神經元的一部分輸出為 0,減少參數(shù)之間的關系,有效緩解過擬合情況的發(fā)生。卷積神經網(wǎng)絡結構如圖 2 所示,輸入層為 32×32 通道為 3 的圖像。Filter 尺寸為 5×5,深度為 3。但在實際計算中,存在無法將原始圖像邊界點利用起來的情況,針對此問題可根據(jù)實際情況設定補零的層數(shù)(ZeroPadding)。

2.2 卷積層與池化層
在卷積層中,將第一層的特征圖與卷積核進行卷積,然后通過激活函數(shù)得出卷積層的特征圖,其公式如下 :
式 中:i 表示網(wǎng)絡層數(shù);j 表示特征圖個數(shù);f (*) 表 示激活函數(shù);k 表示卷積核;mj 表示輸入特征圖;b 表示偏置項。
在池化層中,神經元 x 的計算公式如下 :
式中 n 表示從上一層到池化層的窗口大小。池化是對該層輸入 n×n 大小的矩陣區(qū)域加權求和,因此輸出圖像的大小是原來輸入圖像大小的 1 ? n[8]。
3 實驗結果與分析
為了驗證 CNN 算法在手勢識別上具有較好的準確性,確保 Leap Motion 能夠采集到每一個手勢,實驗者需在距離Leap Motion 傳感器正上方 100 mm 處采集 6 種手勢。手勢類別如圖 3 所示,6 個手勢分別代表 1,2,3,4,5,6 這六個數(shù)字,每種手勢采集 200 個樣本,樣本均為 112×112 的手勢像素矩陣,訓練集和測試集各為 1 200 個。訓練前對樣本進行灰度處理,如圖 4 所示。

實驗結果見表 1 所列。手勢 5 的正確率達 96.5%,且識別時間較短 ;但手勢 4 的正確率只有 86%,響應時間較長。由于訓練所用樣本較少,導致復雜手勢識別較低,因此可增加訓練樣本數(shù)量,提高手勢識別的準確性。

4 結 語
本文設計了 6 層卷積神經網(wǎng)絡用于手勢識別,與其他神經網(wǎng)絡相比,由于加入了權重共享原則,因此能夠降低參數(shù)數(shù)目。理論上設計神經網(wǎng)絡層數(shù)越多、節(jié)點越多,在訓練模型上的效果就越好,甚至會達到 100% 的預測精度。但隨之帶來的是模型過擬合,將模型放在測試數(shù)據(jù)上,預測效果嚴重降低。殘差神經網(wǎng)絡是解決此類問題的方法之一,也是未來深度神經網(wǎng)絡算法的又一研究方向。