郭 瑩,畢思曼
(沈陽工業大學信息科學與工程學院,沈陽110870)
近年來,隨著計算機技術的飛速發展,人機交互逐漸滲透到人們的日常生活中。其中,手勢識別技術可以為人與機器提供更加自然且高效的交互方式,并在手語通信[1]、機器人[2]等領域中發揮重要作用。手勢可以分為靜態手勢和動態手勢,靜態手勢為某一時刻點上手的空間姿勢,包括手型、朝向等,相對獨立,較為簡單;動態手勢大多指參數空間里的一條軌跡,增加了時間信息和動作特征,但由于用戶每次動作的幅度及速度不同,給識別造成了困難。為克服這一問題,在此對動態手勢的識別進行了深入研究。根據動態手勢采集方式的不同,識別方法可以分成基于設備的方法[3-4]和基于視覺的方法[5-6],前者通過設備上的傳感器來獲取手勢信息,相對而言成本昂貴,具有一定的局限性,難以大量推廣,且嚴格來說不能算作是真正意義上的“手勢”識別。后者則直接以手勢作為輸入對象,通過攝像頭采集手勢信息,其優點是對輸入設備要求低且較為便宜,簡單易行,對用戶限制少,人手處于自然狀態,使人能夠以自然的方式與機器進行交互,是手勢識別技術發展的趨勢和目標。故此研究內容為基于視覺的動態手勢識別所展開。
基于視覺的動態手勢識別是指用攝像機采集包含動態手勢的視頻圖像序列,然后分析提取圖像序列中的動態手勢,最后由計算機通過一定的模式識別技術對該動態手勢進行識別。目前對大多數動態手勢的識別即為對手勢運動軌跡的識別,且由于手勢動作與語音信號相似,因此語音識別中常用的方法被應用到動態手勢識別當中。其中具有代表性的方法主要有隱式馬爾可夫模型[7-8](Hidden Markov Models,HMM)和動態時間規整[9](Dynamic Time Warping,DTW)。HMM在訓練階段需要大量的訓練樣本數據,并且需要通過反復計算才能得到模型參數,計算量大;DTW則是一種非線性時間規整模式匹配方法,它無需大量的訓練樣本,但由于沒有一個有效利用統計方法進行訓練的框架,因而算法適應性不強,當樣本數量大時而不適合實時性識別。
在人類視覺系統稀疏機制的啟發下,稀疏表示可用較少的非零元素來揭示出事物的內在結構和本質屬性,基于稀疏表示的分類識別算法受到了足夠的重視,在計算機視覺和模式識別中取得了良好的成果[10-12]。由于輸入信號可以由字典中的原子通過稀疏線性組合來判別性的表示,因此從訓練樣本中學習出一個理想的字典在稀疏表示中顯得尤為重要。在過去的幾年里,已有許多字典學習算法被成功地提出,并應用于各個領域中,如人臉識別[13]、圖像去噪[14]、聚類[15]、圖像超分辨率[16]等。雖然稀疏表示和字典學習已被應用到多個領域,但卻甚少被應用到基于視覺的動態手勢識別當中。對于動態手勢識別,由于用戶每次動作的幅度及速度都會變化,因此待測試的動態手勢樣本一般很難通過原始訓練樣本來很好地表示,然而字典學習可以有效針對這種變化進行建模,從而使得測試樣本可以更好地被字典中的原子來表示。
在眾多的字典學習方法中,LC-KSVD(Label Consist K-SVD)已在很多領域中得到應用[17-19],該方法旨在利用輸入信號的監督信息來學習一個既具有表示能力又具有判別能力的字典;此法可以較好地適應訓練樣本的底層結構,并得到具有嚴格稀疏約束和判別性的稀疏編碼。本研究首次將該方法應用于基于視覺的動態手勢識別,有效地提高了識別準確性并縮短了識別時間。
通過結合稀疏表示理論和LC-KSVD字典學習算法,實現了基于視覺的動態手勢識別過程。所提出的識別方法有效地解決了手勢運動軌跡長短不一的問題,并通過增強手勢類別間的區分性和減少間內差異性,提高了動態手勢的識別效果,且縮短了識別時間,從而實現了魯棒的快速手勢識別。
具體的主要工作在于:
(1)在手勢分割階段,采用結合膚色信息和運動信息的方式實現手勢檢測與分割,有效地解決了臉部、手臂以及類膚色區域對手勢分割的干擾。
(2)在手勢跟蹤階段,在Camshift算法的基礎上加以改進,提出了基于背景差分和Kalman濾波器的Camshift手勢跟蹤算法。該方法將檢測到的手勢區域作為Camshift算法的初始搜索窗,從而實現了Camshift算法的全自動跟蹤;此法在Camshift算法的基礎上,結合Kalman濾波器和背景差分法,有效地解決了當手勢運動速度過快或者手與臉部相離較近時的跟丟問題。
(3)在動態手勢的字典構造上,將每個手勢運動軌跡都表示成字典中的一個列向量,在表示過程中為實現平移不變性以及增強魯棒性,針對用戶每次動作速度不同的問題,做了線性插值處理;針對用戶每次動作幅度不同的問題,做了取均值處理。然后將處理完畢的手勢運動軌跡直接作為原始信號形成原始字典,利用字典的冗余性來捕捉原始信號的自然特征,省卻了傳統方法的特征提取過程。
(4)基于稀疏表示理論,提出一種基于字典學習的識別方法。該方法采用基于類別的字典學習方法來獲得初始化字典,使得字典在初始化階段便具有較強的表示能力;此法為每個動態手勢添加一個唯一的類標簽,并通過預定義的判別性稀疏編碼將標簽信息與字典的原子項緊密關聯,旨在利用標簽信息來學習一個同時具有表示能力和分類判別能力的字典,以此加強手勢類別間的區分性,減少間內的差異性,從而進一步解決用戶在每次做動作時其動作幅度不同的問題,提高了手勢識別的準確性。
所提出的動態手勢識別方法主要包含四個部分:手勢分割、手勢跟蹤、字典學習以及分類識別。具體過程如圖1所示。

