谷歌開發手部識別系統,手機可用

近日,谷歌發布了一個高性能的實時手部追蹤系統。不需要高性能的GPU、TPU,在手機上就能用!
什么是手部追蹤呢?來看一下下面這張動圖就知道了。
通過MediaPipe在手機上實現實時3D手部捕捉
只要把你的手往鏡頭前一伸,該系統就可以通過使用機器學習(ML)從單個視頻幀推斷出手部的21個骨骼關鍵點(每根手指4個,手掌1個)的位置,從而得到高保真的手掌和手指運動追蹤。
在此基礎上,這一系統還可以推斷出手勢的含義。
雖然手部追蹤這種能力是人類天生的,但是對計算機來說,能穩定地實時感知手部狀態是一項極具挑戰性的視覺任務。
難度來自多個方面。比如,雙手的運動經常會導致某一部分被遮蓋(例如合掌和握手),而手的顏色也沒有很強的對比度。
同時,手部追蹤也是各技術領域和應用平臺上改善用戶體驗的關鍵技術之一。
比如說,手部形狀識別是手語理解和手勢控制的基礎。它還可以在增強現實(AR)中將虛擬的數字內容疊加到真實的物理世界之上。
因此,谷歌這次的實時手部追蹤意義重大。
事實上,谷歌已經在今年6月份的CVPR 2019會議上演示過該模型。而這一次,谷歌選擇在MediaPipe這一個開源跨平臺框架正式發布這一系統。
該系統背后的原理是什么呢?我們一起來看。
用于手部跟蹤和手勢識別的機器學習
谷歌的手部追蹤方案使用了一個由多個模型協同工作組成的機器學習管道:
一個手掌探測器模型(BlazePalm),作用于整個圖像并返回定向的手部邊界框。
一個手部標志模型,作用于手掌探測器返回的裁剪圖像區域,并返回高保真的3D手部關鍵點。
一個手勢識別器,將先前得到的關鍵點排列分類為不同的手勢。
這種架構類似于我們最近發布的面部網格ML管道以及其它用于姿勢估計的架構。提供給手部標志模型的手掌剪裁圖像大大降低了對額外數據(如旋轉、平移和縮放)的要求,從而允許其將大部分能力用于針對坐標預測精度的處理。
frame:幀;palm detector:手掌探測器;hand landmarks:手部標志模型;gesture recognizer:手勢識別器
BlazePalm:實時手部/手掌探測
為了檢測初始手部位置,我們采用名為BlazePalm的單發探測器模型,它參考了MediaPipe中的BlazeFace,并進行了優化以針對實時移動應用。
檢測人手是一項非常復雜的任務:我們的模型必須適用于各種尺寸的手掌,還要能夠檢測各種遮擋和合掌的情況。
面部具有眼睛和嘴巴這樣的高對比度特征,手部卻沒有。因此,機器學習模型通常很難僅靠視覺特征來進行準確檢測。但如能提供額外的環境信息,如手臂、身體或人物等特征等,則有助于手部的精確定位。
在我們的方法中使用了不同的策略來解決上述挑戰。首先,我們訓練的是手掌探測器而非手部探測器,因為檢測像手掌和拳頭這樣的剛性物體的邊界比檢測整個手部要簡單得多。此外,由于手掌的面積較小,這使得非極大值抑制算法在雙手遮擋情況(如握手)下也能得到良好結果;手掌可以使用方形邊界框(也就是ML術語中的anchors)來描述,忽略其長寬比,從而可將anchors的數量減少3-5倍。其次,編碼-解碼特征提取器可用于在更大范圍的環境中感知很小的物體(類似于RetinaNet方法)。最后,我們將訓練期間的焦點損失(focal loss)降至最低,用以支持由于高尺度方差而產生的大量anchors。
利用上述技術,我們在手掌檢測中得到了95.7%的平均精度。而使用固定的交叉熵損失且沒有解碼器的情況下精度基準僅為86.22%。
手部標志模型
在對整個圖像進行手掌檢測之后,手部標志模型通過回歸(即直接坐標預測)在之前檢測到的手部區域內精確定位了21個3D手部骨骼關鍵點坐標。這個模型學習了連續的手勢圖案,并且對于被遮擋只有部分可見的手部也能識別。
為了獲得可靠數據,我們手動標注了大約30000幅具有手部骨骼關鍵點坐標的真實圖像,如下所示(我們從圖像深度圖中獲取Z值,如果它相應的坐標存在)。為了更好地覆蓋可能的手部姿勢并對手部幾何形狀的性質提供額外的比照,我們還在各種背景下渲染高質量的合成手部模型,并將其映射到相應的3D坐標。
上圖:傳給跟蹤網絡的帶標注的校準手勢圖下圖:帶標注的渲染合成手部圖像
然而,純粹的合成數據很難泛化應用到新的數據集上。為了解決這個問題,我們使用混合訓練模式。下圖顯示了大概的模型訓練流程。
Rendered synth:渲染合成圖片;real-world photos:真實圖像;hand presence:手部圖片;separable convolutional festure extractor:可分離卷積特征提取;21 3Dkeypoints regression:21個3D關鍵點回歸;hand presence classification:手部分類手部跟蹤網絡的混合訓練模式,裁剪的真實圖像和渲染的合成圖像用作預測21個3D關鍵點的輸入數據
下表總結了基于訓練數據性質的回歸準確率。綜合使用合成數據和真實數據可顯著提升性能。
手勢識別
基于預測出來的手部骨骼,我們用一個簡單的算法來推導手勢含義。首先,每個手指的狀態(如彎曲或筆直等)由多個關節的累積彎曲角度決定。然后我們將手指狀態集映射到一組預定義的手勢集合上。這種簡單卻有效的技術使我們能夠精確地估計基本的靜態手勢。現有的機器學習管道支持識別不同國家的姿勢(如美國、歐洲和中國),還支持各種手勢含義,包括“拇指向上”、“握拳”、“OK”、“搖滾”和“蜘蛛俠”等。
MediaPipe實現
谷歌的手部跟蹤MediaPipe模型圖如下所示。該圖由兩個子圖組成,一個用于手部檢測,一個用于手部骨骼關鍵點(標志點)計算。
MediaPipe的一個關鍵優化是手掌探測器僅在必要時(很少)運行,從而節省了大量的計算時間。
MediaPipe地址:
//mediapipe.dev
GitHub地址:
//github.com/google/mediapipe
MediaPipe利用MediaPipe,可以將感知管道構建為模塊化組件的圖形,包括例如推理模型(例如,TensorFlow,TFLite)和媒體處理功能。
谷歌在上周也將這一平臺進行了開源,適配多種視覺檢測任務。目前在GitHub上星標已經達到了2k+。
通過從當前幀中計算手部關鍵點推斷后續視頻幀中的手部位置來實現這一點,從而不必在每個幀上都運行手掌檢測器。為了得到穩定結果,手部探測器模型會輸出一個額外的標量,用于表示手是否存在于輸入圖像中并姿態合理的置信度。只有當置信度低于某個閾值時,手部探測器模型才會重新檢測整個幀。
Realtimeflowlimiter:實時限流器;handdetection:手部探測;detectiontorectangle:檢測到矩形;image cropping:圖像裁剪;handlandmark:手部標志;landmarktorectangle:標志成矩形;annotationrender:注釋渲染手部標志模型的輸出(REJECT_HAND_FLAG)控制何時觸發手部檢測模型。這種行為是通過MediaPipe強大的同步構建塊實現的,從而實現ML管道的高性能和最佳吞吐量。
高效的ML解決方案可以實時并在各種不同的平臺和外形上運行,但與上述簡化描述相比,其具有更高的復雜性。最后,谷歌在MediaPipe框架中將上述手部跟蹤和手勢識別管道開源,并附帶相關的端到端使用場景和源代碼。
鏈接如下:
//github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md
這為研究和開發人員提供了完整的可用于實驗的程序棧,可以基于谷歌的模型來對新想法進行原型設計。
未來方向
谷歌稱,未來計劃通過更強大和穩定的跟蹤鎖定方法擴展此技術,來擴大能可靠檢測的手勢數量,并支持實時變化的動態手勢檢測。
相信這項技術的開源也可以促使研究和開發者社區產生大量的創意和應用!