1. 引言
国内面向大众的运动规范系统还没有得到推广,大部分的运动管理还是通过私人教练或者自我监督得以实现,除了在金钱花费上比较昂贵和自我管理意识有较高要求之外,人们的锻炼意识、进行自我运动情况管理也还不全面,开发一套动作训练系统有利于弥补当前需求的不足,即能够节省金钱也能达到规范健体的目的,还有助于进一步促进我国专业运动员训练动作规范化教练系统的发展。
本项目设计并实现了一套仰卧起坐训练系统。为了实现该系统,主要采用了PyQt进行图形用户界面开发。使用OpenCV作为视觉处理。将用户的个人信息和个人运动信息等数据使用关系型数据库保存 [1]。仰卧起坐动作训练系统实现的主要功能分为五块:在登录注册功能中,每个用户都可以独立登录使用系统,注册私人运动账号;在教程模块中,系统提供查看各个健身网站发布的信息,查看系统里面各种训练动作的文字和视频教程的功能;在运动和私人信息管理功能中,用户可以查看和修改个人信息,查询当地天气,系统给出运动贴士,进行用户备忘录的新建和增加,查看用户个人的运动情况;在检测判断功能中,实现调用摄像头拍摄并记录用户的运动视频,采用用户记录的运动视频或者摄像头直接输入的运动视频进行动作检测,依据运动检测并返回运动情况,调整各种检测的参数;在用户交流功能,用户可以发表自己的运动心得或者简单的动态以供不同用户互相交流,获取他人的运动经验等。总而言之,本系统可以为运动爱好者提供一个有效的管理平台。
2. 需求分析及项目特色
2.1. 功能需求
本系统面向运动爱好者,即该系统的用户为健身运动者。首先要为用户提供账户,因此必须要实现能够记录用户的个人信息,以提供后续功能,而用户在登录系统后,系统应为用户提供运动相关的注意事项以及教程视频、修改用户信息、查询天气以及给出运动贴士、用户个人备忘录,系统提供直接视频输入和摄像头视频输入两种方式进行运动数据的采集、自主设置一些视频采集参数如对比度、RGB、检测阈值等,系统判断用户做动作的个数并记录下来。总共需要设计5个部分:登录注册、教程提示、个人管理、检测判断、用户交流。
检测阈值主要用于系统对有效动作的判断,即当计算得出的关键点空间信息变化达到阈值,系统即认为完成了一次动作。
在本系统中,阈值的初值选取为UCF (University of Central Florida,中佛罗里达大学)体育行为数据库中的Action数据集默认阈值,以减少重复训练和无效训练损耗。考虑到不同地区可能存在的人体生理学差异,使用了本地录制的训练数据集对阈值进行校正,使之对本地人群拥有更高动作识别率。
2.1.1. 登录注册
在登录注册模块中,用户若已有账号,可以直接登录然后使用后续功能,用户若没有账号,需要进行注册,用户需要输入自己的个人信息,并且经过系统自带的验证检验过后,成为一位仰卧起坐训练系统的用户,再由系统随机分配六位随机数作为账号。因为本系统中的各个功能都与“user_ifm”表中的账号索引相关联,故用户只能在登录过后才能使用其他功能。这样的设计能够保证数据库表关系的紧密,系统的完整性,和各个功能模块的低耦合。
2.1.2. 教程提示
在教程提示模块中,用户可以看到系统内已经提供的视频教程,或者提供的健身网站找到对应的视频、文字教程来进行对应动作的学习。该功能的面向对象是运动爱好者,用户通过观看文字或者视频教程,能够更清楚地了解不同标准的仰卧起坐,可以帮助用户更好地通过仰卧起坐来锻炼不同部位的肌肉。
2.1.3. 个人管理
在个人管理功能中,系统要知道用户信息,因此用户需要登录,用户可以查看并编辑自己的信息,查询自己所在地的天气信息,系统会根据天气信息来做出对应的运动贴士与注意事项,用户还可以在系统中使用备忘录,进行查看和修改自己的日程,用户可以查看自己做了多少个动作。
2.1.4. 检测判断
在检测判断模块中,用户可以使用两种不同的方法输入数据进行检测判断,分别是直接输入通用视频格式的视频数据,或者通过摄像头终端读入的视频数据,用户还可以调整视频帧的处理参数,如:调整对比度、调整色彩空间、调整检测阈值,用户可以看到检测特征点的过程,看到系统经过检测后返回的运动情况。
2.1.5. 用户交流
在用户交流模块中,用户在登录自己的账号后,可以使用该功能发送消息或动态,也可以查看其他用户使用该功能发出的所有消息,起到交流运动心得的作用,用户还可以查看其他用户的情况。
2.2. 项目特色
本项目具有以下四个方面的典型特色。
1) 可移植性方面。
该项目由非常好的移植性,因为开发时使用PyQt [2] 开发用户图形界面、Python语言开发功能,并且Python的可移植性好,此外使用的函数库与数据库也是支持各个平台的,不仅可以在微软平台上成功运行,也能在OS系统上或者其它支持图形界面显示的操作系统上运行。
2) 开发结构方面。
本系统使用十分合理的开发结构,无论是前期进行开发、中期维护还是后期修改都十分方便,避免开发者为了弄清楚杂乱的程序结构而要花费的多余时间。对于用户,系统提供了良好的用户界面,降低了用户学习使用的成本,减弱了上手的难度。
3) 函数库和接口方法。
程序的开发中使用了许多现有的函数库和接口方法,以及已经训练好的训练模型,使用这些方法让整个项目看起来更简洁,也让开发更加快速。
4) 图形处理和深度学习。
项目的核心主要使用了图形处理和深度学习,相比传统的处理更加高效,开发的领域也更广。更加能够符合现在更复杂、更具体的系统要求。例如:在检测并提取人体关键点时,使用深度学习更加方便,得到的结果更加准确。
3. 项目设计及实现
3.1. 系统整体框图
仰卧起坐动作训练系统整体的功能被划分为五块,分别是登录注册、教程提示、个人管理、检测判断和用户交流模块。其中核心的模块是检测判断,主要是使用摄像头或者直接输入视频信息来对用户的仰卧起坐动作进行检测并为个人管理模块中的动作统计提供数据来源。个人管理模块主要为用户展示检测判断结果和对用户自己的运动情况进行备忘等。登录注册、教程提示与用户交流模块属于为用户提供额外的功能,丰富了该系统中用户可以使用功能。系统的整体框图如图1所示。
3.2. 登录注册模块的设计与实现
1) 界面设计说明
本系统的登录界面元素主要为Lineditor_ID输入框,Lineditor_password输入框,注册按钮还有基础的页面容器。当用户没有已经申请的账号可以使用,则必须点击Signup注册按钮进行下一步。点击Signpushbutton后,会显示输入具体信息的Widget容器。这个页面元素主要为Linedit_name输入框、Comox_sex选择框、Linedit_age输入框、Linedit_phone输入框、Linedit_password输入框、Sign_up按钮、Cacel按钮和基础的页面容器。
2) 算法设计
该模块没有使用特殊的算法,登录即读取用户输入,进行正则判断后插入数据库,注册稍有不同,首先是要从注册界面的文本框中得到要插入数据库的个人信息,进行正则判断后无异常后,随机生成六位随机数作为账号,然后将获取的用户个人信息作为参数,传入数据库工具类提供的函数对用户信息进行保存操作,并在函数的最后要将用Random函数生成的6位随机数返回给用户的前台,提醒用户记住自己这个独一无二的账号。有了它,用户才能登录系统,体验更多的功能。
3) 方法类说明
登录时使用的主要有以下的类及方法。View_login类说明,功能是定义登录界面的元素布局与样式,主要方法有InitUI方法,初始化界面的UI (User Interface,用户界面)设计布局;Set_palette方法,设置背景图。注册时使用的主要有以下的类及方法。Signup类说明,功能是定义注册界面的元素布局与样式;其中主要方法有btnFunc方法,启动进度条线程;Signal_accept方法,传入参数插入数据库并反馈消息。MySign_upThread类说明,这个类是自己Qt库线程类,自定义的线程类,为了进行异步显示进度条;主要方法为Run方法,启动后,进度条会随着时间进行变化,将等待插入的过程可视化,增强了用户的交互感。
4) 处理流程图
登录注册模块处理流程如图2所示。