圖1 動態手勢識別過程
手勢識別的第一步便是將手從背景圖像中分離出來,即手勢分割。在這一部分,采用計算機視覺中常用的結合膚色信息和運動信息的方法來進行處理。圖2為手勢分割過程。
該過程包含三個部分,具體為:

圖2 手勢分割過程
1.對幀圖像做直方圖均衡化、中值濾波等預處理操作,以達到光照校正和去噪的目的。
2.融合基于YCbCr色彩空間上的膚色信息和混合高斯背景差分法的運動信息,得到粗糙的手勢區域。
3.對粗糙的手勢圖像,利用形態學中的開閉操作及標記連通區域等方法來填充孔洞以及去除小面積連通域,從而得到完整的手部區域。
該過程的核心部分是手勢區域的獲得,選擇的處理方式為將膚色信息與運動信息進行結合。首先,在膚色檢測部分[20],先將RGB圖像轉換成YCbCr色彩空間,對于滿足77≤Cb≤127和133≤Cr≤173的像素值,判定為膚色區域,設置為1,否則為0。手勢分割過程如圖3所示:
圖3(a)為僅采用膚色信息的檢測結果,可以看到在檢測結果中仍存在人臉等膚色區域的干擾。故此采用背景差分法來獲得運動信息,并結合混合高斯模型(Gaussian Mixture Model,GMM)對背景圖像進行實時更新,從而很好地抑制了背景中的動態干擾[21]。圖3(b)為融合了膚色信息和運動信息的較為粗糙的手勢圖像。圖3(c)為經過形態學處理后的完整手勢區域。最后將提取到的手勢位置信息返回給原始圖像,如此便實現了對原始圖像的手勢檢測,返回結果如圖3(d)所示。

圖3 手勢分割過程實際效果圖
手勢跟蹤是指在每幀圖像序列中檢測到手勢的同時對其進行準確的定位。在這一部分,在傳統的Camshift跟蹤算法[22]的基礎上,提出了一個基于背景差分和Kalman濾波器的Camshift手勢跟蹤算法。該方法改進的核心思想為:
1.Camshift算法是一個半自動跟蹤算法,需要人為定位跟蹤目標并初始化搜索窗口,這樣會在實際應用中降低算法的效率并且引入主觀誤差。針對此問題,將手勢進入前景環境的第一幀圖像中的手勢檢測結果作為初始化搜索窗口(具體的檢測方法參見2.1節),有了初始化搜索窗口后便可以對后續圖像序列中的手勢進行自動跟蹤。圖4即為跟蹤結果,其中(a)為手勢未進入環境的圖像,(b)為檢測到的手勢初始化搜索窗口,(c)為算法的自動跟蹤結果。

