回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

AI瑜伽训练器 简单

头像 lastbullet 2020.02.04 1027 0

新型冠状病毒来势汹汹,加上爆发于春运前夕,短时间内便席卷全国。面对如此凶狠的疫情,在当前没有特效治疗药物和疫苗的情况下,大家最有力的武器就是你自己,确切的说是人类几百万年进化而来的免疫系统。就目前的情况来看,感染新型冠状病毒后的自愈率并不算低,至少90%以上。有的人容易感染,有的人比较不容易感染,同样感染病毒后,有的人只有轻微症状,而有的人却会发展为致命的重症,差异的一个重要原因就是免疫力的强弱。

为了配合国家尽快控制住疫情,目前大家应该都是尽量禁足在家的状态。足不出户的情况下,如何有效增强免疫力呢?答案就是各种室内运动,其中瑜伽运动因为基本不需要额外的器械,入门相对容易且老少皆宜,不失为一个好选择。练习瑜伽,最怕的是姿势不标准,达不到良好的锻炼效果不说,还有可能造成运动伤害。为此,基于百度人工智能API的瑜伽训练器就诞生了。


材料清单

  • 带摄像头的笔记本电脑 X1 链接
  • 掌控板 X1 链接
  • 掌控板IO扩展板 X1 链接
  • URM10超声波传感器 X1

功能原理:使用摄像头拍摄用户照片,然后调用百度人体关键点识别API识别人体头部、手、肘部、膝和脚,获得关键点坐标。然后计算用户各关键点的坐标与程序内置的标准瑜伽姿势人体关键点间的距离,以此来判断用户的姿势是否标准。在运动过程中,程序会持续拍摄和检测,用户姿势标准的情况下,进度变量将会累加,反则递减,因此用户需要保持标准姿势一定时间才能完成当前姿势并进行下一个姿势的训练。程序界面中会有关键点覆盖层显示,以便用户参考标准调整自己的姿势,另外界面上的心形动画可以提示用户当前训练进度,心形图案颜色会随着当前姿势进度变量累加而变深。

步骤1 进行准备工作,帮助用户调整摄像头角度和距离

由于此程序判断用户姿势是否标准的算法是将用户人体关键点与内置标准姿势关键点进行比较,因此要获得良好的使用效果,需要确保用户在摄像头拍摄区域中的位置尽可能接近标准姿势图片在舞台中的位置。为了帮助用户调整好摄像头与自己的距离以及拍摄角度,首先在程序的背景中添加一张站立的人体轮廓图(背景名称“ready”),用户可以根据摄像头实时拍摄的图像来确认自己在画面中的位置是否与舞台中的轮廓图一致。除此之外,我们使用超声波传感器来判断用户离摄像头的距离是否在合适的范围,不同的电脑摄像头,这个合适距离可能会不一致,在我的笔记本电脑上这个合适的距离大概是2.3米,因此我们编写程序判断用户如果不在2.0-2.5米范围内,使用语音提示用户站得太近或太远,当用户所处位置比较合适以后,准备工作完成,背景图切换至第一个训练姿势。

project-image
project-image
project-image
project-image
project-image

步骤2 加载训练标准姿势数据

当用户调整好距离开始训练后,主程序广播next_pose消息。对应的next_pose消息接收程序需要做下面几项工作,首先将训练进度变量progress初始化为0,接着切换到下一个背景,然后将该背景所对应的标准姿势关键点坐标赋值给pose_x和pose_y列表。

project-image

步骤3 使用人体关键点识别API获取用户动作数据

主程序在完成初始化工作后将进入循环代码,循环中反复拍摄用户照片并调用人体关键点识别API对照片进行分析识别,如果识别成功则将识别到的用户关键点坐标信息依次存入body_x和body_y列表。这里需要特别注意的一点时,在将识别到的人体关键点坐标存入列表时,务必保证body_x,body_y中身体关键点的存入顺序与pose_x和pose_y中一致,这样后面对比数据时会比较方便,而且不容易造成混乱,说简单一点就是保证用户动作数据和标准姿势数据中头与头比,手与手比,脚与脚比,如果存入顺序不一致,就会出现例如头与手比,脚与手比的情况,这样一来无论用户姿势多么标准也无法训练过关。

