APP下载

基于BlazePose和KNN 的健身计数系统设计与实现

2023-07-12孔亚琪

软件工程 2023年7期
关键词:计数器置信度关键点

孔亚琪,刘 宇

(南京邮电大学教育科学与技术学院,江苏 南京 210023)

0 引言(Introduction)

目前,健身运动已经成为人们的一种生活方式,AI健身技术可以帮助用户更好地完成健身动作,从而达到更好的健身效果。健身动作具有多样性和复杂性的特点,现有的健身动作识别与计数方法尚存在一些问题,例如识别精度低、计数不准等。因此,如何提高健身动作识别与计数的速度和准确率,成为当前研究的热点和难点。

近年来,国内外学者对于健身动作识别与计数进行了广泛的研究。其中,基于深度学习的方法得到了广泛应用。例如,YANG等[1]使用卷积神经网络(CNN)识别深蹲和俯卧撑等动作,但是此方法需要大量的数据集与计算量才能达到较高的准确度。基于传感器的方法是一种常见的健身计数器的设计方案,主要使用加速度计、陀螺仪等传感器测量用户的运动状态,并统计用户完成的动作次数。例如,MURO-DE-LAHERRAN等[2]使用陀螺仪和加速度仪计数深蹲、引体向上等动作。尽管此方法具有较高的计数准确度,但传感器的佩戴会对用户运动过程的舒适度和体验感造成一定的影响。为解决以上问题,本文使用BlazePose模型对人体的33个关键点进行检测,运用KNN算法作为动作分类器,对悬停动作与当前动作关键点之间的距离进行相似度度量,用于判断用户是否处于健身的动作中,加入计数器统计动作次数,并对其健身动作进行实时记录。

1 系统简介(System introduction)

本文所提健身动作检测与计数系统基于BlazePose模型和KNN算法,可以自动检测和计数多种常见的健身动作,如深蹲、俯卧撑、引体向上、仰卧起坐等。该系统利用BlazePose模型实时跟踪人体骨骼关节,提取人体运动动作的特征,并使用KNN算法判断当前的健身动作类型并加入计数器进行计数;并且,该系统具有良好的计数准确率和实时性,可以实现对健身动作的高效计数和检测,使用户能够更加方便且有效地进行健身训练。此外,该系统可以记录用户的运动数据,并将运动数据保存到本地文件资源管理器,方便用户进行健身记录查看和分析。此健身计数系统的功能流程图如图1所示。

图1 系统功能流程图Fig.1 System functional flowchart

2 系统关键模块设计(Design of key system modules)

2.1 健身动作检测与计数模块设计

健身动作检测与计数模块为该系统的关键模块。首先,该模块使用BlazePose检测并跟踪健身者的身体姿势;其次,根据检测的姿势生成人体相应的33个关键点坐标,针对每个动作类别,系统会预先收集许多相应类别的健身动作样本并进行模型训练,每个样本对应一个正确执行该动作的健身者姿势序列,对于新检测到的动作,该模块通过摄像头传入的人体姿势关键点并计算其33个关键点与每个训练样本关键点之间的相似度,使用KNN算法确定最合适的类别标签;最后,加入计数器用于对每个动作的执行次数进行计数。健身动作检测与计数的算法流程图如图2所示。

图2 健身动作检测与计数算法流程图Fig.2 Flowchart of the algorithm for detecting and counting fitness pose

2.2 BlazePose和KNN简介

图3 BlazePose模型关键点位置Fig.3 Key point positions of the BlazePose model

K最近邻算法(KNN)是一种基于实例的学习算法,可用于解决分类和回归问题[4]。在该模块中,KNN 算法通过计算样本之间的距离对数据进行分类,从而识别健身者正在执行的动作。

2.3 训练样本

2.3.1 提取样本关键点坐标

首先,将数据集样本图片分为两类放入两个不同的文件夹中,以深蹲为例,将数据集图片分为两类,分别为完全蹲下状态和完全起立状态,放入squat_down和squat_up两个文件夹中,然后调用一个名为bootstrap的函数,该函数可以从一组图像中提取人体姿势关键点坐标,并保存这些坐标。

2.3.2 提取样本特征

