体感俄罗斯方块,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个关键点。然后在cocompii上进行训练,由于我的笔记本显卡是MX2502G显存,训练是真心慢,一个星期才训练了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是由于我们在原始图/4feature 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 开始游戏

点击进入到游戏界面,并点击右侧的开始按钮。然后人退到能够让摄像头将整个人都拍摄到的距离。此时,就可以愉快的享受体感俄罗斯方块了,祝君开心!

猜你喜欢

转载自blog.csdn.net/cjnewstar111/article/details/121191485
今日推荐