人機互動-即時手勢辨識
組員: 劉昌勳 江家慶 王人弘
指導教授: 賴尚宏
研究動機:
普遍的控制器有滑鼠、鍵盤到現今流行的觸控式螢幕。為了使人機互動可以更加不受限制,於是有了觸控、聲控等技術的出現,同時操作方式也被不斷地改良、簡化。基於上述理由我們認為以手勢來進行操作會更具人性化及未來性。
使用器材:
即時手勢辨識必要的設備有攝影鏡頭,要隨時回傳最新的影像,在本專題中我們使用Kinect為器材,理由是Kinect除了能提供影像資訊外,還可以提供深度資訊,能更準確地判斷出手的位置。
摘要:
不需經由直接碰觸的人機互動。使用kinect為鏡頭,找到人體骨架,追蹤其手部姿勢,再用libsvm和先前建立好的模型作比較,轉換成相應的指令交由應用程式執行動作。
簡介:
辨識手勢影像並與電腦即時互動的研究已經有不少。其中從影像辨認出手、把手部影像與背景做分離、消除不必要的雜訊等,需要一連串的影像處理技術運作,往往耗費許多執行時間,對於速度較慢的電腦,要實現即時的人機互動會有困難。如何縮減辨認手勢所需的時間,對於即時手勢辨識是很重要的一環!
而XBOX360最新的遊戲操控器:Kinect,除了能拍攝彩色影像,還具有捕捉深度資訊以及接收聲音的功能。從深度資訊,以及相應的人體骨架偵測功能,便能使我們省去許多傳統手勢辨識所需要做的步驟、及改善操作的方式,例如從骨架偵測我們能快速找出手部位置,而不用限定手一定要擺在鏡頭正前方;從深度來識別手的形狀,很容易就能消除背景並且減少需要過濾的雜訊,從而減少了辨識手勢所需要花費的時間。
而藉由Kinect能夠捕捉並追蹤人體骨架,要處理動態的手勢辨識又更加輕鬆寫意了。也因此我們選擇以Kinect作為此次專題所使用的影像接收裝置,嘗試在此基礎上,發展出方便且迅速的即時手勢辨識系統。
流程圖:
流程圖說明:
一般來說,擷取使用者手部的影像是使用一個單一的攝影機,讓手位於鏡頭的正前方。而攝影機得到的影像不會只有手,還會包含人體入鏡的部分以及背景,形成一個整體;此種狀況下的影像,電腦因無法分辨出手而造成嚴重誤差。
<1>
讀取Kinect所拍攝到的影像,並利用OpenNI來存取此影像圖與深度圖。
<2>
NITE具有分析人體骨架的功能,只須先做出標準手勢(高舉雙手),就可以抓出數個關節點的相關位置。
<3>
而手勢辨識的第一步,除了要清除影像中的背景,還要能將手部從人體中分離出來,並消除雜訊,最後得到單純的”手”,因此也能得到輪廓的資訊,由此便能從中分析出我們所需要的特徵資訊。不幸的是環境光線的變化也會導致影像變動過大,造成誤判,一般的背景消除由於必須應對各種現場狀況,這不是個輕鬆的問題。但在本專題中,由Kinect的深度資訊可以快速找到人體,不像以往只能從影像的色彩資訊來處理,所以背景的消除可以迅速達成。故利用手腕關節點的深度位置,以此深度為依據,並設定適當的範圍,過濾不在這範圍內的背景及物體。(其過濾方法為將在範圍內的部分設為1,反之則為0。)
<4>
雖然從第三步驟中可以過濾掉大部分的影像,但若有其他不需要的雜點且其深度落在第三步驟中的範圍內,則無法去除該雜點,故我們再從NITE所讀出的手腕關節點與步驟三所得的圖進行比對,確認出該區塊是否為手部區塊。
<5>
此處理是將手的重心為原點做平移,再以手的寬度大小為基準,將每張圖的手寬縮放至相同大小,以確保手的遠近不影響判斷結果,並將原圖(二維)的x、y座標轉換成一維360度的距離數值,取這些距離的方法是以重心為中心(平移後為(0,0)),畫出一水平線通過中心,以此往左找出手部區塊離中心最遠的距離,再將此圖逆時鐘旋轉一度。重複找最遠距離和旋轉一度的步驟,直到轉完一圈即可得到中心到360方位的最遠點距離。在360度取點方法中,各手勢的差別在於峰的數量及其大小。
<6>
首先先將使用者的手勢與我們所建好的資料庫進行手勢判別,此比對使用到SVM為技術,分析並判斷該手勢為何種手勢。至於動態手勢則是利用目前的手腕位置與前一張圖的手腕位置座標相減,並判斷其移動方向。
結果圖:
<步驟 1~4>
<步驟 5>
簡介SVM(Support Vector Machines):
Support Vector Machines(SVM)是一種分類演算法,由 Vapnik等根據統計學習理論提出的一種新的機器學習方法。本專題之SVM採林智仁教授的libsvm。
SVM 在解決小樣本、非線性及高維模式識別問題中表現出許多特有的優勢。已經應用於手寫體識別、三維目標識別、人臉識別、文本圖像分類等實際問題中,性能優於已有的學習方法,表現出良好的學習能力。從有限訓練樣本得到的決策規則對獨立的測試集仍能夠得到較小的誤差。
簡單來說,SVM想要解決以下的問題:找出一個超平面(hyperplane),使之將兩個不同的集合分開。為什麼使用超平面這個名詞,因為實際資料可能是屬於高維度的資料,而超平面意指在高維中的平面。
以二維的例子來說,如下圖,我們希望能找出一條線能夠將黑點和白點分開,而且我們還希望這條線距離這兩個集合的邊界(margin)越大越好,這樣我們才能夠很明確的分辨這個點是屬於那個集合,否則在計算上容易因精度的問題而產生誤差。
手勢辨識率與結果:
我們將講解得到辨識率的方法,首先在Kinect前比出特定手勢,由流程圖的步驟運算出360度的距離數值,以此數值建立資料庫,再由SVM作成model,將測資與model比對,藉以判斷為何種手勢。
以下的手勢為1到5,以150張圖做分析當model,再將這150張圖做辨識,這150張分別是3人每種手勢各10張。為求方便觀察已手圖來呈現,結果如下:
(圖中綠色為辨識成功,紅色為辨識錯誤)
辨識率為94.667%(142/150)
由上述方式可以初步分析出辨識率,但是進一步辨識率分析必須將樣本跟model分開,所以我們使用交叉驗證(Cross-validation),做法是將資料拆成 n組相同大小的資料,依序選取一組做為測試用,剩下其他組的資料則用來做訓練。將同樣的150張圖做交叉驗證,辨識率為93.333%。 (註:誤判的原因可能與手指間距和手腕弧線有關)
相關應用:
藉由辨識出來的手勢我們可以將其應用在許多部分上,例如:我們可以結合動態與靜態手勢來做投影片的報告、BBS的瀏覽、音樂及影片的控制等等。
以下為投影片撥放系統之介紹:
人機互動-投影片播放系統
組員: 劉昌勳 江家慶 王人弘 胡詠峻 李怡靜 黃筑葭
指導教授: 賴尚宏
概念
在現在科技發達的社會中,越來越多老師使用投影片來上課,但是在切換投影片的時候往往都必須待在電腦旁邊,而這樣的方式,大大的增加了與聽眾們互動的不方便。而有時候必須畫線作記號的地方,也必須待在電腦旁,因此想設計出一套能夠讓使用者盡情移動的投影片播報系統。
利用微軟新推出的Kinect來當作攝影鏡頭,然後使用者可以在鏡頭所及範圍內移動,可以使用動作來操控的功能包含播放投影片、滑鼠的左右鍵、回到首頁等等功能。通常使用的地點可以是會議廳、教室、或其他較明亮的地點。這套投影片播報系統,可以給老師、演講者等等使用,舉凡需要用到投影片的場合都可以使用。
功能
Step1:定位
對著kinect做出標準手勢,待其讀取關節點的相關位置。
Step2:使用靜態手勢功能
全螢幕:將右手向前,右手對著鏡頭比出手勢4即可完成全螢幕的功能。
回首頁:將右手向前,右手對著鏡頭比出手勢2即可完成回首頁的功能。
滑鼠游標: 將右手向前,右手對著鏡頭比出手勢1即可完成滑鼠游標功能(即雷射筆的功能)之開啟及關閉。
滑鼠功能設定(點擊左鍵一次)或(左鍵按下/彈起): 將右手向前,右手對著鏡頭比出手勢5即可切換滑鼠功能。預設為滑鼠點擊左鍵一次,若需使用畫筆(按下拖曳後再彈起)就須切換滑鼠功能。
(註: 靜態手勢之判斷為使用上述手勢辨識的方法。)
(註: 雷射筆之原理請參閱”人機互動-人手雷射筆”的部分。)
Step3:使用動態手勢功能
使用方法:將左手高舉至頭,右手對著鏡頭往上移動或往下移動,在此投影片撥放系統中即為上一頁與下一頁之功能。
Step4:滑鼠游標、左右鍵之功能
游標: 以右手指到屏幕的位置作為滑鼠點。
左右鍵: 左手往左平舉表示左鍵,反之,往右平舉表示右鍵。
開發工具與技術:
攝影器材: Kinect
開發環境: Microsoft Visual Studio 2008
OpenCV2.0
OpenNI 1.1.0.41
PrimeSense - NITE 1.3.1.5
參考資料庫
libSVM http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html