特征提取的过程是通过将姿势的关键点转换为特征向量实现的。这些特征向量可以被看作是数字表示,它们捕捉到了关键点的相对位置和方向等重要信息,并且可以用于训练姿势相关的深度学习模型[5]。将已保存的关键点数据复制到一个名为samples的列表中。使用PCA 算法(一种常见的数据降维方法,通过线性变换将高维数据转化为低维数据,并且保留数据的主要特征)对samples列表中的姿态关键点数据进行降维处理。降维后的姿态关键点数据称为特征向量,将这些特征向量写入CSV文件中,即可得到每个动作对应的特征向量。

2.3.3 归一化处理

对于已经提取的样本特征,进行归一化处理可以使不同特征之间的比较更加准确和公平,从而提高机器学习算法的性能和模型的泛化能力[6]。归一化处理后,可以将不同身高、体型的人的姿势映射到相同的尺度下,从而方便进行特征提取、姿势分类和计数等操作。如果没有做归一化处理,由于不同的姿势关键点取值范围可能不同,导致不同姿势的特征向量之间难以比较。并且,归一化处理可以有效地降低噪声对关键点特征提取的影响,这是因为一些关键点的取值范围可能与其他关键点不同,导致它们对特征向量的贡献有所偏差。通过归一化处理,可以将这类偏差降至最低,从而减少噪声对关键点特征的干扰[7]。因此,对人体姿势关键点进行归一化处理,可以提高模型的鲁棒性和泛化能力。

⑯程元敏先生已检出并加以分析。参见程元敏《尚书学史》,华东师范大学出版社2013年版,第1184~1188页。

本文采用最大最小归一化(Min-Max Scaling)方法进行归一化处理,第i个关键点坐标的原始取值为(x i,y i),那么它的归一化处理后的值为),具体归一化处理公式如下:

2.3.4 异常样本识别与剔除

识别异常样本的方法是通过计算每个样本的嵌入向量与输入姿势嵌入向量的欧氏距离,将距离大于某个阈值的样本识别为离群点[8]。距离越大,表示两个特征向量之间的差异越大,越有可能是离群点。通常,阈值的取值范围是在0~1,该范围内的值可以表示距离的比例关系。当阈值为1.0时,意味着输入姿势嵌入向量与识别为离群点的样本的嵌入向量之间的欧氏距离为1以上,这意味着异常样本与输入样本特征向量之间的差异较大,可能为错误数据,应该被排除或者进一步分析处理。将阈值设置为1.0后,检测到3张异常样本图片,定义一个remove_outliers函数即可剔除这个图片文件及其相应的关键点数据。剔除异常样本后会排除一些异常噪声或错误数据,可以进一步提高模型的鲁棒性和泛化能力。

2.4 构建动作分类器

KNN动作分类器是机器学习模型的其中之一,可用于分类人体动作。该模型通过将人体特征转化为向量形式,并计算不同向量之间的相似度,利用KNN算法根据最近邻标准对相似度最高的几个向量进行分类[9]。KNN动作分类器具体实现算法如下所示:

将已训练的CSV样本文件输入KNN 模型,KNN 模型使用基于欧氏距离的相似性度量方法,计算数据集中所有样本和当前摄像头输入样本的特征向量之间的距离,这个距离就是摄像头输入的当前帧与已训练的样本之间的相似度。在这个过程中,k个训练样本与测试样本之间的相似度可以被解释为置信度,因为该值反映了分类器输出结果的可信程度[10]。例如,当k个训练样本中有n个样本属于down(蹲下)类,m个样本属于up(起立)类时,该测试样本被分类为down(蹲下)类的置信度可以表示如下:

其中,k表示KNN分类器选择的最近邻数。如果n越大,则置信度越高,这是因为更多的训练样本被投票选为down(蹲下)类。同样,被分类为up(起立)类的置信度可以表示如下:

将检测down(蹲下)的阈值设为0.6,即如果检测到当前动作置信度大于0.6,即可以认定健身者处于深蹲健身动作中,对于健身者进入深蹲健身状态,标记为True,则计数器可以运行;否则不会进行检测与计数。图4为一个连续做5个深蹲的健身者的处于down(蹲下)状态的置信度检测结果图(图中斜线阴影部分为经过平滑处理后的置信度检测结果),横轴为帧数,竖轴为置信度。

图4 连续深蹲的健身者处于“down”状态置信度检测图Fig.4 Confidence interval detection graph of a fitness enthusiast in a continuous″down″state squat

2.5 计数器实现

计数器主要用于计算给定目标姿势类的重复次数。通过输入动作分类器的结果,获取给定动作的置信度。如果置信度超过进入姿势的阈值,则开始计算该姿势的重复次数。当置信度低于退出姿势的阈值时,即完成一次姿势,并记录该动作的开始时间、结束时间、动作持续时间和与上一次动作的间隔时间等。检测过程中,会将结果写入Excel表格并按照一定格式保存。计数器实现算法具体如下所示:

3 实现与验证(Implementation and verification)

3.1 数据采集

本文选取了三名身高体重相差较大的体育生作为数据采集对象,通过拍摄其在多种不同场景下的健身动作,尽可能地保证数据收集的全面性。三名体育生的身高和体重分别为170 cm、64 kg,179 cm、75 kg,185 cm、86 kg。三名体育生分别进行持续的深蹲、俯卧撑、引体向上动作,使用25 FPS的录像设备在不同光线、不同场地、不同拍摄距离的情况下进行水平状态下的360°循环拍摄。拍摄的健身数据将用于后续对运动姿态识别的研究与分析,为更准确和可靠的运动姿态识别算法的开发提供基础数据支持。

3.2 数据预处理

为了更方便地采集运动者动作的图像数据信息,本设计利用Python编写图片帧提取的程序,具体要求为将MP4格式的视频以每秒5帧的速度进行图片帧提取,将数据集录像输入程序即可快速提取录像的帧。对于提取的视频帧进行手动筛选后,共得到300张图像,即每种运动类型的图像100张作为数据集,提取的部分深蹲数据集图片如图5所示。

图5 深蹲数据集Fig.5 Squat dataset

3.3 运动检测与计数准确率测试

本文召集另外两名身高和体重分别为175 cm、70 kg和183 cm、83 kg的体育生作为测试者,用于测试实际计数的准确率。两名测试者分别进行两组持续的深蹲、俯卧撑、引体向上动作,深蹲和俯卧撑每组40个动作,引体向上每组20个动作,每名体育生做100个动作,深蹲、俯卧撑、引体向上动作总数共计200个。在此过程中,计数器漏计共5个动作,实际计数动详见表1,实际计数准确率为95.5%,已具备一定的应用价值。

表1 计数器准确率统计表Tab.1 Statistics table of counter efficiency

3.4 系统实现

本系统基于BlazePose动作检测模型和KNN算法,旨在实现一个稳定、实时、高计数准确率的健身动作计数系统,系统主界面使用Tkinter进行开发,Tkinter是Python的标准图形用户界面(GUI)库,它提供了一种直观、简洁的方式使得开发人员能够快速创建包括窗口、按钮、菜单、文本框等基本元素在内的可视化应用程序界面。该系统的主界面如图6所示。

图6 系统主界面Fig.6 System main interface

进入主界面后,有三种健身类型可供用户选择,选择其中一种即可自动调用本地摄像头进行实时的健身动作检测,检测窗口左上角显示置信度检测图,右上角数字显示当前动作数,例如选择俯卧撑进行检测与计数后,检测与计数效果如图7所示。

图7 俯卧撑检测与计数效果Fig.7 Push-up detection and counting effect

本次实现设备基于Windows 11操作系统环境,使用AMD Ryzen 7 5800 H 处理器,NVIDIA GeForce RTX 3060 显卡,16 GB内存和分辨率为1 280×720的HD检测摄像头,实现了基于BlazePose模型和KNN 算法的健身动作计数器,其检测速度可达30 FPS,能够有效地检测用户的健身动作,提供准确的计数统计并实时记录用户的健身数据。

4 结论(Conclusion)

本文基于BlazePose动作识别模型和KNN 算法为核心,实现了一个计数准确率较高的健身动作计数器系统的开发,该计数器结合计算机视觉技术和机器学习算法,可以准确地检测用户的运动姿态并提供准确率较高的计数统计。通过详细的数据采集、数据处理、算法设计和系统验证等步骤,验证了该健身计数系统在不同环境下,针对不同健身者的实际动作检测准确率可达95.5%,并具有实时的检测功能和较高的计算速度,检测速度可达30 FPS,有望在健身场所和线上健身平台等实际应用场景中得到推广与使用。

猜你喜欢

计数器置信度关键点
采用虚拟计数器的电子式膜式燃气表
聚焦金属关键点
硼铝复合材料硼含量置信度临界安全分析研究
肉兔育肥抓好七个关键点
正负关联规则两级置信度阈值设置方法
计数器竞争冒险及其处理的仿真分析
置信度条件下轴承寿命的可靠度分析
医联体要把握三个关键点
锁定两个关键点——我这样教《送考》
任意N进制计数器的设计方法