project-image

步骤4 判断用户姿势是否标准

当识别人体关键点成功并将坐标存入列表后,主程序会广播recognized消息。之后我们需要一段程序来处理recognized消息,判断用户动作是否标准,并在背景的标准姿势图案上绘制用户关键点的覆盖层以便用户对比自己的姿势与标准姿势。在这段代码中,我们首先将body_parts_index变量初始化为1,这个变量是稍后用来从body_x,body_y,pose_x,pose_y列表中获取元素的索引。现在四个列表中都存储了头部,左手腕,左手肘,右手腕,右手肘,左膝,左脚踝,右膝,右脚踝的关键点坐标数据,我们循环9次,并且每次循环将body_parts_index变量增加1,这样就可以把从头到脚的数据都从列表中提取出来并进行计算对比。在计算比对时,为了让代码比较简洁,我们可以自定义一个calculate函数。calculate函数有4个参数,分别是body_x(用户动作关键点x坐标),pose_x(标准姿势关键点x坐标),body_y(用户动作关键点y坐标),pose_y(标准姿势关键点y坐标)。计算方式我们采用简单的计算平面中两点间距离的公式,如下图。

project-image

假设P(x1, y1),Q(x2, y2)为平面中两点,通过上面的公式就可以计算获得P, Q间的距离。我们的程序通过这样的方式来计算用户动作关键点与标准姿势关键点的距离,并将计算的结果存入diff变量,用户的动作越贴近标准姿势,diff变量的值就越小。然后程序将diff变量与程序预设的最大允许偏差值变量tolerance进行比较,如果diff小于tolerance就判定用户姿势标准,将进度变量progress的值加1,反之则认为用户姿势偏差太大,作为惩罚将进度变量progress的值减1。判定的过程反复循环,直到进度变量达到100,此时用户当前所训练的姿势已合格,程序广播next_pose消息进入下一个姿势的训练。

project-image
project-image

步骤5 用于提示用户的界面信息

完成上面的步骤后,程序最主要的功能就已经成型了。但是为了提升用户的使用体验,我们还需要在界面中增加一些给用户的提示信息。首先为了方便用户参考标准姿势调整自己的动作,我们需要将用户动作的关键点以半透明的圆形绘制到界面中,并且将合格的关键点绘制为绿色,不合格的关键点绘制为红色,这样一来用户就可以准确的的知道自己身体哪个部位动作不到位并进行调整。然后为了鼓励用户,我们需要将用户当前动作的进度值在界面上表现出来,将进度值变量直接显示出来当然也可以,但是用户离屏幕远的话不容易看清,而且容易让用户在运动时分散注意力。所以我们考虑将进度值转换为一个右上角跳动心形动画的颜色值,进度值越高,心形颜色越深,反之越浅。同时在进度超过一半和四分之三时,程序用语音来鼓励用户。至此,我们的AI瑜伽训练器就完成了,让我们在家也动起来,提升自身免疫力,共同对抗疫情吧!

project-image
project-image
project-image

步骤6 项目总结

百度的人工智能API结合Mind+图形化编程极大的降低了AI应用的使用门槛,有利于促进相关应用的开发和推广,活动期间众多新奇有趣的参赛项目也让人眼前一亮,大家得到了很好的交流与成长机会,在这里要感谢组织活动的DF,希望以后也能参与更多有趣的活动。针对本项目而言,由于调用百度API要通过web,网速良好的情况下,识别的帧率也只有1到2帧每秒,因此用户作出动作后程序给出识别反馈的滞后时间比较长,后面有机会想要尝试一下有神经网络计算加速芯片的本地方案。

评论

user-avatar