Figure 2. Login and registration module flowchart
图2. 登录注册模块流程图
3.3. 教程及提示模块的设计与实现
1) 界面设计说明
登录界面如图3教程主界面所示,页面容器,展示图片滚动播放的label,可以进行区域滚动的滑动块,以及可以进行其他功能选项的按钮和输入框,还有可以允许用户播放视频的按钮,可以供用户进行网页访问的超链接标签选项。
2) 算法设计
本模块主要是用的算法是从数据库中读取对应的教程资源,并将其展示在系统UI上供用户阅读。对于网络资源的恶处理,则是预先加载Web引擎,当用户点击超链接标签时,为用户打开网页资源,浏览网上的资源。
3) 方法类说明
点击超链接时使用的主要有以下的类及方法。WebFunc类方法说明,功能是为用户打开超链接,加载Web资源;主要方法有openUrl方法,传入URL,通过实例化的QWebEngineView打开网页资源。展示教程时使用的主要有以下类和方法。Search类方法说明,功能是将文字教程展示在系统UI界面上,主要方法为InitSearch方法,查询数据库中的教程信息,通过循环的方法将对应的信息显示在UI界面上。
3.4. 个人管理模块的设计与实现
1) 界面设计说明
该模块页面的主要元素有页面容器,选择查询城市的下拉框,展示查询天气结果的文本展示区,展示系统给出的贴士文本展示区,根据不同天气展示不同图片的标签,可以允许用户进行备忘录插入更新的选项按钮,展示备忘录的行展示区域。展示用户个人信息的标签以及可以修改个人信息的按钮。
2) 算法设计
当用户进行备忘录操作时,用户先进行输入,系统打开外部文件,并判断是否可写,若可写则进行行写入操作,如不可写则抛出异常。当用户进行个人信息修改时,先将修改后的对应的个人信息与数据库中的进行对比,若无变动则不修改,若有变动则使用update语句对数据库中的数据进行修改。
3.5. 检测判断模块的设计与实现
1) 界面设计说明
用户想要进行特征检测时使用界面的主要元素有页面容器,供用户进行灰度显示或者彩色显示的单选框,在彩色显示的情况下可以运行用户进行色彩空间的滑动条和调整框选项,进行亮度和对比度调整的滑动条,进行系统提供的运动录像保存路径的行编辑区域,进行保存路径选择的File选项按钮。展示帧率,图像尺寸的LED数字框,展示当前摄像头运行情况的文字框。以及一些进行摄像头操作的选项按钮。检测的界面如图4所示。
2) 算法设计
目前行为识别方法比较主流的是动作识别。动作识别即通过对动作特征的提取和对提取特征所组成的特征集进行分类来完成无先验经验情景下对一般动作的识别和匹配,这样一个行为识别系统即由行为特征提取和分类器两个子模块组成。
通过对训练数据进行特征提取,采用有监督或无监督条件对卷积神经网络进行训练即可得到一个可对新入数据进行特征提取和分类的AI (Artificial Intelligence,人工智能)。本系统的动作识别系统便是基于这一思想设计开发。
在本系统的使用场景中,对仰卧起坐的识别通常不存在背景动态或视角的变化,几乎没有人与人、人与背景的相互遮挡,姿态范围也相对有限,因此选择采用TensorFlow框架进行人体全局特征的提取并连通人体的关节点,再对由连通的关节点形成的骨架图进行跟踪和识别。
实际技术实现中,本系统将用户上传或摄像头获取的视频流以40帧的帧率保存至video文件夹下,然后调用卷积神经网络 [3] 逐帧进行处理,将得到的单个输入深度图像分割为部分置信图集和矢量场 [4],然后使用偶匹配处理这些被提取的特征,从而确定部位之间的关联,最后进行关键特征点空间位置的计算,得到动作的估计数量。
3) 方法类说明
PoseEstimationFunc类说明。主要的功能是根据摄像头输入的视频流信息提取人体关键点。主要方法为Skele方法,在其上绘出人体关键点,连接起来返回给主函数,调用disp方法显示在本系统的用户界面。TestPoseNet类 [5] 说明。主要功能是根据直接输入的视频流信息进行处理并把处理的每一帧以40帧的帧率保存到本项目的Video文件夹中。主要方法为process方法,根据传进来的视频保存路径使用OpenCV进行读取视频帧,读取模型进行关键点预测,再根据得到的人体关键点对进行空间上位置的计算,判断动作个数后保存进数据库中。
4) 处理流程图
检测判断模块的检测判断流程如图5所示。

