<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenSitUp開源項目:零基礎開發(fā)姿態(tài)估計APP

          共 3888字,需瀏覽 8分鐘

           ·

          2021-08-23 01:14



          1.項目開源地址

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

          OpenSitUp qq討論群:965762751



          2.項目簡介

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


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


          3.項目成果展示

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


          4.項目目錄

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


          4.1 DataSet

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


          4.2 LabelTool

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


          4.3 Trainer

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


          4.4 SiteUpAndroid

          Android上的仰臥起坐計數(shù)APP。



          5.項目流程:

          5.1 采集圖片

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


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


          5.2 標注圖片

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

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

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

              

          5.3 算法原理

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


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

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


          5.3 Trainer訓練工具

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

          cfg:配置文件目錄

          data:數(shù)據(jù)讀取目錄

          DLEngine:訓練引擎

          models:網(wǎng)絡模型目錄

          首先在models下的keypoint目錄下,我實現(xiàn)了上述討論的基于shufflenet的關鍵點檢測網(wǎng)絡,ShuffleNetV2HeatMap,然后在data目錄下實現(xiàn)了讀取LabelTool標注的標簽文件的數(shù)據(jù)集讀取工具:person_keypoint_txt.py。最后在配置文件夾cfgs下的key_point目錄下實現(xiàn)了針對該項目的配置文件: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開源的早,使用的人多,網(wǎng)絡支持,硬件支持都還不錯,關鍵是很多問題都能搜索到別人的經(jīng)驗,可以少走很多彎路。但是遺憾的是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開發(fā)

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

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

          項目開源地址  https://github.com/DL-Practise/OpenSitUp


          @end

          長按掃描下方二維碼添加小助手并加入交流群,群里博士大佬云集,每日討論話題有目標檢測、語義分割、超分辨率、模型部署、數(shù)學基礎知識、算法面試題分享的等等內容,當然也少不了搬磚人的扯犢子

          長按掃描下方二維碼添加小助手。

          可以一起討論遇到的問題

          聲明:轉載請說明出處

          掃描下方二維碼關注【集智書童】公眾號,獲取更多實踐項目源碼和論文解讀,非常期待你我的相遇,讓我們以夢為馬,砥礪前行!

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大鸡巴日逼网站 | 国产精品秘 国产A级 | 四虎欧美| 91久久久精品视频 | 韩国黄色三集片 |