动态手势识别实战
Github:Wonderseen_Gesture_Net
Author:Wonderseen | Xiamen University | 2018.04.27
如需轉(zhuǎn)載本文,請先聯(lián)系作者本人,謝謝。
因為工程維護(hù)需要時間,代碼陸續(xù)在上傳。具體請跟進(jìn)上面的鏈接,如果覺得項目對您有幫助,請您給予一點鼓勵,送個star。
- 大三上的課余時間基本都花在手勢識別的項目上,其中最困難的部分是選擇手勢識別問題的解決方案。最近看到有些朋友也在做手勢識別的項目,所以整理一下自己的方案,以作參考。
設(shè)備選項:
RGB傳感器(單相機(jī)single-view或者多相機(jī)multi-view)、深度傳感器(相機(jī)方面根據(jù)精度選擇設(shè)備,一般的雙目精度【較少毫米級】不如TOF或者結(jié)構(gòu)光精度高)以及前兩者結(jié)合的傳感器(截至去年為止,某寶能搜到的提供完整sdk的成品有SR系列、Kinect、圖漾等)
- 傳統(tǒng)方案:在深度學(xué)習(xí)大行其道之前,出現(xiàn)過許多識別手勢的方法。
- 閾值分割在匹配手部mask,再根據(jù)手指尖的關(guān)系對指尖伸展情況,進(jìn)行指端伸展情況判斷(數(shù)手指頭之類的),進(jìn)而判斷設(shè)定的若干個手勢
比如內(nèi)切圓記錄為掌心,凸集形成的多邊形頂點數(shù)記錄為指尖等,這里可以衍生的形態(tài)學(xué)方法比較多,翻墻也可以找到會議論文可以參考。
- 利用提取到的手部灰度圖(這里覺得有困難的可以嘗試用標(biāo)記來識別手部,比如藍(lán)手套等)和提前設(shè)定好的手部模板進(jìn)行匹配
方案2:涉及的是圖像相似度的計算,比如基于圖像灰度圖的NCC方法或者基于形狀的匹配方法等。
這類方法主要用在工業(yè)視覺項目,其表現(xiàn)為其檢測范圍內(nèi)的背景相對簡單,同時光照被人為提前設(shè)定;不過,在復(fù)雜環(huán)境下或者被測物體多自由度的情況下,方案2的表現(xiàn)比較差。這個方案我沒有怎么嘗試,目前尚不清楚優(yōu)化效果。
- 制作好手勢圖數(shù)據(jù)集,用adaboost算法選出Haar或者Hog特征,獲得手部特征描述子,并用來檢測和識別手勢。
方案3:用Opencv比較容易實現(xiàn),庫和示例比較完整。
(1) 首先,訓(xùn)練手部的檢測器,用來獲得手部局部圖;
(2)接著,利用多種手勢檢測器對局部圖進(jìn)行檢測分類。
這個方案實施過程中,要注意用于訓(xùn)練的正負(fù)樣本的選擇,以及訓(xùn)練參數(shù)的設(shè)定,留好裕度。用Opencv自帶的adaboost進(jìn)行迭代前要了解到,Hard 的正樣本是會被丟棄的,并會從未訓(xùn)練的樣本中,抽取新的樣本,用以補(bǔ)充訓(xùn)練隊列。
轉(zhuǎn)載自知乎作者【白裳丶】adaboost+haar工程實現(xiàn)過程及細(xì)節(jié)
- 必須提一句:上述的3種方案,適用于特定環(huán)境的試驗中,但是對光照比較敏感,難以適應(yīng)各種光照,不過好在實現(xiàn)起來會比較輕松,如果是作為視覺入門項目,建議初學(xué)者走走這三個方案的彎路,對鞏固基礎(chǔ)知識比較有幫助。
- 同時方案1和方案2較為死板,因為這兩種方案限定了手部與相機(jī)的相對關(guān)系,比如限定了”手部必須正對相機(jī)”這樣隱性的要求。
深度學(xué)習(xí)大背景下,提出方案4。
深度學(xué)習(xí)應(yīng)用背景:
手勢估計任務(wù)可以歸結(jié)為關(guān)鍵點估計的一類問題。這兩年關(guān)鍵點估計在學(xué)術(shù)上是解決得比較通透的問題,該方向目前亟待解決的新問題,主要出現(xiàn)在以下兩種情況中:
(1)在待檢測目標(biāo)存在大面積被遮擋的情況下
(2)在同一視野中,目標(biāo)對象的尺寸短時間內(nèi)發(fā)生快速變化時
如何對關(guān)鍵點或者圖像語義進(jìn)行準(zhǔn)確的實例估計,即instance segmentation。就普通愛好者而言,做手勢識別任務(wù),先從基礎(chǔ)情況入手。這里假設(shè)任務(wù)環(huán)境:在圖像采集過程中,被捕捉的手部圖像是穩(wěn)定的、并且不被其他物體所遮擋。
我所用的方案 :
整個流程包括【手部分割】(Handmask Semantic Segmentation)、【手勢關(guān)鍵點估計】(HandUV Estimation)、【手勢分類】(Gesture Classification)。
手部分割:為了縮小檢測范圍,減少圖像噪聲的影響,這個做法和mtcnn的two-stream做法類似。為了實現(xiàn)這個目的,你也可以不使用FCN;實現(xiàn)的途徑是多樣的,比如你如果愿意換而采用RPN(Region Proposal Net)實現(xiàn),那么mask rcnn、ssd、yolo v3等均可以進(jìn)行一番嘗試。
原創(chuàng)作者:雷鳴–基于深度學(xué)習(xí)的目標(biāo)檢測算法綜述
關(guān)鍵點估計:對手部的21dofs 或者 26dofs (或者更多)的2d坐標(biāo)進(jìn)行估計。2d估計的方案就比較多了,基于像素預(yù)測的cpm、hg或者基于邊框回歸的mask-rcnn及其變種。因為vgg網(wǎng)絡(luò)太沉,所以我沒有完全采用它的結(jié)構(gòu)。出于減少網(wǎng)絡(luò)復(fù)雜度的考慮,我綜合GoogleNet的特征提取結(jié)構(gòu)和u-net的優(yōu)點,寫了比較淺層的網(wǎng)絡(luò),在這個關(guān)鍵點估計任務(wù)中,優(yōu)化后表現(xiàn)還不錯,關(guān)鍵點和ground truth的平均距離差在1.4個像素。對于有更多精力的朋友,建議您不要止步于此,繼續(xù)延伸,利用KL散度等信息從2d往3d進(jìn)行深度的回歸估計。
手勢分類:單類定長輸入的分類問題,想必大家一定不陌生。這里我的trick是:為關(guān)鍵點設(shè)置高斯監(jiān)督,并結(jié)合Part cropped at Proposal Region作優(yōu)化。
我的小demo測試視頻,用五個簡單手勢,控制單點的運動
總結(jié)
- 上一篇: avada html5,46个Avada
- 下一篇: Jmeter 性能测试