一、項目簡介
手勢是一種符合人類日常習慣的交互手段,在日常生活中人們之間的交流通常會輔以手勢來傳達一些信息或表達某種特定的意圖。隨着人工智能和計算機視覺技術的迅猛發展,智能化設備逐漸融入到人們生活的方方面面,因此對各類人機交互的需求也在不斷增加。鍵盤、鼠標、觸摸屏等傳統的人機交互設備,需要人們直接與終端設備進行接觸,並且需要被迫學習各種終端設備的輸入規則,具有較多的限制並嚴重影響了人機交互效率。人工智能技術的出現,為解決這一瓶頸帶來了新的解決辦法,智能化的人機交互方式逐漸得到了人們的重視。手勢是人們常用的肢體語言之一,是一種自然直觀、有效簡潔的溝通方式,手勢識別逐漸成為基於計算機視覺的智能人機交互的重要研究領域。
本系統使用Kinect攝像頭,獲取關於手勢的深度圖像,通過利用DTW算法,將手勢與提取的手勢模板進行比較,從而獲取手勢的信息。在手勢特征的提取算法上,經典的DTW算法會遍歷滿足邊界約束、單調性約束和連續性約束的所有路徑以找出最優規整路徑,因此考慮用啟發性的方法限制路徑的范圍,提前排除一些不可能最優的路徑選擇,減少算法的計算量。
二、軟件結構特點
1.設計架構
本系統通過對手勢的識別來控制系統,是一種典型的人機交互的軟件,用戶界面隨着手勢的變更而發生變化,因此本系統使用MVC架構來實現。
Model用來封裝核心數據和功能,它獨立於特定的輸出表示和輸入行為,是執行某些任務的代碼,至於這些任務以什么形式顯示給用戶,並不是模型所關注的問題。模型只有純粹的功能性接口,也就是一系列的公開方法,這些方法有的是取值方法,讓系統其它部分可以得到模型的內部狀態,有的則是寫入更新數據的方法,允許系統的其它部分修改模型的內部狀態。
View用來向用戶顯示信息,它獲得來自模型的數據,決定模型以什么樣的方式展示給用戶。同一個模型可以對應於多個視圖,這樣對於視圖而言,模型就是可重用的代碼。一般來說,模型內部必須保留所有對應視圖的相關信息,以便在模型的狀態發生改變時,可以通知所有的視圖進行更新。
Controller是和視圖聯合使用的,它捕捉鼠標移動、鼠標點擊和鍵盤輸入等事件,將其轉化成服務請求,然后再傳給模型或者視圖。軟件的用戶是通過控制器來與系統交互的,它通過控制器來操縱模型,從而向模型傳遞數據,改變模型的狀態,並最后導致視圖的更新。
在本系統中,模型中封裝的是手勢模板以及進行手勢特征提取的算法——DTW算法,它通過提供手勢識別的接口,來處理獲取到的用戶手勢;視圖可以獲取模型對手勢的處理結果,向用戶顯示出手勢所代表的信息,用戶手勢發生變化時,視圖會顯示不同的信息;控制器通過捕捉用戶的交互,來將獲取的手勢數據傳輸給模型和視圖,實現手勢識別系統。
2.設計模式
外觀模式:它能為手勢識別系統提供一個簡單的接口,與直接調用系統相比,外觀提供的功能比較有限,但它卻包含了客戶端真正關心的功能。
實現方式:首先,考慮能否在現有系統的基礎上提供一個更簡單的接口。判斷實現的是否正確的方法就是看接口能否讓客戶端代碼獨立於系統類。接着,在一個新的外觀類中聲明並實現該接口。外觀應將客戶端代碼的調用重定向到子系統中的相應對象處。如果客戶端代碼沒有對子系統進行初始化,也沒有對其后續生命周期進行管理,那么外觀必須完成此類工作。然后,為了能充分發揮這一模式的優勢,應該確保所有客戶端代碼僅通過外觀來與子系統進行交互,此后客戶端代碼將不會受到任何由子系統代碼修改而造成的影響。最后,如果外觀變得臃腫,可以考慮將其部分行為抽取為一個新的外觀類。
三、運行環境和技術選型說明
開發語言:C/C++
硬件設備:Kinect攝像頭
開發工具:Visual Studio Code,tensorflow,Kinect for Windows SDK
手勢匹配算法:DTW,圖卷積神經網絡
技術選型說明:
(1)DTW算法是解決時間序列分類問題比較成熟的算法,基於動態規划的思想來度量不同長度時間序列的相似性,應用簡單、訓練成本低且精度高。針對兩個時間長度不同的序列,利用動態規划原理找到訓練樣本序列和測試樣本序列之間的映射關系,通過將其中一個序列的時間軸拉伸或規整使得兩序列的時間軸最大限度重疊,以此消除兩條序列在時間軸上的差異,降低它們之間的失真度。
經典的DTW算法會遍歷滿足邊界約束、單調性約束和連續性約束的所有路徑以找出最優規整路徑,可以考慮用啟發性的方法限制路徑的范圍,提前排除一些不可能最優的路徑選擇,減少算法的計算量。
(2)圖卷積神經網絡是主要針對以圖(Graph)數據結構形式存儲的數據集,現實世界中經常存在這種數據,但往往無法應用經典的卷積神經網絡來處理,這就是圖卷積神經網絡的意義。
圖卷積神經網絡通過圖的節點特征和結構特征來提取圖結構中我們需要的特征,每個節點的一系列特征可以儲存在矩陣中,圖結構特征則可以用鄰接矩陣A。
考慮通過Kinect攝像頭直接獲取手部的關節信息存儲在廣義圖中,應用圖卷積神經網絡進行手部特征的提取,訓練各個手勢對應的特征模型,進行手勢識別。
四、系統架構的描述性視圖
1.用例圖
2.分解視圖
分解是構建軟件架構模型的關鍵步驟,分解視圖也是描述軟件架構模型的關鍵視圖,一般分解視圖呈現為較為清晰的分解結構特點。分解視圖用軟件模塊勾划出系統結構,往往會通過不同抽象層級的軟件模塊形成層次化的結構。
3.依賴視圖
依賴視圖展現了軟件模塊之間的依賴關系。比如一個軟件模塊A調用了另一個軟件模塊B,那么我們說軟件模塊A直接依賴軟件模塊B。如果一個軟件模塊依賴另一個軟件模塊產生的數據,那么這兩個軟件模塊也具有一定的依賴關系。依賴視圖能幫助我們找到沒有依賴關系的軟件模塊或子系統,以便獨立開發和測試,同時進一步根據依賴關系確定開發和測試軟件模塊的先后次序,也能有效幫助我們理清一個軟件模塊的變更對其他軟件模塊帶來影響范圍。
4.執行視圖
執行視圖展示了系統運行時的時序結構特點,比如流程圖、時序圖等。執行視圖中的每一個執行實體,一般稱為組件,都是不同於其他組件的執行實體。如果有相同或相似的執行實體那么就把他們合並成一個。
執行實體可以最終分解到軟件的基本元素和軟件的基本結構,因而與軟件代碼具有比較直接的映射關系。在設計與實現過程中,我們一般將執行視圖轉換為偽代碼之后,再進一步轉換為實現代碼。
5.工作分配
組員 |
分工 |
1 |
建立系統邏輯,輪廓特征提取 |
2 |
訓練各個手勢對應的特征模型,對匹配算法進行改進 |
3 |
實現可視化界面,檢查測試已經完成的代碼 |
6.實現視圖
實現視圖是描述軟件架構與源文件之間的映射關系。比如軟件架構的靜態結構以包圖或設計類圖的方式來描述,但是這些包和類都是在哪些目錄的哪些源文件中具體實現的呢?一般我們通過目錄和源文件的命名來對應軟件架構中的包、類等靜態結構單元,這樣典型的實現視圖就可以由軟件項目的源文件目錄樹來呈現。
五、數據結構設計
本項目的核心是手勢,因此需要合理的數據結構將手勢進行保存,kinect攝像頭獲取的是三維圖像,包括手勢平面的橫縱坐標以及手勢距離攝像頭的長度,因此需要三維向量來保存手勢圖像上像素點的位置信息。
1)用戶表
序號 | 變量名 | 類型 | 描述 |
1 | id | string | 用戶名 |
2 | gesture | Gesture[] | 手勢 |
2)手勢表
序號 | 變量名 | 類型 | 描述 |
1 | gesturetype | string | 手勢類型 |
2 | gesture_id | string | 手勢ID |
六、核心工作模式
在手勢預處理階段,根據人們做手勢的習慣以及Kinect所提供的深度信息,迅速定位手所在的深度范圍,利用改進的分塊搜索方法,選擇大小合適的塊,快速找到手勢輪廓上的一個點,利用方向搜索的方法獲得深度圖像中的手勢及其輪廓信息。
在動態手勢識別中,將指尖點的運動軌跡用向量進行表示,再對其進行編碼來描述動態手勢,在手勢識別時,對動態時間規整算法進行改進,在該算法尋找最優彎曲路徑時,添加步數這一元素,計算不同步數下彎曲路徑的成本,更全面的考慮不同情況,將待識別手勢與模板手勢進行對比識別,選取相似度最高的手勢模板作為動態手勢的識別結果。