[开源]基于姿态估计的运动计数APP开发(一)
前言:
????看著自己日漸發福的身材,回想當年的英姿煞爽,感慨頗多。作為一個有羞恥心的程序猿,我決定開始減肥。考察了數十項減肥項目,我選擇了仰臥起坐。因為它場地限制小,時間限制短,不劇烈,不傷身,最關鍵的是能夠一邊看綜藝,一邊鍛煉,簡直妙不可言!試行了幾天之后發現有一個比較棘手的問題,做著做著,就忘了做了多少個,一臉懵逼,萬般無奈,于是便有了這個運動計數APP的靈感。不用太花哨的功能,最最簡單的一點,能夠對我的仰臥起坐進行計數,并顯示在APP的界面上,到了10,20這種(%10==0)的關鍵節點上面會有林志玲小姐姐的加油鼓勵!其實界面的編碼并不難,難的是算法的開發。。。
?
總體思路:
????計算機視覺中有一個應用分支叫做姿態估計,能夠以關鍵點的方式來估計出一個/多個人的姿態信息。如下圖所示:
為了算法開發減低難度,這個APP只需要進行單人的姿態檢測即可。如果姿態檢測的效果好,那么理論上就能完成仰臥起坐的計數。計數規則很簡單:通過觀察仰臥起坐的姿勢,只要代表頭部的關鍵點與代表膝蓋的關鍵點之間的歐氏距離出現周期性的變化,即可認為是在做仰臥起坐,并且可以方便的統計出頻率與周期,從而進行計數。所以剩下的問題就是如何選擇設計一個模型,能夠又快又好的進行姿態檢測了。畢竟要在手機上實現,沒有速度,一切都是扯淡!
?
拍拍腦門的第一個方案:
????由于我之前做的比較多的是目標檢測,沒有做過姿態估計,對該領域不太了解,但是直覺卻告訴我這很簡單。因為做的是單人的姿態檢測,并且假設我需要預測13個關鍵點。如下圖所示:
那么理論上我只要回歸13*2的坐標即可。一個很自然的思路就是用輕量級的分類網絡,將最后的分類向量修改為坐標回歸向量即可。有了這個一拍腦門的想法之后,分分鐘就改好了shufflenetV2的網絡,如下圖所示:
此時,離真正的訓練還有一步之遙,那就是訓練數據。由于姿態估計是一個比較大眾的領域,已經有很多開源的數據集,恰好我的筆記本上有COCO數據集,里面有人體姿態估計的標簽,于是就選擇了COCO作為訓練集。由于COCO的姿態檢測包含多人,我修改的網絡只針對一個人。于是我把COCO中有姿態估計的圖片進行了過濾,只保留了單人的姿態估計圖片。大概有2萬多張,還好,數目不算少。
準備好網絡與數據集之后,啟動了我可憐的筆記本,那風扇的轟鳴聲讓我覺得異常踏實。經過3天2夜的鏖戰,竟然發現loss無法下降!此時直覺告訴我用Global Pooling的方式數據損失太大,用于分類還可以,用于回歸可能不行。于是我將最后的GlobalingPooling去掉,直接使用兩個FC層進行預測。如下圖所示:
又經過三天兩夜的咆哮,loss還算比較正正常。當我滿心歡喜的準備做測試的時候,發現效果苦不堪言。基本無法使用。。。。看來姿態估計沒有我想的那么簡單,需要從長計議。
?
第二個方案:
經過狂補各種姿態估計的知識后,發現直接回歸坐標確實已經很少使用。取而代之的是使用heatmap來輸出關鍵點的位置。這和anchor free的目標檢測中的centness之類的做法差不多,即通過查找heatmap中響應值最大的點來確定關鍵點的坐標。如下圖所示(只顯示部分heatmap):
思考了一下原因,直接回歸坐標,通常會將最后的featuremap下采樣到很小,這樣才能夠實現全局的回歸,但是關鍵點預測這種任務對位置信息非常敏感,過小的特征會極大的丟失空間信息,因而導致預測位置非常不準。而heatmap方式一般要求最后的特征圖比較大,通常是輸入圖片的1/2或者1/4,那么就非常適合做一些空間相關的任務。其實如果人為的將特征圖壓縮的很小,heatmap的方式也一樣不太準。有了上面的思考,便有了第二個方案,就是將shufflenet最終輸出的7*7的特征圖進行上采樣到13*56*56大小(考慮到最終的應用以及場景,56*56足夠實現仰臥起坐動作的識別),13表示的是13個關鍵點。然后輸出的特征經過sigmoid激活之后便得到了13*56*56的heatmaps。這里多提兩點,就是heatmap標簽的設計和loss的平衡問題。先說說標簽的設計,如果只是簡單的將標簽轉化成一個one_hot的heatmap,效果不會太好。因為標簽點附件的點實際上對于網絡來說提取的特征是類似的,那么如果強行把不是標簽附近的點設置為0,表現不會很好,一般會用高斯分布來制作標簽heatmap,如下圖所示:
另外要說的就是loss的平衡了,上面的標簽heatmap大家也看到了,無論是one-hot的heatmap還是高斯分布的heatmap,大部分的點都是負樣本點,直接使用MSE而不加以區分,網絡基本上會訓練出一個輸出全是0的heatmap。主要原因就是訓練的梯度被負樣本壓制,正樣本的梯度實在太小。因此需要做一個分區。我這里把正負樣本的比重設置為10:1
又開始3天2夜的咆哮,網絡總算能夠work了,對于coco上訓練過的數據,效果不錯。如下圖所示:
但是對于從百度拉下來的仰臥起坐圖片,效果有點欠缺,分析了一下原因,COCO的單人姿態圖片中,都是一些很生活化的場景,很少有人躺在地上的情形。因此需要對數據做一些增強或者增加一些特別的仰臥起坐的圖片。
?
總結:
目前的網絡只是能夠work,距離真正的落地還有一段距離。主要表現在對仰臥起坐的泛化性上比較差。后期的計劃主要包括兩方面:一方面是基于數據。例如增加一些姿態估計的數據集,MPII等,或者是自己收集一些仰臥起坐的視頻,人工標注,另外還可以對數據增強進行完善。另外一方面是考慮網絡的設計以及loss的求解上面。網絡是否可以增加一些shortcut,是否可以接借鑒一些成熟的姿態檢測網絡,以及對于最終的heatmap是否可以使用softargmax轉換成坐標回歸等。這些都留在下一期的內容中。
@end
總結
以上是生活随笔為你收集整理的[开源]基于姿态估计的运动计数APP开发(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利品牌中高端新能源系列官宣 将于2月2
- 下一篇: [开源]基于姿态估计的运动计数APP开发