圖4 手勢自動化跟蹤結果
2.針對當手勢運動速度較快或離臉部較近時的跟丟問題,引入Kalman算法[23]以及背景差分法和膚色模型檢測。以Camshift算法迭代出的手勢質心位置作為Kalman濾波器的觀測向量,再用Kalman濾波器來校正質心位置,加強手勢跟蹤的魯棒性。但是當手離臉部較近時,CamShift算法通常會將人臉作為跟蹤對象,若再由CamShift算法輸出的結果作為觀測向量,顯然不可信,因此針對這種情況,加入了一個判定條件,即當搜索窗內的膚色面積發生劇烈改變時,以初始化手勢搜索窗的方式來重新給出手勢區域,從而來保障手勢跟蹤的連續性和有效性。圖5給出了兩個視頻中的六幀跟蹤結果。


圖5 改進的手勢跟蹤結果
手勢跟蹤模塊的流程示意圖如圖6所示。

圖6 手勢跟蹤流程圖
手勢在運動過程中往往伴隨著有意義的手勢運動和無意義的手勢運動,而想要識別的其實是有意義的動態手勢,因此在實際的手勢跟蹤過程中,需要劃分出有意義的手勢運動,即需要判定出有意義的動態手勢的起止幀位置。
采用兩次靜止法來判定動態手勢的起止幀位置。在連續三幀內若手勢質心點沒有移動,則標記為kstart,繼續跟蹤,直到質心再次靜止時標記為kend,在kstart和kend間的動作則認為是一次有意義的動態手勢,如圖7即為所采用的確認有意義動態手勢起點和終點的方案。

圖7 動態手勢的起止幀檢測方案
圖8為按照上述方式跟蹤得到的有意義的手勢運動軌跡示例。矩形標示框為Camshift算法的搜索窗口。kalman濾波器的預測結果,即跟蹤點,可參見圖3~圖5中的十字標識。

圖8 手勢軌跡跟蹤結果
基于稀疏表示的字典學習在著重于字典良好表示能力(或信號重構能力)的同時,也側重于字典的分類判別能力。稀疏表示分類可以看作是字典學習的一種特殊應用形式,其中字典由原始訓練數據生成。其中一個典型的字典學習算法[24],K-Singular Value Decomposition(K-SVD),旨在最小化重構誤差并同時加強稀疏約束,但卻沒有考慮字典的分類判別能力,因此在K-SVD算法的基礎上,Discriminative K-SVD(D-KSVD)算法[25]和 LC-KSVD 算法[26]被相繼提出,來加強字典的分類能力和判別能力。這類方法的核心是將稀疏編碼直接作為分類器的特征來識別,并借由稀疏編碼的這種判別能力來傳播到整個字典當中,而稀疏編碼的判別能力又取決于字典的質量,因此這類方法的關鍵內容即是如何完成對字典的構造和學習。
對此,主要分為兩個步驟來完成:①動態手勢的字典構造;②基于LC-KSVD算法的字典學習。具體的過程如下:
第一步:動態手勢的字典構造
構建冗余字典是整個稀疏表示理論中的第一步,也是十分重要的一步,若構建出的原始冗余字典可以很好地表達出信號本身的特征,則會更有利于對信號的表示。首先將每個動態手勢都表示為一個列向量,然后將所有這樣的列向量組成一個冗余字典即原始字典。具體表示過程如下:
假設將視頻轉換成圖像序列后共有N幀,每幀手勢的質心點坐標為(Xi,Yi),i=1,2,...,N,這樣便可得到兩個一維向量,X=[X1,X2,...,XN]和Y=[Y1,Y2,...,YN],為了實現平移不變性以及增強魯棒性,需要分別計算這兩個一維向量的均值,即和,之后再用X和Y分別減去各自的均值,如此便可得到兩個新的一維向量Xin=[X1-,X2-,...,XN-]和Yin=[Y1-,Y2-,...,YN-]。
由于不同人做的動作其幅度和速度均不相同,這使得手勢軌跡向量具有不同的維數而字典矩陣要求所有的手勢軌跡向量具有相同的維數,因而需要給向量Xin和Yin做線性插值處理,以獲得具有固定長度M的手勢軌跡向量和,之后再將和交錯寫成一列得到具有固定長度2M的一維向量v=,并以此來表示一個動態手勢樣本。最后,將所有樣本按照上述方式組成一個字典,其中,C表示樣本類別的總數,mC表示第C類手勢的樣本數,vi,j表示第i類手勢中的第j個樣本。
第二步:基于LC-KSVD算法的字典學習
采用LC-KSVD算法進行字典學習,首先分別對每類動態手勢訓練樣本都通過K-SVD算法得到該類的過完備字典,然后再將這些學習過的字典拼接在一起組成一個冗余字典,即為初始化字典。這樣做的好處在于針對每個類進行字典學習后構成的過完備字典能更有效地表示該類,并每個類別的訓練過程可以并行來完成;同時可以保證在最后形成的字典中的元素對每個類來說都是均勻分布的。具體的學習過程如下所示:
1.基于類別的初始化字典學習
令G=[G1,G2,...,GC]表示 類動態手勢的訓練樣本,GC表示來自第C類手勢的所有樣本。對每類動態手勢分別用K-SVD算法進行字典學習,得到對應類別的子字典D1,D2,...,DC。K-SVD算法的目標函數如下所示:

2.進一步學習初始化字典
得到初始化字典D后,便可以進入到下一步的字典學習當中。首先,為每類動態手勢即字典項都添加一個類別標簽,第一類動態手勢的所有樣本的類別標簽為1,第二類動態手勢的所有樣本的類別標簽為2,依次類推,得到一個類標簽矩陣H,在后續的字典學習中,字典項雖然被更新,但其標簽將保持不變。然后,在接下來的字典學習中,引入稀疏編碼誤差項和分類器參數約束項,則待優化的目標函數可以表示為:

其中,第二項為判別性稀疏編碼錯誤項,第三項為分類誤差項,α是調節類標簽一致正則化項與重構誤差項的比例參數,β是分類誤差項在目標函數中的比重,W為分類器的參數,是訓練樣本G的判別性稀疏編碼,當訓練樣本列向量與字典原子項的類別標簽一致時,設置為1,否則為0。舉例說明,假設 D=[d1,d2,...,d6],G=[g1,g2,...,g6],g1、g2和 d1、d2同屬第一類,g3、g4和 d3、d4同屬第二類,g5、g6和d5、d6同屬第三類,則Q可以表示為:A為線性轉換矩陣,其作用是使得AX更加接近判別性稀疏編碼Q,進而加強稀疏編碼的分類判別能力。

為便于優化,將式(2)改寫成式(4):


算法中的參數A和W需要進行初始化,通過使用稀疏編碼矩陣X、判別性稀疏編碼Q以及類標簽矩陣H按照下式進行計算。



此時,輸入待測試的動態手勢樣本gi,先根據下式計算其對應的稀疏編碼xi:


其中,l∈Rm為類標簽向量。
采用普通的單目攝像頭獲取了10種類型的動態手勢,像素為1200萬,平均幀速率為30幀每秒,最大分辨率為720×1280。將攝像頭固定在電腦上,在攝像頭前做動作,手勢視頻平均為5秒,保存為MP4格式。實驗環境為64位的Windows 10操作系統,研究平臺為MATLAB,版本為R2014a。
在實驗中,所定義的數據庫共包含10種類型的動態手勢,具體的動態手勢類別樣式如圖9所示。在收集過程中,首先按照預先設定的動態手勢樣式在單目攝像機前執行這10個動作,其次將每個動態手勢都記錄為視頻,然后按照3.2節所述的方法獲取有意義的手勢運動軌跡,再將這些軌跡按照3.3節所述的方法組合成一個冗余字典即動態手勢樣本庫,該樣本庫內包括訓練樣本庫和測試樣本庫,且二者互不相關。圖8的示例也可作為此收集過程中的具體例子,從圖中可以看到,在實際應用場合中的背景是復雜的,且受膚色影響較大,同時也存在因手勢運動速度較快而發生模糊的現象,此外,即使是同一類動態手勢,對于不同的樣本,其執行的幅度及速度也不盡相同,因此可以認為這個數據庫是有代表性的。