Figure 5. Testing and judgement flow chart
图5. 检测判断流程图
3.6. 用户交流模块的设计与实现
1) 界面设计说明
该模块页面主要的元素有页面容器,展示用户动态的ListView页面容器,用户可以在这个页面容器里面查看本人和他人的动态消息,还有展示所有运动用户运动数据排行榜的tablewidget,系统进行多表查询,将得到的排序后的运动结果返回给前台进行显示,用户还可以点击lable代表的新建选项,用户点击后,可以发布当前想要分享的动态,可以是运动新获取的,也可以是随意的内容,数据库会记录下来发送的内容和发送时间,并在列表视图中显示出来,实现用户交流的效果。
2) 算法设计
用户输入文字信息,并尝试写入数据库,在工具类中的操作数据语句能够正常接收文字参数后使用insert函数插入数据库。当想要展示给用户数据库中储存的动态,即使用select函数选择数据库中的数据并在动态的UI界面进行展示。
3) 方法类说明
SQLTooL类说明。主要的功能是更新或查询用户数据。用户动态展示主要方法为querydisscuss,查询动态表中所有用户索引对应的消息内容,并将查询得到的结果转换为列表返回给前台。用户动态的发布主要方法为insertdisscuss,将用户输入的文字信息作为参数传入工具类方法,并插入数据库,完成发布动态。
3.7. 数据库设计
数据库的ER图(Entity Relationship Diagram,实体–联系图)如图6所示。将该系统中主要使用的user_ifm表、user_affairs表、user_discuss表和user_situpcount表之间的关系表现出来,这几张表主要是通过user_ifm的主键user_code作为索引相互关联,尽量避免了多个表储存相同的运动信息而造成的冗余。比较好的将各个表储存的信息进行分类,有利于后续的多表查询和更新操作。
4. 特殊问题、解决方案及结果测试
4.1. 摄像头保存运动视频问题
1) 问题描述
使用摄像头保存至本地的视频无法打开以供后续的检测使用。
2) 解决方案
在系统界面展示的视频分辨率为1280*720分辨率的图像输入,而保存下来视频帧格式是640*480,导致写入格式出问题。
使用VideoWriter函数将得到的每一个图像帧保存为视频有一个很容易犯的错误,参数framesize需要先输入保存帧的宽在输入长,并且图像帧必须为BGR模式。
此外视频的编码格式常用的为DIVX、XVID、X264和MJPG,而一般我们使用的更多的是MP4、AVI、QuickTime格式的视频,因为进行开发时使用的是MacOS操作系统,因此选择使用MJPG进行数据视频的解码。
3) 结果
可以正常的保存视频来为后续的检测特征点提供视频资源。
4.2. 测试环境
本系统的主要测试环境是MacOS操作系统环境,进行测试的框架环境为PyCharm,测试主要针对整个系统的流程完整性进行测试,例如对PyQt进行测试时,可以使用QTest,而对数据库进行测试可以使用集成的数据库可视化工具编写对应的SQL语句或点击操作对其进行测试检验。对于核心的用户检测,选择使用编译器自带的debug进行测试。
4.3. 测试范围
主要对各个功能进行单元测试,并且对该系统中每一个功能的流程完整性进行相应的人工测试。
1) 用户登录注册模块测试
若用户没有账号进行登录,使用后续提供的功能时,需要提醒用户进行注册。这时检测设定的正则表达式是否能够正确约束用户的输入。如输入电话时不能超过13位,只能出现数字而不能出现字母,当用户进行年龄输入时不能输入字母和超过3位数的数字等等。当用户注册成功,需要有相应的反馈提示用户已经注册成功,并让用户记住自己的随机生成账号以进行后续的登录,当注册失败时,必须要有消息提示正在等待注册结果的用户,而不是没有任何提示,因为这样可能会让用户误以为注册成功了,却无法获取随机码,损害用户体验。当注册成功后,用户可以重新回到登录界面进行下一步的登录操作。注册界面如图7所示。
2) 用户教程提示模块测试
用户登录过后首先可以看到教程提示模块。当用户点击文字教程对应的视频教程,应该要能正常打开资源视频播放。教程页提供的网站资源,也要保证能够用本地的浏览器打开进行正常的浏览。
3) 用户个人信息修改模块测试
用户登录过后,在选择进行修改个人信息时,应保证界面内要修改的内容不能为空,否则抛出异常提醒用户修改失败。用户正常输入要修改的信息时,也要对用户的输入进行检验,若不满足则不被允许修改。当用户提交修改信息后,系统也要对本次修改的结果给用户提示。
4) 用户天气模块测试
用户可以进行多地的天气查询,用户只能通过下拉框中的城市进行选择,避免因为本人输入错别字等情况,造成城市和对应编码无法一一对应,无法进行结果查询的后果。当用户完成天气查询时,系统需要将查询的天气信息字符串展示在界面上,对于不同的天气,对应显示不同的图片,还要在对应的天气进行不同的贴士推送,给予用户运动提醒。该内容可在图8个人管理界面查看。
5) 用户动作检测模块测试
用户可以进行运动情况的监测。首先用户可以选择直接的摄像头输入或者是直接的视频输入。不能两个同时选择输入,造成系统的错误。在进行摄像头输入的情况下,如果选择灰度模式,则不能调整色彩空间,无法进行特征点检测模式。当用户选择直接输入视频时,必须要选择通用格式的视频,不能使用特殊处理过的视频输入,避免系统视频解码器无法解析视频,导致无法检测的问题。视频输入后,将输出的视频结果保存到指定文件夹中以供查看,把判断的最终动作个数插入user_situpcount表中,方便用户的查询。如图9所示。
6) 用户备忘录模块测试
用户点击日历的日期要能展示出日历对应的备忘录情况。用户点击操作备忘录按钮后,要可以弹出对话框让用户进行新备忘录的输入。进行输入并保存后,日历下方展示备忘录信息的部分要能正确展示备忘录内容。该内容可在图8个人管理界面查看。
4.4. 性能分析
1) 功能性
该系统除了实现最核心的检测模块,还为用户提供了诸如天气、个人运动情况、备忘录、个人信息、动态分享、教程提示等的功能性模块,将整个系统的功能集成,最大程度的展示给用户。
2) 可用性
该系统提供了较为良好的用户界面,避免了使用本系统的用户因为复杂的选择操作而提升学习成本。界面的布局清晰简约,标明了每一处所提供的功能,只需要根据选项进行点击、拖动或者选择上传对应的文件,就可以很好的使用这个系统。
3) 准确性与稳定性
该系统由于具体算法的选择和开发机能限制,进行视频处理时较慢,处理20秒以内的视频并且保存在文件夹中需要接近半分钟的时间进行处理。使用OpenCV和TensorFlow [6] 进行对用户特征点提取的精确度较高,能较为准确的勾画出人体骨架位置 [7]。对于一个仰卧起坐动作的完成与否判断,是根据特征点的空间信息来进行实时判断的,当用户部分的姿态被遮挡 [8] 或者并非正面展现,使整体骨架预测失误可能会导致对于动作的估计出现问题。当用户没有按照特定的姿势进行检测,也可能会导致估计出现一定的问题。综上,检测并进行估计的准确性,可后续在算法上进行优化,进一步提升系统 [9] 性能。
该系统在用户采用正确的姿势且无遮挡的情况下不易受光照、距离、镜头等干扰,在400流明以上、10米以内、人体有效分辨率高于154 × 60的环境中能保持95%以上的准确率,具有较好的稳定性。
5. 结束语
本系统通过分析当前运动在人们生活中的重要性、结合软件和现实的可结合性,使用PyQt+OpenCV两种技术设计开发完成。整个系统的开发使用了合理简洁的开发架构,不仅方便程序员的开发维护,同时还为用户提供了易操作的用户界面,为运动爱好者提供了一个可以获得运动教程、管理自己运动情况、与他人分享运动技巧的平台。使用本系统,运动爱好者可以更方便快捷的了解运动的咨询并且能够体会到更加个人化的运动情况管理,实现了独自在家也能进行运动的健康模式,带来了新的个人运动管理方法。系统的主要功能有这些,通过SQLite数据的操作可以允许用户登录系统的个人账号,注册自己的个人账号,查看各个健身网站发布的信息,查看系统里面各种动作的文字和视频教程,查看和修改个人信息,根据天气网站提供的API查询当地天气得到JSON串,可供用户查询各地的天气情况,并由系统给出运动贴士,使用Python文件流的操作进行用户备忘录的新建和增加,查看用户个人的运动情况,使用OpenCV调用摄像头拍摄并记录用户的运动视频,使用Openpose或PoseNet算法对用户记录的运动视频或者摄像头直接输入的运动视频进行动作检测,进行运动检测并返回运动情况,调整各种检测的参数,发表自己的运动心得或者简单的动态以供不同用户互相交流,获取他人的运动经验等。系统在虚拟与现实之间找到了结合点,让用户可以直观地了解自己的健身情况,并且充分利用了身边的终端资源,不必多出其他的开支,为身体健康和推广运动的重要性提供了良好的平台。
致谢
成都信息工程大学计算机学院鄢田云博士/副教授是本论文的指导教师和通讯教师,感谢鄢老师对本论文涉及的大创项目系统开发、论文撰写的悉心指导和修改建议。感谢成都信息工程大学教务处对本论文成果来源的大学生创新创业训练计划项目及论文版面费支持。
基金项目
国家级大学生创新创业训练计划项目(S201910621020),四川省大学生创新创业训练计划项目(S201910621081),成都信息工程大学创新创业训练计划项目(202010621128, 202010621141, 202110621163, 202110621173)。