華為機器學習(ML Kit)提供手部關鍵點識别服務,可用于手語識别。手部關鍵點識别服務能識别手部21個關鍵點,通過每個手指的方向和手語規則作比較去找手語字母表。
手語通常被聽力和口語有障礙的人來使用,是收集手勢包含日常互動中所使用的動作和手勢。使用ML Kit 可以建立一個智能手語字母表識别器,它可以像一個輔助器一樣将手勢翻譯成單詞或者句子,也可以将單詞或者句子翻譯成手勢。這裡嘗試的是手勢當中的美國手語字母表,是基于關節,手指和手腕的位置進行分類。接下來小編将會嘗試從手勢中收集單詞“HELLO”。

1. 開發準備
詳細的準備步驟可以參考華為開發者聯盟,這裡列舉關鍵的開發步驟。
1.1 啟動ML Kit
在華為開發者AppGallery Connect, 選擇Develop > Manage APIs。確定ML Kit 激活。
1.2 項目級gradle裡配置Maven倉位址
1.3 內建SDK後,在檔案頭添加配置
1.4 将以下語句添加到AndroidManifest.xml檔案中
1.5 申請攝像頭權限和本地檔案讀取權限
2. 代碼開發
2.1 建立用于相機預覽的Surface View,建立用于結果的Surface View。
目前我們隻在UI中顯示結果,您也可以使用TTS識别擴充和讀取結果。
2.2 建立手部關鍵點分析器
2.3 開發者建立識别結果處理類“HandKeypointTransactor”
該類MLAnalyzer.MLTransactor<T>接口,使用此類中的“transactResult”方法擷取檢測結果并實作具體業務。
2.4 建立LensEngine
2.5 運作LensEngine
2.6 停止分析器,釋放檢測資源
2.7 處理 transactResult() 以檢測字元
您可以使用HandKeypointTransactor類中的transtresult方法來擷取檢測結果并實作特定的服務。檢測結果除了手部各關鍵點的坐标資訊外,還包括手掌和每個關鍵點的置信值。手掌和手部關鍵點識别錯誤可以根據置信值過濾掉。在實際應用中,可以根據誤認容忍度靈活設定門檻值。
2.7.1 找到手指的方向
讓我們先假設可能手指的矢量斜率分别在X軸和Y軸上。
假設我們有手指分别在5個矢量上,任意手指的方向在任意時間可以被分類為上,下,下-上,上-下,不動。
首先将對應的關鍵點從結果中分離到不同手指的關鍵點數組,像這樣:
手指上的每個關鍵點都對應手指的關節,通過計算關節與手指的平均位置值之間的距離就可以計算出斜率。根據附近關鍵點的坐标,查詢該關鍵點的坐标。
拿字母H的兩個簡單關鍵點來說:
用手指坐标的平均值來計算矢量
矢量的結果将會是正值或者負值,如果它是正值它會出現X軸的正四方向,如果相反它就是負值。用這個方式對所有字母進行矢量映射,一旦你掌握了所有的矢量我們就可以用它們來進行程式設計。
用上述矢量方向,我們可以分類矢量,定義第一個為手指方向枚舉
擷取每個手指的方向并且儲存在一個數組裡。
2.7.2 從手指方向找到字元:
現在我們把它當作唯一的單詞“HELLO”,它需要字母H,E,L,O。它們對應的X軸和Y軸的矢量如圖所示。
假設:手的方向總是豎向的。讓手掌和手腕與手機平行,也就是與X軸成90度。姿勢至少保持3秒用來記錄字元。
開始用字元映射矢量來查找字元串
3. 畫面和結果
4.更多技巧和訣竅
1. 當擴充到26個字母時,誤差很更多。為了更精準的掃描需要2-3秒,從2-3秒的時間尋找和計算最有可能的字元,這可以減少字母表的誤差。
2. 為了能支援所有方向,在X-Y軸上增加8個或者更多的方向。首先,需要求出手指的度數和對應的手指矢量。
這個嘗試是強力坐标技術,它可以在生成矢量映射後擴充到所有26個字母,方向也可以擴充所有8個方向,是以它會有26*8*5個手指=1040個矢量。為了更好的解決這一問題,我們可以利用手指的一階導數函數來代替矢量進而簡化計算。
我們可以增強其它的去代替建立矢量,可以使用圖像分類和訓練模型,然後使用自定義模型。這個訓練是為了檢查華為ML Kit使用關鍵點處理特性的可行性。
了解更多相關内容>>
通路華為機器學習服務官網
擷取華為機器學習服務開發指導文檔
華為HMS Core官方論壇
華為機器學習開源倉位址:GitHub、Gitee
解決內建問題請到Stack Overflow
點選關注,第一時間了解HMS Core最新技術~