魏秋月, 劉雨帆
(西安郵電大學(xué) 自動(dòng)化學(xué)院,陜西 西安 710121)
手勢識別是一種人機(jī)交互技術(shù), 通過手部的動(dòng)作直接控制計(jì)算機(jī)的輸入, 和傳統(tǒng)的輸入設(shè)備相比具有自然、直觀、便于學(xué)習(xí)等優(yōu)勢,一直是國內(nèi)外研究的前沿和熱點(diǎn)[1]。如今,手勢識別應(yīng)用熱點(diǎn)領(lǐng)域主要集中在機(jī)器人控制[2,3]、虛擬鼠標(biāo)、體感游戲[4]和PC控制。
傳統(tǒng)的基于單目視覺的手勢識別需要從彩色圖像中分割出手部區(qū)域,容易被光照變化和復(fù)雜背景所影響[5]。深度圖像可以大幅度降低光照變化以及復(fù)雜背景的影響。近年來,微軟公司發(fā)布的Kinect體感設(shè)備使得深度圖像信息的獲取更加高效、便捷,基于Kinect傳感器的手勢識別成為時(shí)下研究熱點(diǎn)[6,7]。
動(dòng)態(tài)手勢識別方法中常用的有動(dòng)態(tài)時(shí)間規(guī)整(dynamic time warping,DTW)算法和隱馬爾科夫模型(hidden Markov model,HMM)等方法[8,9]。HMM算法需要大量的手勢數(shù)據(jù)來進(jìn)行模板訓(xùn)練,在多次訓(xùn)練計(jì)算后獲得合適的模型參數(shù),DTW算法不需要額外的訓(xùn)練,同時(shí)算法簡單、快速且易于實(shí)現(xiàn)。
本文利用Kinect傳感器獲取關(guān)節(jié)點(diǎn)坐標(biāo),采用了一種確定手勢起始和停止的方法,并構(gòu)造矢量特征用于描述手勢的運(yùn)動(dòng)軌跡,使用一種改進(jìn)的DTW算法進(jìn)行模板匹配,實(shí)時(shí)地識別動(dòng)態(tài)手勢,提高了手勢識別的正確率。
Kinect傳感器會根據(jù)不同的人體部位識別出人體的20個(gè)骨骼節(jié)點(diǎn),如圖1所示。
圖1 Kinect實(shí)時(shí)跟蹤的20個(gè)骨骼節(jié)點(diǎn)
為避免復(fù)雜環(huán)境對手勢識別的影響,參照文獻(xiàn)[10]從Kinect傳感器獲取的20個(gè)骨骼節(jié)點(diǎn)中選取手部節(jié)點(diǎn)作為特征參考點(diǎn),手部節(jié)點(diǎn)坐標(biāo)結(jié)合矢量特征數(shù)據(jù)為文的主要研究內(nèi)容之一。
由Kinect獲得一個(gè)點(diǎn)序列,在采集到的點(diǎn)序列中,前后兩幀依次求向量,得到向量序列。由文獻(xiàn)[11]可知,向量序列能夠很好地保存時(shí)序信息和空間信息,克服人與傳感器的相對位置不同帶來的影響。對方向向量做編碼矢量化處理,可以使方向向量序列的表示更加簡化,一定程度上減少模板匹配時(shí)的計(jì)算量。編碼的步驟如下:
1)相鄰兩幀圖像中手節(jié)點(diǎn)的坐標(biāo)記作Q1(x1,y1),Q2(x2,y2)。
2)計(jì)算兩節(jié)點(diǎn)連線的方向角,如式(1)所示
3)對方向角角φ進(jìn)行編碼,結(jié)果用v表示。編碼規(guī)則如式(2)所示,其中mod為取余數(shù)運(yùn)算
4)編碼矢量化。對于任意一個(gè)向量vx,其編碼可以由式(3)確定
fx=argmaxn{vx·en};n=0,1,…,15
(3)
式中 “?”為向量的內(nèi)積運(yùn)算。
模板匹配是將預(yù)識別的手勢和保存好的手勢模板進(jìn)行相似度的對比,把之間相似度較高的模板識別作為識別結(jié)果。本文定義兩個(gè)編碼f1和f2之間的距離為
d(f1,f2)=min{|f1-f2|,16-|f1-f2|};
f1,f2∈{0,1,…,15}
(4)
DTW算法是一種將時(shí)間規(guī)劃與間距測量相結(jié)合的非線性規(guī)整技術(shù),采用動(dòng)態(tài)規(guī)劃(dynamic programming,DP)的算法思想。
考慮幀數(shù)分別為n和m的測試手勢B={b1b2…bn}和參考手勢A={a1a2…am},其中,m和n不一定相等。當(dāng)m=n時(shí),直接計(jì)算兩個(gè)序列的距離即可;當(dāng)m≠n時(shí),不是通過簡單的局部或全局縮放后計(jì)算距離,而是采用動(dòng)態(tài)規(guī)劃的辦法,尋找一條最優(yōu)路徑對A,B兩個(gè)模板序列進(jìn)行匹配。構(gòu)造一個(gè)m×n的矩陣用來存儲B和A各幀之間的距離,即矩陣中為(i,j)的元素表示的是A的第i幀與B的第j幀之間的距離,以dij來表示。求解這兩個(gè)手勢樣本的相似度問題就轉(zhuǎn)變成在該矩陣中尋找一條使得A和B之間距離最小的規(guī)整路徑,該路徑起始于(1,1)終止于(m,n),如圖2所示。
圖2 DTW算法示意
累加距離Dij即為當(dāng)前格的距離dij與可以達(dá)到該點(diǎn)的最小的鄰近元素的累加距離之和,其計(jì)算公式如式(5)
Dij=dij+min{D(i,j-1),D(i-1,j-1),D(i-1,j)}
(5)
2.2.1 增加全局限制條件
DTW算法采用的是逐點(diǎn)匹配的方式來計(jì)算累加距離,并利用動(dòng)態(tài)規(guī)劃的方法來尋找最優(yōu)路徑。文獻(xiàn)[12]中是通過斜率限制(斜率選0.5~2)的方法將搜索區(qū)域限定在一個(gè)平行四邊形區(qū)域,如圖3所示,但在使用DTW算法匹配計(jì)算時(shí),搜索的格點(diǎn)每往前推進(jìn)一格,就要進(jìn)行上下邊界的計(jì)算,計(jì)算量仍然較大,尤其是當(dāng)兩個(gè)匹配的序列較長的時(shí)候,這種重復(fù)性的操作就越多。
圖3 全局路徑限制
文獻(xiàn)[12]中將圖3中的計(jì)算彎折區(qū)域分為3段:(1,Xa),(Xa+1,Xb),(Xb+1,N),由于直線A,B的斜率為2和0.5,得到式(6),計(jì)算得橫坐標(biāo)Xa,Xb如式(7)
Xa,Xb都為整數(shù),得到對M和N的限制條件式(8)
當(dāng)不滿足限制條件時(shí),認(rèn)為兩模板差別太大,無法進(jìn)行匹配。文獻(xiàn)[12]中提出采用這種方法,在X軸上的每一幀數(shù)據(jù)不需要與Y軸上的每一幀數(shù)據(jù)進(jìn)行比較,而只用與Y軸上[ymin,ymax]之間的幀進(jìn)行比較
上述分析一直考慮的是Xa 基于此算法,改進(jìn)經(jīng)典DTW算法:根據(jù)Xa和Xb坐標(biāo),在進(jìn)行算法之前的離線狀態(tài)下,創(chuàng)建一張用于查找的數(shù)據(jù)表并將其保存到系統(tǒng)里,它可以大幅度較小匹配時(shí)間因?yàn)樗淖饔弥饕谴鎯λ阉鞣秶倪吔缰荡笮?。這樣就可以將后面用到的搜索范圍的上下邊界的坐標(biāo)值提前保存到二維數(shù)組里。不用再進(jìn)行之前耗費(fèi)時(shí)間的重復(fù)性計(jì)算,只需要以查找數(shù)據(jù)表的方式即可以完成匹配的過程,在一定程度上提升了DTW的計(jì)算效率。而且由于這張表是在離線狀態(tài)下創(chuàng)建并保存的,使用時(shí)需要耗費(fèi)的時(shí)間非常短,也就是一個(gè)周期指令的時(shí)間。通過這樣的改進(jìn),大大提高了DTW算法路徑匹配速度。 2.2.2 設(shè)定有效匹配閾值 在使用DTW算法進(jìn)行序列相似度匹配時(shí),并計(jì)算兩個(gè)序列匹配時(shí)的累加距離,其距離中的最小值就是有效匹配閾值。當(dāng)符合輸入要求的手勢序列與模板匹配,并且計(jì)算的匹配累加距離為有效匹配閾值時(shí),就認(rèn)為該手勢序列與參考模板中的序列匹配上了,即能正確識別出該動(dòng)態(tài)手勢,可以讓匹配計(jì)算提前結(jié)束,提高了識別效率。 為了驗(yàn)證算法的可行性,搭建了基于Kinect和機(jī)器人操作系統(tǒng)(robot operating system,ROS)的機(jī)器人控制仿系統(tǒng)。機(jī)器人控制仿真系統(tǒng)運(yùn)行在Linux Ubuntu16.04操作系統(tǒng)平臺上,所用ROS版本ROS Kinetic Kame(目前推薦穩(wěn)定使用版本),所用設(shè)備的處理器為Inter?Pentium?CPU G3250 3.20 GHz,安裝內(nèi)存為4GB,程序開發(fā)語言為 C++。 首先,自定義了七種動(dòng)態(tài)手勢,將其與機(jī)器人動(dòng)作一一對應(yīng)。然后創(chuàng)建一個(gè)名為Dynamic-Hand-Gesture的功能包,編寫控制機(jī)器人動(dòng)作的程序存入Dynamic-Hand-Gesture/src/ctrl_speed.cpp文件。控制機(jī)器人運(yùn)動(dòng)的消息為/ctrl_speed話題下,在動(dòng)態(tài)手勢識別后,對每一個(gè)靜態(tài)手勢編碼并通過通信發(fā)布到機(jī)器人運(yùn)動(dòng)的話題中。機(jī)器人根據(jù)接收到的手勢指令與編寫好的程序匹配,然后做出程序中設(shè)定的效果。 圖4中(a)和(b)為機(jī)器人對向左手勢做出左轉(zhuǎn)動(dòng)作和對向右手勢做出右轉(zhuǎn)動(dòng)作。用戶面對 Kinect操作分別做出向左和向右手勢,使用已實(shí)現(xiàn)的動(dòng)態(tài)手勢識別模塊進(jìn)行動(dòng)態(tài)手勢識別,識別完成后通過分布式通信模塊發(fā)布到機(jī)器人運(yùn)動(dòng)的話題,機(jī)器人分別做出向用戶左手和右手操作,即為左轉(zhuǎn)和右轉(zhuǎn)效果。為體現(xiàn)實(shí)驗(yàn)效果,本次實(shí)驗(yàn)首先進(jìn)行向上動(dòng)態(tài)手勢,機(jī)器人由初始位置面向用戶行駛,到開闊區(qū)域分別進(jìn)行左轉(zhuǎn)和右轉(zhuǎn)實(shí)驗(yàn),達(dá)到了預(yù)期的要求。 圖4 機(jī)器人對向左和向右手勢做出反應(yīng) 由表1所示,在機(jī)器人控制系統(tǒng)交互測試中,共運(yùn)行了5次場景來對手勢和識別動(dòng)作進(jìn)行測試和評估,測試結(jié)果顯示,在動(dòng)態(tài)手勢操作過程中,個(gè)別手勢偶爾一兩次不能識別之外,其他手勢均能有效識別,且具有較高的識別率,在識別速率方面,在碰到障礙物時(shí)手勢向上反應(yīng)變緩,機(jī)器人不能迅速識別,其他手勢均能實(shí)時(shí)響應(yīng)。 表1 動(dòng)態(tài)手勢測試結(jié)果 為驗(yàn)證系統(tǒng)的性能,定義了14種常用于人機(jī)交互領(lǐng)域且具有較強(qiáng)方向性變化的手勢,分別為向上、向下、向左、向右4個(gè)日常使用次數(shù)頻繁的手勢和0~9這10個(gè)常用阿拉伯?dāng)?shù)字的手寫手勢,每個(gè)手勢有一個(gè)標(biāo)準(zhǔn)模板,每個(gè)動(dòng)態(tài)手勢進(jìn)行150次識別測試,“向上”手勢識別結(jié)果如圖5所示,所有手勢測試結(jié)果如表2所示。 圖5 采集圖像和識別結(jié)果 表2 手勢識別率表 表2的實(shí)驗(yàn)結(jié)果表明:采用本文改進(jìn)的DTW算法對動(dòng)態(tài)手勢進(jìn)行識別,能獲得較經(jīng)典DTW算法更高的識別率,改進(jìn)后的DTW算法整體平均識別率達(dá)到98.7 %。實(shí)驗(yàn)中,發(fā)現(xiàn)數(shù)字“0”和數(shù)字“9”容易識別錯(cuò)誤,這是因?yàn)槭謱懙南嗨贫容^高,易出現(xiàn)識別錯(cuò)誤的情況。針對這種情況,增加對手勢起始點(diǎn)和終止點(diǎn)的距離判斷能有效區(qū)分?jǐn)?shù)字0和數(shù)字9的手勢。 本文選取兩種實(shí)驗(yàn)條件,一種是光線充足且背景相對簡單,另一種是光線較暗背景相對復(fù)雜,在兩種截然不同的條件下進(jìn)行魯棒性實(shí)驗(yàn),同時(shí)以四個(gè)手勢分別是向上、向下、向左和向右四種手勢為例,在兩種環(huán)境下每種手勢各進(jìn)行100次實(shí)驗(yàn),手勢識別結(jié)果如圖6所示。 圖6 兩種環(huán)境下四種手勢的識別結(jié)果 從圖6中(a)和(b)對比結(jié)果可以發(fā)現(xiàn),本文算法在光線較暗、背景相對復(fù)雜的環(huán)境下依然可以對定義的手勢進(jìn)行準(zhǔn)確地識別。 本文提出一種利用Kinect傳感器結(jié)合改進(jìn)的DTW算法進(jìn)行動(dòng)態(tài)手勢識別的方法。采用了單手舒張和單手收縮表示手勢起始和停止的方法,利用手部節(jié)點(diǎn)結(jié)合矢量特征數(shù)據(jù),使用一種改進(jìn)的DTW方法進(jìn)行動(dòng)態(tài)手勢識別。實(shí)驗(yàn)結(jié)果表明:本文采用的方法不僅對自定義的手勢具有較高的識別率,平均識別率達(dá)到98.7 %,而且在復(fù)雜背景及光照強(qiáng)度變化的環(huán)境下也具有良好的識別效果。3 算法驗(yàn)證
3.1 可行性驗(yàn)證
3.2 識別率驗(yàn)證
3.3 魯棒性驗(yàn)證
4 結(jié) 論