体感俄罗斯方块,CPU就能跑,全开源
體感俄羅斯方塊游戲效果
1.背景
作為程序猿中的一只老年猿,我很渴望能夠天天運動,鍛煉身體。但迫于實際條件的限制,沒辦法每天去外面鍛煉,退而求其次,我準備在家做一些體感游戲類的運動。當下最火爆的就屬于任某堂的健身環了。也去線下店體驗了一把,效果,畫面,識別的準確率都很好,就是價格不太友好,對我這樣的“中年油膩屌絲程序員”來說,偏貴!于是我想到了是否可以自己用姿態估計做一個體感游戲呢。經過一段時間的構思,我覺得是完全可行的!
2.目標
能夠通過體感姿態,來玩俄羅斯方塊游戲,后續可以增加其他小游戲
識別要準確,速度要快,普通CPU就能運行
控制姿態可以根據自己的需要進行調整
3.界面設計
主要分為兩大塊,左邊為姿態配置、游戲界面,右邊為攝像頭檢測相關的界面。在姿態配置界面中,展示了控制俄羅斯方塊需要的四種姿態,分別是左移一格,右移一格,變形和快速向下。可以通過鼠標來修改姿態,并且可以選擇關鍵骨骼。關鍵骨骼的意思是只需要判斷我們姿態中的關鍵骨骼和配置界面中的關鍵骨骼一致,既可認為姿態符合。例如左移姿態中,只需要判斷左手和右手即可,只要左手和右手的姿態與配置的姿態接近,就認為觸發了左移動作。而不需要去判斷身體,腿部的骨骼。這樣既方便了計算,提升了效率,也增加了準確率。
?
4.姿態估計
對于體感俄羅斯方塊,單單開發一個俄羅斯方塊小游戲并不難,難的是姿態估計網絡。既要準確,又要計算量低(CPU就能運行),因此給網絡設計提出了極大的挑戰。
4.1 姿態估計網絡簡介
目前的姿態估計大致可以分為三類:第一類:top-down的姿態估計,這種姿態估計網絡首先通過目標檢測網絡定位出人,然后將人送入到單人姿態估計網絡中,由于有兩個階段,速度當然很慢,但是相對精度會高一些。第二類:bottom-up的姿態估計網絡,首先估計所有人的所有關鍵點,然后通過后處理匹配,將不同人的關鍵進行分組,得到每個人的關鍵點。這個后處理過程著實讓人難受,讓端到端的深度學習網絡硬生生的增加了一個復雜的后處理,并且這個后處理還很耗時。第三類:centernet,就是那篇object as point的論文(本質上也是屬于bottom-up的姿態估計,但是相對特殊一些,所以單獨分一類)。將目標檢測中的anchor free網絡用來做姿態估計,既不需要像top-down那樣分成兩個階段,也不需要像bottom-up那樣復雜的后處理來區分不同的人,因為它直接輸出人體實例的中心點,以及中心點相對于這個人體實例的各個關鍵點的偏移。因此流程簡潔,效率高。
4.2 姿態估計網絡的輕量化
對于第一類姿態估計網絡(top-down),想要輕量化是非常困難的,因為有串行的兩個網絡在,一般用在對于計算量不敏感,但是對精度要求高的場景。第二類姿態估計網絡可以對backbone,后處理做一些優化以達到輕量級。最典型的代表就是lightweight openpose。而對于第三類,centernet,輕量化相對會簡單很多,因為網絡本身不復雜,也沒有繁重的后處理階段,因此圍繞網絡本身的優化技術,能夠取得比較好的優化效果。因此總體思路,就是基于第三類姿態估計網絡(centernet)進行輕量化。為什么不基于第二類網絡做優化呢?例如lightweight openpose,主要是因為我們的項目只要單人估計就可以完美運行,lightweight openpos的后處理比較繁重(很大一部分計算量在匹配人體上面),而基于第三類的centernet姿態估計,天然就對各個人體實例做了分類,不需要繁重的后處理,因此優化起來相對簡單一些。
4.3 最終方案
剛開始我復用了之前OpenSitUp項目的姿態估計網絡,該項目在手機上實現了一個仰臥起坐的記數功能。該網絡使用mobilenet作為骨干網絡,最后將特征圖進行上采樣,預測頭部,膝蓋,髖部三個關鍵點。因此我直接將該網絡修改為預測頭部,肩膀,手肘,手腕等13個關鍵點。然后在coco和mpii上進行訓練,由于我的筆記本顯卡是MX250,2G顯存,訓練是真心慢,一個星期才訓練了10幾個epooch,正當我為訓練速度發愁的時候,我看到了谷歌發布的movenet,好東西,針對移動端的姿態估計網絡,基于centernet修改而來,backbone使用mobilenet,速度好,精度高,關鍵是還提供了預訓練模型,那么,不如,直接用movenet好了!!!竊喜,有大廠背書,并且還省去了訓練調參的繁瑣。
4.4 movenet原理
當然movenet沒有開源,也沒有論文,只有博客,我們還是有必要分析一下為什么movenet的結構和流程
4.5 movenet結構
輸入圖片經過mobilenet之后(5次下采樣),然后又經過3次上采樣,使得特征圖大小為原始圖片的1/4, 最后通過四個分支輸出四個tensor,分別是中心點tensor,關鍵點回歸tensor,關鍵點heatmap以及偏移量。
?
4.6 movenet流程
如下圖所示為最終的流程,首先通過中心點tensor尋找到人體的中心點,由于有多個中心點,我們尋找最靠近圖片中心的中點(step1)。然后在中心點的基礎上,根據回歸向量,可以找到所有關鍵點相對于中心的位置(step2),其實此時已經尋找到了所有的關鍵點,但是這個關鍵點比較粗糙,因為都是通過中心點附件的感受野預測來的。所以需要step3,結合關鍵點的heatmap,找到最好的關鍵點。最后的step4是由于我們在原始圖/4的feature map上進行的預測,增加該offset之后,可以恢復到原始圖中的關鍵點,進一步修正關鍵點。
?
4.7 姿態比對
如何將識別出的姿態與預設的姿態進行對比,得到姿態評分呢,我采用了關鍵骨骼的角度匹配算法。
首先對于標準姿態,例如“左移”命令的標準姿態,設置為左手舉起,如下圖左側所示。為了計算方便,我們設置四個關鍵骨骼,如紅色部分所示。中間為攝像頭捕捉到的實際姿態。那么如何計算兩個姿態之間的相似性,方法就是對比對關鍵骨骼的夾角,如下圖右側所示。最終的相似度就是 ?
?
5.安裝使用方法(Win)
5.1 安裝pytorch環境
已經安裝的可以跳過該步驟,沒有安裝的可以參考視頻教程:
windows上從零開始,離線安裝pytorch-cuda環境,提供所有安裝包,建議收藏!
5.2 下載PoseTeris源碼
從github地址clone或者直接瀏覽器下載源碼
GitHub - DL-Practise/PoseTetris: 體感俄羅斯方塊游戲
安裝依賴環境,進入到PoseTeris的根目錄,打開命令行(powershell),執行
pip install -r requirment.txt
5.3 啟動PoseTetris
進入到PoseTeris的根目錄,打開命令行(powershell),執行python main_widget.py 啟動程序
5.4 配置姿態
打開程序后默認就是配置姿態界面。俄羅斯方塊一共需要四種命令,左移,右移,變形,快速向下。默認已經有四種姿態與命令對應,左移是抬起左手,右移是抬起右手,變形是同時抬起雙手,快速向下是下蹲(注意需要膝蓋向外)。如果需要修改姿態,可以使用鼠標移動到關節點上面,點擊鼠標左鍵拖動。同時也可以修改關鍵骨骼(關鍵骨骼的作用見:姿態比對),將鼠標移動到骨骼中點,左鍵點擊,骨骼變紅,表示已經將該骨骼設置為關鍵骨骼,點擊鼠標右鍵,表示取消設置為關鍵骨骼。最終,關鍵骨骼會用紅色表示。如果想恢復默認的姿態控制,點擊姿態重置按鈕即可。
體感俄羅斯方塊的姿態配置
5.5 開始游戲
點擊進入到游戲界面,并點擊右側的開始按鈕。然后人退到能夠讓攝像頭將整個人都拍攝到的距離。此時,就可以愉快的享受體感俄羅斯方塊了,祝君開心!
?
總結
以上是生活随笔為你收集整理的体感俄罗斯方块,CPU就能跑,全开源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯视频科幻剧集矩阵官宣:《三体 II:
- 下一篇: 汽水音乐怎么取消推荐