隨着經濟社會的進步,人們對美好生活的追求也不斷地刺激着電子娛樂行業的發展。但這些應用場景的人機交互方式卻一直被束縛在經過鍵盤、鼠標、觸摸屏的物理接觸方式上。這些傳統的交互方式將玩家的操做範圍侷限在簡單的二維平面空間,也限制了遊戲開發者創意的發揮。所以,咱們引入了一種新的人機交互模式——手勢識別交互。前端
手勢交互方式符合人類思惟邏輯,具備天然性和直觀性等特色。使用者不須要有太高的門檻,即可以很好地體驗到人機交互的樂趣。手勢識別技術具備良好的應用前景——包括電子娛樂、智能家居、VR及自動駕駛等熱點領域。這個項目設計的目的就是實現簡單直觀的人機交互方式,並促使該技術和產品在將來大規模民用成爲可能。android
咱們的項目基於飛槳及其高性能端側推理引擎Paddle Lite開發,實現了在基於Android系統的手機、平板電腦、嵌入式開發板上利用手勢來實時控制貪吃蛇、神廟逃亡、地鐵跑酷等交互式遊戲,並可在大屏幕端進行投屏展現。git
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
手勢識別交互系統採用分層架構、模塊化方式進行設計,可知足系統定製及擴展的靈活要求。主要包括:前端採集模塊、算法模塊、通訊模塊。github
01 採集模塊web
採集模塊實現了Android設備上圖像採集與設備運行狀態的監控功能。經過高頻調用關聯相機來獲取手勢圖片,將採集到的圖片放入緩衝池中以供算法分析模塊使用。此外,採集模塊還負責對所連設備進行狀態監測,如相機離線將及時產生預警,並支持自動重連等功能,保證系統的穩定性。算法
拍照方法的實現shell
Android Camera是安卓系統提供的實現自定義相機功能的官方支持庫,採集模塊封裝了一系列相關調用方法,實現了連續抓拍存儲及浮窗實時預覽的效果。網絡
此外,對於沒有自帶攝像頭的安卓設備(如嵌入式開發板),咱們使用外接USB攝像頭,並完成 USB攝像頭的驅動模塊的編寫,實現了設備對外接攝像頭的調用及相關配置功能。架構
浮窗實時預覽框架
爲了便於調試,經過Service組件定製浮窗的方式來在實時顯示當前攝像機的預覽畫面、手勢識別結果、處理響應延時等信息,並設立了開關來一鍵控制程序,如圖所示.
浮窗實時預覽效果(鏡像顯示)
02 算法模塊
算法模塊負責對輸入的手勢圖片進行分類,並將識別結果返還。此部分的開發流程以下所示。
1. 數據集的選取與採集
在數據集的選取上,從NUS Hand Posture Dataset II[1]中選擇了5類做爲手機、平板電腦等小型設備的手勢。該數據集每一類手勢由40名志願者分別在不一樣的環境下拍攝,並重復5次;同時每類還含有75張有人類身體噪音的圖片。共(200+75)×5=1375張圖片。
在研究過程當中,咱們發現NUS數據集的手勢不符合所應用遊戲的正常操做習慣(即上下左右)。所以,咱們從新設計並本身採集了數據集,用於電視端遠距離的演示。該數據集一樣有5種類別,每類由3名志願者在6種場景下重複6次,共540張圖片。但本身在實驗室採集的數據集環境比較單一,只適用於特定環境的展現。
從NUS Hand Posture Dataset II選取的5中手勢, 環境複雜、部分手勢不符合遊戲操做習慣:
從左至右分別對應控制命令:無控制、上、下、左、右
從新設計並本身採集的數據集示例,環境單1、手勢符合遊戲操做習慣:
從左至右分別對應控制命令:無控制、上、下、左、右
2. 數據集增廣、劃分與預處理
因爲深度神經網絡的訓練須要足夠的數據支持,規模太小的數據集會使得模型的泛化能力差,容易致使過擬合。所以,咱們按如下步驟對NUS數據集進行了增廣,並劃分爲訓練集、測試集:
此外,還經過padding的方式將圖片調整爲方形,以保持原始手勢及背景的長寬比。最後,在將圖片傳入神經網絡以前,對圖片進行z-score歸一化,以加快神經網絡的收斂速度。
數據集增廣及預處理效果以下圖所示:
數據集增廣、預處理示意圖(左:padding後的原圖爲方形,中:隨機裁剪,右:隨機旋轉)
3. 設計、搭建與訓練神經網絡
在卷積神經網絡的選取與設計上,因爲要將模型應用於計算資源很是受限的Android平臺上,所以考慮選用輕量級神經網絡MobileNet[2]。
MobileNet是目前經常使用的能夠在移動設備端部署的輕量級神經網絡。它將標準卷積用Depthwise Convolution和Pointwise Convolution代替,減小了模型參數與計算量。咱們利用百度開源深度學習框架飛槳搭建MobileNet並進行訓練。
較低延時是手勢實時控制遊戲的關鍵。爲了下降算法延時,即儘量減小模型參數量與計算量,但同時保證算法準確率,咱們在MobileNet模型(
https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/models/mobilenet_v1.py)的基礎上,經過調整網絡結構(層數、各層通道數),設計多組實驗進行對比,結果如表1所示。其中模型輸入圖片尺寸爲120×120×3。最終選擇了算法延時小,同時識別準確率較高的模型(序號3),其結構如表2所示。
4. 模型保存
在訓練過程當中,將模型進行保存,用於以後的推理預測。具體地,在訓練時每一個epoch都將神經網絡的參數進行保存,並評估測試集準確率。訓練完成後,選擇測試集準確率最高的模型做爲預測模型。
5. Android端推理
最後,基於Paddle Lite在Android端加載模型並進行推理預測。
首先咱們要編譯Android端可以調用的CPP庫。本項目中編譯的是Paddle Lite。編譯時,參考Paddle Lite在GitHub平臺上Android部分開發文檔
(https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/mobile/doc/development_android.md),基於Ubuntu系統,利用Android NDK及CMake交叉編譯出符合咱們Android硬件環境的庫libpaddle-mobile.so文件。
以後,將採集模塊中攝像頭捕捉的圖片按照訓練模型前徹底一致的方法進行預處理,並加載保存好的預測模型,經過調用剛纔編譯的libpaddle-mobile.so庫提供的API,就能實現Android端的推理。
下面是沒有運行遊戲的演示效果。將識別結果和包括攝像頭拍照、算法推理、控制的總延時顯示在浮窗上,方便調試。
03 通訊模塊
通訊模塊根據算法不一樣的推理預測結果,向操做系統發送相對應的控制命令,就實現了應用程序的控制。
跨進程操做一般採用進程間通信,可創建專用通信管道實現,咱們採用向Android系統直寫shell命令模擬動做事件的方式來實現系統控制功能,這種方式快捷高效,但需先取得root權限。
實驗中用到的設備參數如表3所示。
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
總結
咱們的手勢識別交互系統是面向人機交互的嵌入式應用程序,用戶僅需使用帶有攝像頭的安卓設備即可以利用手勢實現對界面(遊戲)的控制。利用嵌入式主板豐富的接口帶來的多平臺投影功能,還能夠獲得更好的展現與體驗效果。
本項目中手勢指令發出、識別不依賴任何可穿戴的設備,可使用戶得到沉浸式體驗,並可帶動相關遊戲開發、設備製造等產業的發展。相信手勢識別等AI技術在將來會更加完善,改善人類生活。
參考文獻
[1] Pisharady P K, Vadakkepat P, Loh A P. Attention Based Detection and Recognition of Hand Postures Against Complex Backgrounds[J]. International Journal of Computer Vision, 2013, 101(3): 403-419.
[2] Howard A G, Zhu M, Chen B, et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications[J]. arXiv: Computer Vision and Pattern Recognition, 2017.
>> 訪問 PaddlePaddle 官網,瞭解更多相關內容。
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu