日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP

發布時間:2023/12/15 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

更多深度學習工程實踐項目,請關注公眾號:DL工程實踐

?

1.項目開源地址

https://github.com/DL-Practise/OpenSitUp

2.項目簡介

計算機視覺中有一個應用分支叫做姿態估計,通過人體關鍵點的方式來估計出一個/多個人的姿態信息。如下圖所示:

OpenSitUp是一個基于姿態估計的開源項目,旨在幫助對姿態估計感興趣的朋友,能夠從零開始搭建一個在android手機上運行的仰臥起坐計數APP。主要的技術難點為如何讓計算量較大的人體姿態估計網絡流暢的運行在手機端,并且實現仰臥起坐的計數功能。掌握了這個項目的原理之后,可以很方便的遷移到類似的運動,健身APP當中。

3.項目成果展示

如下展示的是這個項目最后的APP效果,在人潮涌動的西湖景區,我當眾躺下做仰臥起坐,羞煞老夫也!

?

4.項目目錄

由于需要從零開始開發仰臥起坐計數APP,因此整個項目需要包含多個工程,包括數據采集,標注,訓練,部署,app開發等,整體目錄結構如下圖所示:

?

4.1 DataSet

數據集存放目錄,這里我預先放置了300多張標注好的圖片,用這些圖片已經可以訓練出“項目成果展示”中展示的效果。但是為了獲得更好的性能,您可以采集更多的仰臥起坐圖片。

4.2 LabelTool

這里為您準備了一個適用于該項目的標注工具,主要是標注人體的一些關鍵點。當您采集了很多仰臥起坐的圖片之后,可以使用該工具進行標注,生成相應的標簽。

4.3 Trainer

這是一個基于pytorch的關鍵點訓練工具,里面包含針對手機設計的輕量級關鍵點檢測網絡。

4.4 SiteUpAndroid

Android上的仰臥起坐計數APP。

5.項目流程:

5.1 采集圖片

由于沒有現成的仰臥起坐數據集,只能自己動手,豐衣足食。好在對于仰臥起坐這樣常規的運動,網上還是有很多相關資源的。這里我采用下載視頻和圖片兩種方式。先從網上搜索“仰臥起坐”的視頻,下載了10個左右的視頻片段,然后通過抽幀的方式,從每個視頻中抽取一部分幀作為訓練用的數據。如下圖所示為從視頻中抽取的關鍵幀。

僅僅使用視頻中抽取的幀會有一個比較嚴重的問題,就是背景過于單一,很容易造成過擬合。于是我從網上進行圖片搜索,得到一分部背景較為豐富的圖片,如下圖所示:

?

5.2 標注圖片

收集完數據,就是進行標注了,雖然已經有一些現成的開源標注工具,但是我用的不順手,因此自己開發了一款關鍵點標注工具,就是上面開源的LabelTool,畢竟自己開發的,用著順手。注意該工具在win10/python 3.6環境下做過測試,其他環境暫時沒有測試。使用命令python main_widget.py打開界面。初始界面非常簡潔,通過“打開”按鈕來打開收集好的仰臥起坐圖片。

?

在類別中使用0表示標注的是頭部,1表示標注的是膝蓋,2表示標注的是胯部(由于我們需要在手機上識別仰臥起坐,需要盡可能的減少計算量,姿態估計一般會預測全身很多的關鍵點,但是對于仰臥起坐,只要能準確的預測頭部,膝蓋和胯部,就能較好的進行仰臥起坐的動作識別,因此這里只需要標注三個點)。單擊鼠標左鍵進行標注,右鍵取消上一次標注。不得不說,用python+qt開發一些基于UI的工具非常方便!與C++相比,解放了太多的生產力!

標注完圖片之后,會在圖片目錄下面生成一個標簽文件label.txt,里面的內容如下:

??? ?

5.3 算法原理

我先簡單的介紹一下仰臥起坐的算法原理。在姿態估計(關鍵點檢測)領域,一般很少采用回歸的方式來預測關鍵點位置,取而代之的是采用heatmap輸出關鍵點的位置。這和anchor free的目標檢測中的centness之類的做法差不多,即通過查找heatmap中響應值最大的點來確定關鍵點的坐標。如下圖所示(只顯示部分heatmap):

??

