韓彥鵬,秦飛舟
(寧夏大學(xué)物理與電子電氣工程學(xué)院,寧夏銀川 750021)
隨著科學(xué)技術(shù)的不斷進(jìn)步,人機(jī)交互向著越來越便捷的方向發(fā)展,各種體感設(shè)備都對人機(jī)交互方式產(chǎn)生了巨大影響,人們的生活方式也因人機(jī)交互而發(fā)生改變[1]。在人機(jī)交互技術(shù)領(lǐng)域中,手勢交互正在成為行業(yè)的熱點之一。在手勢交互技術(shù)中,手勢識別算法是最為關(guān)鍵的內(nèi)容。
目前,手勢采集的方式主要有數(shù)據(jù)傳感手套和視覺信息采集兩種。數(shù)據(jù)傳感手套的采集方式為通過在手指、指尖和手背等部位佩戴傳感器,采集手部動作數(shù)據(jù)發(fā)送到電腦端;視覺信息的采集方式為通過攝像頭采集規(guī)定空間領(lǐng)域內(nèi)的信息圖像,發(fā)送到電腦端。
常用的視覺信息采集設(shè)備有Kinect[2]和Leap-Motion[3]兩種。LeapMotion 具有的紅外濾光膜能消除特定場景下光線明暗變化帶來的準(zhǔn)確性偏差問題,對環(huán)境依賴性更小,手部識別的準(zhǔn)確性更高,它的工作距離的范圍為25~600 mm,掃描頻率為每秒200 幀,150°的大視野范圍使其捕捉系統(tǒng)更具有準(zhǔn)確性和應(yīng)用性[4]。文中采用LeapMotion 作為采集工具,圖1 為LeapMotion 拆分結(jié)構(gòu),圖2為LeapMotion工作范圍。
圖1 LeapMotion拆分結(jié)構(gòu)
圖2 LeapMotion工作范圍
LeapMotion 通過對手部節(jié)點位置和運動特征追蹤、定位,完成手部數(shù)據(jù)記錄,手部節(jié)點模型[5]如圖3所示。手部運動特征[6]由指尖方向向量和掌心法向量組成,如圖4 所示。采集到的數(shù)據(jù)以文本格式存儲到指定的文件夾內(nèi)。
圖3 手部節(jié)點模型
圖4 指尖方向向量和掌心法向量
手勢數(shù)據(jù)采集環(huán)境由PC 機(jī)和LeapMotion 設(shè)備組 成。在PC 機(jī)上安裝LeapMotion SDK(Software Development Kit)、Python2.7 編譯器和PyCharm 平臺組成開發(fā)環(huán)境。PC 機(jī)負(fù)責(zé)存儲采集到的手部數(shù)據(jù),LeapMotion 作為手部數(shù)據(jù)采集的硬件。
構(gòu)建的手勢數(shù)據(jù)集設(shè)計了以下五種手勢樣本:剪刀、石頭、布、GOOD、OK,如圖5 所示。通過Python程序完成對五種手勢數(shù)據(jù)的多次收集并建立數(shù)據(jù)集,每種手勢設(shè)置了120 組訓(xùn)練數(shù)據(jù)。
圖5 五種手勢樣本
K-近鄰算法(K-Nearest Neighbor,KNN)是一種基本的分類與回歸算法,1968 年由Cover 和Hart 提出,通過測量不同特征值之間的距離來進(jìn)行分類,具體原理:給定一個訓(xùn)練數(shù)據(jù)集,對新輸入的實例,在訓(xùn)練數(shù)據(jù)集中找到與該實例最鄰近的K個實例,如果這K個實例的多數(shù)屬于某個類,就把該實例歸于這個類[7-8]。如圖6 所示,有A 和B 兩類不同的樣本集,待分類樣本點為C,在與C 相鄰最近的六個點中,A 類有四個,B 類有兩個,由此判定點C 屬于A 類。
圖6 K-近鄰算法分類原理圖
KNN[9]算法以其穩(wěn)定性好、準(zhǔn)確率高等特點受到廣泛應(yīng)用,但其對訓(xùn)練數(shù)據(jù)依賴程度較大。若在訓(xùn)練數(shù)據(jù)集中,有一兩個數(shù)據(jù)是錯誤的,恰好又在需要分類數(shù)值附近,則會導(dǎo)致預(yù)測數(shù)據(jù)不準(zhǔn)確,對訓(xùn)練數(shù)據(jù)的容錯率較低。KNN 算法對于“維數(shù)災(zāi)難”問題也未能很好地解決,由于每個待分類的樣本都要計算它到全部點的距離,根據(jù)距離排序求得K個鄰近點,在面對高維度數(shù)據(jù)(維度不小于2 且擁有多個屬性的數(shù)據(jù))時,分類的準(zhǔn)確性會受到影響。
支持向量機(jī)(Support Vector Machine,SVM)算法是采用結(jié)構(gòu)風(fēng)險最小化準(zhǔn)則設(shè)計的,考慮了經(jīng)驗風(fēng)險和置信范圍[10]。對于非線性問題,通過線性變換轉(zhuǎn)到高維度的特征空間,在高維特征空間[11]中構(gòu)造線性判別函數(shù)來實現(xiàn)訓(xùn)練樣本分類,其算法復(fù)雜度與特征空間的維數(shù)無關(guān),避免了“維數(shù)災(zāi)難”問題。
SVM 算法主要針對有限樣本情況,其目標(biāo)是得到現(xiàn)有信息下的最優(yōu)解,而不僅僅是樣本數(shù)趨于無窮大時的最優(yōu)解,SVM 算法通過學(xué)習(xí),選擇出只占訓(xùn)練樣本集少部分的支持向量,通過SVM 算法處理的數(shù)據(jù),可以得到全局最優(yōu)解。因此SVM 算法可以彌補(bǔ)KNN算法的缺點,文中將利用SVM 算法對KNN 算法進(jìn)行改進(jìn),幫助KNN 算法完成對錯誤和差值較大數(shù)據(jù)的預(yù)處理,改進(jìn)的算法命名為S-KNN算法。
通過對手勢數(shù)據(jù)進(jìn)行歸一化處理來判斷其是否在探測范圍內(nèi),若在范圍內(nèi)則輸入SVM 算法進(jìn)行下一步手勢數(shù)據(jù)篩選,若不在探測范圍內(nèi)則舍棄數(shù)據(jù)。手勢數(shù)據(jù)通過算法處理后再次判斷是否為良好的手勢數(shù)據(jù),良好數(shù)據(jù)的標(biāo)準(zhǔn)為:
1)若手勢數(shù)據(jù)節(jié)點(真實風(fēng)險值)與算法預(yù)測值(經(jīng)驗風(fēng)險最優(yōu)值)相差超過10%,則舍棄該節(jié)點。
2)若兩節(jié)點(或兩個節(jié)點以上)在空間位置重合,則去除重合節(jié)點。
滿足以上兩個條件,則判斷為良好的手勢數(shù)據(jù),輸入給下一層級的KNN 算法處理。通過兩次判斷去除不必要的和錯誤的三維坐標(biāo)信息[12],使數(shù)據(jù)具有更好的訓(xùn)練性和準(zhǔn)確性。利用KNN 算法進(jìn)行手勢識別計算,測定哪些手指是張開的,哪些是蜷縮的,通過其蜷縮的程度[13]計算出最終結(jié)果。例如需要判斷一個剪刀的手勢,就需要判斷大拇指、無名指和小拇指是蜷縮的,食指和中指是伸開的。通過輸出結(jié)果來驗證S-KNN 算法的魯棒性[14]和有效識別率,S-KNN 算法流程如圖7 所示。
圖7 S-KNN算法流程
如圖8 所示,S-KNN 算法與基于歐式距離的KNN 算法[15]的平均識別率隨著K值變化的對比圖中,線S-KNN-Feature 代表S-KNN 算法的平均識別率,線KNN-EU-Feature 代表基于歐式距離的KNN算法的平均識別率,橫軸代表K的取值,縱軸為識別準(zhǔn)確率。隨著K值的變化二者的識別率有著不同程度的波動,從實驗結(jié)果可以看出,S-KNN 算法對手勢的平均識別率要遠(yuǎn)遠(yuǎn)高于基于歐式距離的KNN算法的平均識別率,當(dāng)K等于10 時,S-KNN 算法對手勢的平均識別率達(dá)到最高,約為97%,而基于歐式距離的KNN算法對手勢的平均識別率只有78.8%左右。
圖8 S-KNN算法與基于歐式距離的KNN算法識別率對比圖
如圖9 所示,S-KNN 算法與基于曼哈頓距離的KNN 算法[16]的平均識別率隨著K 值變化的對比圖中,線S-KNN-Feature 代表S-KNN 算法的平均識別率,線KNN-MA-Feature 代表基于曼哈頓距離的KNN 算法的平均識別率,從實驗結(jié)果可以看出,SKNN 算法對手勢的平均識別率仍遠(yuǎn)高于基于曼哈頓距離的KNN 算法的平均識別率,當(dāng)K等于10~13 時,S-KNN 算法對手勢的平均識別率達(dá)到97%左右,而基于曼哈頓距離的KNN 算法對手勢的平均識別率只有78.2%左右,即使在K=4 時基于曼哈頓距離的KNN 算法對手勢平均識別率達(dá)到最高,也只有79.8%左右,要遠(yuǎn)低于S-KNN 算法的平均識別率。綜上實驗結(jié)果可以看出,改進(jìn)得到的S-KNN 算法對手勢的有效識別率[17]有非常明顯的提高,平均識別率提高了約15%,驗證了該算法的有效性。
圖9 S-KNN算法與基于曼哈頓距離的KNN算法識別率對比圖
如圖10 所示為S-KNN 算法的手勢識別率混淆矩陣圖,橫坐標(biāo)為1、2、3、4、5 代表了“剪刀”、“石頭”、“布”、“GOOD”、“OK”五種不同手勢的預(yù)測手勢標(biāo)簽,縱坐標(biāo)為手勢1 至5 的真實手勢標(biāo)簽,混淆矩陣y行和x列的值為第y類手勢被識別或第x類手勢的概率。從實驗結(jié)果圖可以看出,第二行的實際手勢“石頭”被識別成預(yù)測手勢的“GOOD”概率為5%,第三行的實際手勢“布”被識別成預(yù)測手勢的“石頭”和“OK”概率各為3%,第五行的實際手勢“OK”被識別成預(yù)測手勢的“剪刀”概率為3%,識別錯誤概率均較低,可以判斷S-KNN 算法對五種手勢的識別率均為較高水平,在較為理想的情況下平均識別率均達(dá)到了95%以上。
圖10 S-KNN算法手摯識別率混淆矩陣
通過以上實驗結(jié)論可以判斷S-KNN 算法相對于傳統(tǒng)的KNN 算法手勢識別準(zhǔn)確率有著較大幅度的提高,對KNN 算法的改進(jìn)是合理且成功的,利用SVM 算法來改進(jìn)KNN 算法可以更好地收集到有效訓(xùn)練集,獲得更高的手勢識別率。