圖9 動態手勢樣本集
在自定義的10類動態手勢樣本集上做測試,將具有相似動作的樣本視為同一類動態手勢,每一類動態手勢包含140個樣本,總共1400份樣本,其中1000份樣本作為訓練樣本集,其余的400份樣本作為測試樣本集。
實驗主要分為兩個階段:①訓練階段;②測試階段。首先在離線的訓練階段中,采用LC-KSVD算法對訓練樣本集進行學習,得到一個較小的且經過優化的過完備字典。其次在測試階段 (如3.4節所述),先輸入需測試的樣本,然后計算該測試樣本在已學習的過完備字典上的稀疏編碼,并將該稀疏編碼直接輸入到分類器當中,從而得到識別結果。
在字典學習當中,有兩個主要參數:字典大小和稀疏因子。首先考慮字典的尺寸大小對識別算法的性能影響。表1為字典尺寸K取值分別為300、400和500時的識別率結果。從表中可以看出,隨著字典尺寸的增大(訓練樣本數增多),算法的識別率也明顯提高,因為樣本數越多,其魯棒性也就越好,分類器的性能也得到加強。而該識別方法在字典尺寸較小時也可以獲得較高的識別率,這意味著在訓練階段可以不需要大量的訓練樣本,K的值越小,所構成的冗余字典也越小,這樣可以減少時間復雜度的計算,也有利于手勢識別的實時性。

表1 不同字典尺寸下的識別率
其次,考慮稀疏因子T對識別率結果的影響。選用字典尺寸K=400來計算稀疏因子T分別為10、20和30時的識別率,其結果如表2所示,從表中可以看出,稀疏因子對手勢的識別結果影響不大。4.3 算法對比結果

表2 不同稀疏因子下的識別率
為驗證LC-KSVD算法的識別性能,針對手勢數據集中的10類手勢,每類手勢選取40份樣本組成測試集,并在字典尺寸為K=200/400/600/800/1000上進行測試,通過與稀疏領域的SRC算法、KSVD算法以及D-KSVD算法相比較,來說明LCKSVD算法的識別性能。為公平起見,在各個算法中選取的參數均相同。對比結果如圖10所示。
圖10(a)為各個算法的識別率對比結果,可以看出,在基于視覺的動態手勢識別中,LC-KSVD算法保持了較高的識別率,并且明顯優于其他三種算法,其主要原因便是經由LC-KSVD算法獲得的稀疏編碼具有更強的判別能力。
圖10(b)為各個算法的識別時間對比結果,可以看出,LC-KSVD的識別時間略短于其他三種算法。因為字典學習是在離線階段完成的,所以此識別時間是在測試階段產生的,即為求解稀疏編碼以及將稀疏編碼送入分類器所用的時間。字典的原子個數直接影響著稀疏編碼的求解時間,而由LC-KSVD算法學習出的字典原子數目會大幅度減少,因此提升了動態手勢的識別速度。

圖10 動態手勢集上的性能對比
為進一步評估LC-KSVD算法的識別效果與實時性,通過與現存的識別算法HMM算法和DTW算法相比較來驗證LC-KSVD算法的識別性能。比較結果如圖11所示。橫坐標為訓練樣本的數量,縱坐標為各個識別算法所對應的識別效果。可以看出,LC-KSVD算法明顯優于另外兩種對比算法,保持了較高的識別率。此外,為驗證LC-KSVD算法的實時性,首先在自定義的手勢集中選取了其中一個動態手勢,然后以200份動態手勢作為訓練樣本,并分別利用LC-KSVD算法、HMM算法和DTW算法在該訓練樣本上識別這個動態手勢,最后通過對比這三種算法的識別時間來驗證此方法的實時性。具體的識別時間如表3所示。

圖11 LC-KSVD與傳統算法的識別率比較

表3 同種手勢下的識別時間
針對傳統的基于視覺的動態手勢識別中魯棒性不強、復雜的特征提取以及實時性問題,提出了一種基于字典學習的動態手勢識別方法。該方法直接對跟蹤到的手勢軌跡進行操作,省卻了傳統方法的特征提取過程,并且可以隨時添加新的手勢類別以及刪除現有的類別。在自定義的10類動態手勢集的數據庫上進行測試,實驗結果驗證了所提出的識別方法的有效性。