思考了一下原因,直接回歸坐標,通常會將最后的featuremap下采樣到很小,這樣才能夠實現全局的回歸,但是關鍵點預測這種任務對位置信息非常敏感,過小的特征會極大的丟失空間信息,因而導致預測位置非常不準。而heatmap方式一般要求最后的特征圖比較大,通常是輸入圖片的1/2或者1/4,那么就非常適合做一些空間相關的任務。其實如果人為的將特征圖壓縮的很小,heatmap的方式也一樣不太準。有了上面的思考,便有了最終的方案,就是將shufflenet最后輸出的7*7的特征圖進行上采樣到3*56*56大小(考慮到最終的應用以及場景,56*56足夠實現仰臥起坐動作的識別),3表示的是3個關鍵點。然后輸出的特征經過sigmoid激活之后便得到了3*56*56的heatmaps。這里多提兩點,就是heatmap標簽的設計和loss的平衡問題。先說說標簽的設計,如果只是簡單的將標簽轉化成一個one_hot的heatmap,效果不會太好。因為標簽點附件的點實際上對于網絡來說提取的特征是類似的,那么如果強行把不是標簽附近的點設置為0,表現不會很好,一般會用高斯分布來制作標簽heatmap,如下圖所示:

另外要說的就是loss的平衡了,上面的標簽heatmap大家也看到了,無論是one-hot的heatmap還是高斯分布的heatmap,大部分的點都是負樣本點,直接使用MSE而不加以區分,網絡基本上會訓練出一個輸出全是0的heatmap。主要原因就是訓練的梯度被負樣本壓制,正樣本的梯度實在太小。因此需要做一個分區。我這里把正負樣本的比重設置為10:1。

5.3 Trainer訓練工具

Trainer工具主要包括四個部分:

cfg:配置文件目錄

data:數據讀取目錄

DLEngine:訓練引擎

models:網絡模型目錄

首先在models下的keypoint目錄下,我實現了上述討論的基于shufflenet的關鍵點檢測網絡,ShuffleNetV2HeatMap,然后在data目錄下實現了讀取LabelTool標注的標簽文件的數據集讀取工具:person_keypoint_txt.py。最后在配置文件夾cfgs下的key_point目錄下實現了針對該項目的配置文件:keypoint_shufflenetv2_heatmap_224_1.0_3kps.py,里面包含的主要字段如下:

?

啟動訓練前,將train.py文件中的CFG_FILE修改成上述配置文件即可:

CFG_FILE='cfgs/key_point/keypoint_shufflenetv2_heatmap_224_1.0_3kps.py'。使用命令 python train.py 啟動訓練。

5.4 轉換模型

在Trainer中完成訓練之后,會在save目錄下面生成相應的模型文件。但是這些pytorch的模型無法直接部署到手機中運行,需要使用相應的推理庫。目前開源的推理庫有很多,例如mnn,ncnn,tnn等。這里我選擇使用ncnn,因為ncnn開源的早,使用的人多,網絡支持,硬件支持都還不錯,關鍵是很多問題都能搜索到別人的經驗,可以少走很多彎路。但是遺憾的是ncnn并不支持直接將pytorch模型導入,需要先轉換成onnx格式,然后再將onnx格式導入到ncnn中。另外注意一點,將pytroch的模型到onnx之后有許多膠水op,這在ncnn中是不支持的,需要使用另外一個開源工具:onnx-simplifier對onnx模型進行剪裁,然后再導入到ncnn中。因此整個過程還有些許繁瑣,為此,我在Trainer工程中,編寫了export_ncnn.py 腳本,可以一鍵將訓練出來的pytorch模型轉換成ncnn模型。轉換成功后,會在save目錄下的pytorch模型文件夾下生成三個ncnn相關的文件:model.param; model.bin以及? ncnn.cfg。

5.5 APP開發

android的APP開發主要包括一個Activity類,兩個SurfaceView類,一個Alg類,一個Camera類組成。Alg類主要負責調用算法進行推理,并返回結果。這里實際上是調用的NCNN庫的推理功能。Camera類主要負責攝像頭的打開和關閉,以及進行預覽回調。第一個SurfaceView(DisplayView)主要用于攝像頭預覽的展示。第二個SurfaceView(CustomView)主要用于繪制一些關鍵點信息,計數統計信息等。Activity就是最上層的一個管理類,負責管理整個APP,包括創建按鈕,創建SurfaceView,創建Alg類,創建Camera類等。

?

具體的代碼邏輯可以查看SiteUpAndroid源碼。

總結

以上是生活随笔為你收集整理的OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。