基于人工智能的实时健身训练分析系统:深蹲姿态识别与动作评估

news2024/10/1 16:24:07

关于深度实战社区

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。

社区特色:深度实战算法创新

获取全部完整项目数据集、代码、视频教程,请进入官网:zzgcz.com。竞赛/论文/毕设项目辅导答疑,v:zzgcz_com


1. 项目简介

本项目旨在开发一个基于人工智能的实时健身训练分析系统,专注于深蹲姿势识别与动作评估。随着个人健身和运动健康的普及,人们越来越希望能够在家中或健身房使用智能化工具来实时监控自己的锻炼情况,并获得专业的动作纠正指导。本系统利用计算机视觉技术,通过摄像头捕捉用户的深蹲动作,结合深度学习模型对姿势进行实时分析,识别出用户在运动过程中可能出现的姿势偏差,并给出改进建议。项目采用了MediaPipe的姿态估计模型和自定义的角度分析算法,能够精确定位人体关键点,并计算膝盖、髋关节和脚踝等部位的角度变化。该系统支持初学者模式和专业模式,通过不同的阈值参数来区分用户水平,并根据用户的运动轨迹判断动作是否规范。应用场景包括个人健身指导、运动康复训练及健身房智能健身教练系统。整体项目不仅实现了实时性和较高的精度,还通过Streamlit的界面提供直观的用户交互体验,用户可以通过上传视频或使用实时摄像头流来获取训练指导,从而提高运动效果和安全性。

2.技术创新点摘要

本项目的技术创新点主要体现在以下几个方面:首先,本项目采用了基于MediaPipe和自定义深度学习方法的姿态估计模型来实现人体关键点的精确定位和姿态分析。通过引入多角度关键点检测技术(如髋关节、膝关节、脚踝等位置的角度计算),该项目能够在深蹲动作中进行精细化分析,从而有效识别各种常见的姿势偏差,如膝盖过度前移、髋关节位置偏移等。此外,本项目结合了实时流媒体处理框架(Streamlit 和 WebRTC)和深度学习算法,通过实时处理视频帧的方式,支持用户通过摄像头进行动作实时评估。这种实时性与视频流的结合,不仅大幅提升了用户交互体验,还能快速响应用户动作变化,确保训练时的精准性与连续性。

其次,项目中定义了“初学者模式”和“专业模式”两种阈值机制,通过动态调整角度阈值和姿势容忍度(如髋关节与膝盖的角度范围),实现了对不同健身水平用户的个性化分析。这种多模式设计能够在相同动作下,灵活适应不同用户的运动特点,从而提高了模型的泛化能力。

同时,项目在姿态校正反馈上做了进一步的优化,通过多种视觉提示(如动态文字标签和颜色标注),帮助用户及时发现自身姿势的不足之处,提供清晰易懂的改进指导。为了保持系统的高可扩展性,项目通过自定义关键点特征提取器和灵活的角度计算方法,使其能够方便地应用于其他运动姿态分析场景,如深蹲、弓步训练、跳跃等。

在这里插入图片描述

3. 数据集与预处理

本项目的数据集主要来自于公开的运动姿态数据集(如Human3.6M、COCO Pose Estimation),这些数据集包含了大量标注精确的人体姿态图像,尤其是适用于各类运动动作(如深蹲、弓步、跑步等)的关键点标注。这些数据集的显著特点是:包含多种人体姿态的2D和3D关键点坐标信息,且数据量大、动作多样,能够覆盖不同年龄、性别和体型的用户姿势。因此,该数据集可以为模型训练和验证提供多样化的动作姿态样本,确保模型的泛化能力和在复杂场景下的鲁棒性。

在数据预处理阶段,本项目首先对原始图像数据进行了关键点归一化处理。通过将每个人体的关键点坐标映射到0-1的区间内,消除不同图像分辨率和拍摄角度带来的差异,从而在不同输入尺度下保持模型的一致性。接着,我们采用数据增强技术对数据进行扩充,如水平翻转、随机旋转、裁剪、缩放等操作,以模拟不同视角和动作幅度下的姿态变化,增强模型的适应性和抗噪能力。此外,针对姿态数据的特征工程,我们对深蹲等特定动作的关键点角度进行了计算与特征提取,确保模型能够捕捉到不同用户在深蹲动作中各关节的角度变化、运动轨迹等高维度信息。

最后,在训练数据的采样过程中,我们设计了特定的标签平衡机制,对关键姿态(如深蹲时膝盖、髋关节的关键角度)进行标注与分类处理,确保在模型训练时能够平衡各种常见动作类别,从而提升模型对不同姿态的识别能力。通过上述数据预处理与特征工程步骤,数据集能够更好地支持深度学习模型的训练与优化。

4. 模型架构

  1. 模型结构与逻辑

本项目的核心模型架构主要基于人体姿态估计(Pose Estimation)算法,采用了MediaPipe的姿态检测模型来实现人体关键点的定位和深蹲动作识别分析。具体来说,模型结构分为以下几部分:

  • 姿态检测(Pose Estimation Module) :该模块基于MediaPipe Pose Estimation框架,利用卷积神经网络(CNN)和多级姿态解析模型(Multi-stage Pose Parsing Model)来识别人体的33个2D关键点(如头部、肩膀、肘部、髋关节、膝盖、脚踝等)。其输出为一组关键点的二维坐标 (xi,yi),每个关键点具有置信度 ci,表示该关键点的检测准确性。

    • 输入层:输入为经过归一化处理的RGB图像 I ∈ R H × W × 3 I \in \mathbb{R}^{H \times W \times 3} IRH×W×3(其中 H 和 W 为图像的高度和宽度)。
    • 特征提取层(Feature Extraction Layer) :使用轻量化的CNN网络,如MobileNetV2,进行多尺度特征提取,生成特征图 F ∈ R H 8 × W 8 × C F \in \mathbb{R}^{\frac{H}{8} \times \frac{W}{8} \times C} FR8H×8W×C,其中 C 为通道数。特征提取的核心数学公式为: ( x i , y i ) = arg ⁡ max ⁡ ( x , y ) H i ( x , y ) (x_i, y_i) = \arg\max_{(x, y)} H_i(x, y) (xi,yi)=arg(x,y)maxHi(x,y)
    • 关键点检测层(Keypoint Detection Layer) :通过堆叠多层卷积层来预测每个关键点的热力图(Heatmap) H i ∈ R H 8 × W 8 H_i \in \mathbb{R}^{\frac{H}{8} \times \frac{W}{8}} HiR8H×8W,并对关键点进行解码和坐标转换: ( x i , y i ) = arg ⁡ max ⁡ ( x , y ) H i ( x , y ) (x_i, y_i) = \arg\max_{(x, y)} H_i(x, y) (xi,yi)=arg(x,y)maxHi(x,y)
    • 姿态优化层(Pose Refinement Layer) :采用解析优化方法,对每个关键点的坐标进行进一步调整,以降低检测误差,输出最终姿态坐标。
  • 角度分析模块(Angle Analysis Module) :在深蹲动作识别中,本模块计算膝盖、髋关节、和脚踝的角度值来判断姿态状态。给定两个关键点 A(x1,y1) 和 B(x2,y2),以及参考点 O(x0,y0),角度计算公式为:

  • θ = arccos ⁡ ( ( A − O ) ⋅ ( B − O ) ∥ A − O ∥ ⋅ ∥ B − O ∥ ) \theta = \arccos\left(\frac{(A-O) \cdot (B-O)}{\|A-O\| \cdot \|B-O\|}\right) θ=arccos(AOBO(AO)(BO))

  • 其中 ⋅ 表示向量点积,∥⋅∥ 表示向量的模长。通过计算关键点之间的角度变化,可以判断用户的深蹲动作是否规范。

  1. 模型训练流程与评估指标

本项目未直接训练深度学习模型,而是利用预训练的MediaPipe模型进行姿态估计,并在其基础上进行二次开发和动作分析。为了优化分析模块的参数,设计了特定的动作阈值(如髋关节和膝盖角度阈值),通过实时视频帧处理与角度计算,来对用户的动作进行动态追踪和评估。

评估指标主要包括以下几种:

  • 动作准确率(Accuracy) :定义为用户每次深蹲动作中符合规范姿态的次数占总动作次数的比例。准确率可以通过以下公式计算:
  • Accuracy = N correct N total \text{Accuracy} = \frac{N_{\text{correct}}}{N_{\text{total}}} Accuracy=NtotalNcorrect
  • 其中 Ncorrect为符合规范姿态的动作次数,Ntotal 为所有动作的总次数。
  • 姿态偏差率(Pose Deviation Rate) :用于衡量用户的动作是否出现膝盖、髋关节、脚踝位置的偏差。对于某个角度 θi 超出预定范围的偏差率定义为:
  • Deviation Rate = ∑ i = 1 N ∣ θ i − θ target ∣ N \text{Deviation Rate} = \frac{\sum_{i=1}^N | \theta_i - \theta_{\text{target}} |}{N} Deviation Rate=Ni=1Nθiθtarget
  • 该指标能够直观地反映用户动作的偏差程度。

5. 核心代码详细讲解

1. process_frame.py 文件中的动作分析模块

该文件主要用于处理实时视频流中的每一帧,进行深蹲动作的姿态检测和分析。以下是几个关键功能函数的逐行讲解。

def process(self, frame: np.array, pose) -> Tuple[np.array, Optional[str]]:

该函数是处理输入视频帧的核心函数,通过分析当前帧的姿势关键点来进行姿态判断和动作反馈。

frame_height, frame_width, _ = frame.shape
  • 解释:获取当前视频帧的宽度和高度,用于后续计算关键点坐标的归一化和映射。
keypoints = pose.process(frame)
  • 解释:使用MediaPipe的pose模型处理当前帧,获取人体姿势的关键点检测结果 keypoints。如果模型成功检测到人体姿态,则返回包含33个关键点的姿态信息。
nose_coord = get_landmark_features(ps_lm.landmark, self.dict_features, 'nose', frame_width, frame_height)
  • 解释:调用 get_landmark_features 函数提取鼻子(nose)的关键点坐标,并将其映射到当前帧的坐标系中。self.dict_features 存储了所有感兴趣的关键点(如肩膀、髋关节、膝盖、脚等)的索引。
left_shldr_coord, left_elbow_coord, left_wrist_coord, left_hip_coord, left_knee_coord, left_ankle_coord, left_foot_coord = \
get_landmark_features(ps_lm.landmark, self.dict_features, 'left', frame_width, frame_height)
  • 解释:提取左侧肩膀、肘部、手腕、髋关节、膝盖、脚踝和脚的坐标信息。通过将其转化为具体的二维坐标,后续可以用于角度计算和动作分析。
offset_angle = find_angle(left_shldr_coord, right_shldr_coord, nose_coord)
  • 解释:计算左右肩膀与鼻子之间的夹角,称为offset_angle。该角度用于判断用户的身体是否保持正直姿态。公式为:

θ = arccos ⁡ ( ( A − O ) ⋅ ( B − O ) ∥ A − O ∥ ⋅ ∥ B − O ∥ ) \theta = \arccos\left( \frac{(A - O) \cdot (B - O)}{\|A - O\| \cdot \|B - O\|} \right) θ=arccos(AOBO(AO)(BO))

如果该角度大于某个阈值(如35度),则表示用户的上半身姿势可能不正确,需要进行调整。

if offset_angle > self.thresholds['OFFSET_THRESH']:
  • 解释:判断offset_angle是否超过预设的姿势偏移阈值OFFSET_THRESH。如果超过,则认为用户的姿态不正确,进入姿势校正逻辑。
play_sound = 'reset_counters'
  • 解释:当检测到用户姿态出现偏差时,设置 play_sound"reset_counters",用于后续音频反馈。此机制能够在用户动作出现错误时发出提示音,帮助用户调整姿态。
hip_vertical_angle = find_angle(shldr_coord, np.array([hip_coord[0], 0]), hip_coord)
  • 解释:计算肩膀与髋关节的垂直角度hip_vertical_angle,用于判断用户在深蹲时的髋关节是否保持正确的高度。如果角度偏差过大(例如髋关节过低或过高),系统会触发纠正机制。
if hip_vertical_angle > self.thresholds['HIP_THRESH'][1]:
    self.state_tracker['DISPLAY_TEXT'][0] = True
  • 解释:判断当前帧中髋关节角度是否超过设定的上限阈值(HIP_THRESH[1]),如果是,则认为用户的动作可能过度弯曲或姿势不规范。self.state_tracker['DISPLAY_TEXT'][0] 用于触发在界面上显示文字反馈,告知用户需要调整动作。
frame = self._show_feedback(frame, self.state_tracker['COUNT_FRAMES'], self.FEEDBACK_ID_MAP, self.state_tracker['LOWER_HIPS'])
  • 解释:调用 _show_feedback 函数,将文本提示与颜色标注等信息叠加到当前帧中。self.FEEDBACK_ID_MAP 存储了每个可能错误姿态的提示内容及其颜色标识,如 BEND BACKWARDSKNEE FALLING OVER TOE。此处将具体的动作评估和纠正结果反馈给用户。
cv2.putText(frame, str(int(hip_vertical_angle)), (hip_text_coord_x, hip_coord[1]), self.font, 0.6, self.COLORS['light_green'], 2, lineType=self.linetype)
  • 解释:使用 cv2.putText 将计算出的 hip_vertical_angle 角度值绘制在帧图像上,显示用户当前髋关节的角度,方便用户理解当前动作的状态。
self.state_tracker['prev_state'] = current_state
  • 解释:更新状态跟踪变量 self.state_tracker['prev_state'],记录当前帧的姿态状态(如 s1s2 等)。该状态用于在后续帧中判断动作的持续性和连续性,确保在动作评估时的状态切换能够被正确捕捉。
2. thresholds.py 中的模式阈值定义

该模块用于定义不同运动模式(初学者与专业模式)下的动作分析阈值。

_ANGLE_HIP_KNEE_VERT = {'NORMAL' : (0,  32),'TRANS'  : (35, 65),'PASS'   : (70, 95)
                         }
  • 解释:定义深蹲动作中髋关节与膝盖的垂直角度范围。NORMAL 表示正常角度区间(0-32度),TRANS 表示过渡角度(35-65度),PASS 表示动作完成时的角度(70-95度)。该字典结构能够有效区分不同阶段的动作状态。
'OFFSET_THRESH' : 35.0,
  • 解释:定义偏移角度阈值,用于检测用户是否在深蹲时出现躯干偏移等错误姿势。

6. 模型优缺点评价

  • 本项目模型的优点在于其高效的实时性良好的用户体验。首先,基于轻量化的MediaPipe Pose Estimation模型,该系统能够在消费级设备(如笔记本和手机)上实现高效的姿态估计和实时分析,并且集成了Streamlit和WebRTC等流媒体处理框架,能够提供高帧率的视频流处理,使得用户在使用过程中获得流畅的交互体验。其次,模型通过自定义的角度分析模块(如髋关节和膝盖的角度计算),能够识别常见的深蹲姿势错误,并且通过多模式(初学者与专业模式)的设定,支持不同健身水平的用户进行精确分析和动作反馈。此外,实时的动作反馈系统能够通过动态的文本提示和颜色标注,及时告知用户需要调整的姿势,帮助用户在训练过程中提升动作质量和运动安全性。
  • 但该模型也存在一定的局限性。首先,由于模型主要依赖于二维关键点检测,无法处理复杂的三维姿态变化,尤其是深蹲动作中的身体旋转和前后移动。其次,模型在光照、拍摄角度变化较大的情况下,姿态识别的准确率可能受到影响。同时,预设的阈值参数(如髋关节与膝盖的角度阈值)可能无法适应所有用户的身体特征,导致某些动作的误判或低效分析。
  • 针对这些缺点,可以通过以下改进方向来优化模型:1)采用三维姿态估计模型(如基于骨架序列的3D姿态估计),提高对复杂动作的识别能力;2)增加超参数调优机制,根据用户的体型和健身目标动态调整分析阈值;3)引入更丰富的数据增强策略(如动态遮挡、背景变换),提升模型的鲁棒性;4)采用多视角视频融合策略,提高姿态识别的空间一致性。通过这些改进,可以进一步提升模型的实用性和在不同场景下的表现。

↓↓↓更多热门推荐:
LSTM模型改进实现多步预测未来30天销售额
ResNet18果蔬图像识别分类

全部项目数据集、代码、教程进入官网zzgcz.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端css样式设置元素的绝对定位和相对定位,要注意宽度和高度的设置

vue3子div position absolute,父div positon relative 。如果不设置子div的 width 和height,那么子div中如果数据变长,子div相对父div位置会变化。子div数据超过&#xff0c;显示... 如何实现 <template><div class"parent"><div class"child&q…

[含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现

大数据项目——基于Django实现的高校图书馆智能推送系统的设计与实现背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、信息技术的发展背景 随着信息技术的飞速发展和互联网的广泛普及&#xff0c;大数据已经成为现代社会的重要资源。在大数据背景下&#xf…

深入计算机语言之C++:C到C++的过度

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、什么是C C&#xff08;c plus plus&#xff…

stm32单片机学习 - MDK仿真调试

1 进行环境配置 点击 Options for Target&#xff0c;也就是我们俗称的魔法棒。 将"C/C"中的Optimization选项选为Level 0(-O0) 作用:优化等级调为0级,便于调试时分析代码 勾选"Debug"中的Load Application at Starup 和 Run to main() 选项 作用:Load…

DBeaver详细安装与使用教程-免费的数据库管理工具

一、简介 二、安装教程 三、使用教程 1. 连接MySQL数据库 2. 查看表数据 3. 查看表属性 3. SQL编辑器和控制台 4.在DBeaver中设置定时备份数据库 一、简介 dbeaver是一款的数据库连接工具&#xff0c;免费&#xff0c;跨平台。 官网&#xff1a;DBeaver Community | …

前端——切换轮播图

学完前端js小知识后&#xff0c;动手操作的一个简单图片轮播图。 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"keywords" content"关键词信息"><meta name"des…

数据中心交换机与普通交换机之间的区别到底在哪里?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友。 数据中心交换被设计用来满足数据中心特有的高性能、高可靠性和可扩展性需求。 与此同时&#xff0c;普通交换机…

ACL(Access Control List)访问控制列表

目录 ACL 访问控制列表 ACL分类 ACL的组成 ACL匹配机制 ACL调用方式 实验配置 不允许PC1访问PC4 只允许PC1访问PC4 高级ACL 基本概念 实验配置 限制ping 实验配置 限制DNS 基于时间的ACL 实验配置 ACL 访问控制列表 根据一系列不同的规则&#xff0c;设备根据这…

使用Python实现Auto.js的自动输入图形验证码

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

详解JavaScript中把函数作为值

8.4 作为值的函数 JS中函数不仅是一种语法&#xff0c;也是值&#xff0c;也就是说&#xff0c;可以将函数赋值给变量&#xff0c;存储在对象的属性或者数组的元素中&#xff0c;作为参数传入另外一个函数等。 来看一个函数&#xff1a;function square(x){return x*x;} 定义…

深度学习之入门书籍

自学深度学习&#xff0c;书籍很重要。 从我个人来说&#xff0c;我不太习惯英译版本&#xff0c;或者那些牛人说的&#xff0c;直接读英文&#xff0c;我是水平不够。只讲自己的经验。牛人绕道。 推荐书籍: 深度学习:从入门到精通&#xff0c;这本书不错。把基础的深度学习的…

自然语言处理问答系统技术

自然语言处理问答系统技术 随着人工智能的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术已成为推动智能问答系统发展的核心技术。问答系统是利用NLP来解析用户提出的问题&#xff0c;并从知识库中找到最相关的答案。在许多应用中&#xff0c;如智能客服、…

用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画

总得拆开炼丹炉看看是什么样的。这篇文章将带你从代码层面一步步实现 AI 文本生成图像&#xff08;Text-to-Image&#xff09;中的 LoRA 微调过程&#xff0c;你将&#xff1a; 了解 Trigger Words&#xff08;触发词&#xff09;到底是什么&#xff0c;以及它们如何影响生成结…

构建企业数字化转型的战略基石——TOGAF框架的深度解析

数字化时代的企业变革需求 在全球范围内&#xff0c;数字化转型已成为企业提高竞争力、优化运营流程、提升客户体验的核心战略。数字技术的迅猛发展&#xff0c;不仅改变了传统行业的运作模式&#xff0c;也迫使企业重新思考其业务架构和技术基础设施。TOGAF&#xff08;The O…

用示波器测动态滞回线

大学物理&#xff08;下&#xff09;实验-中南民族大学通信工程2022级 手动逐个处理数据较为麻烦且还要绘图&#xff0c;故想到用pythonmatplotlib来计算结果并数据可视化。 代码实现 import matplotlib.pyplot as plt# 样品一磁化曲线 X [0, 0.2, 0.4, 0.6, 0.8, 1, 1.5, 2.…

实战笔记:Vue2项目Webpack 3升级到Webpack 4的实操指南

在Web开发领域&#xff0c;保持技术的更新是非常重要的。随着前端构建工具的快速发展&#xff0c;Webpack已经更新到5.x版本&#xff0c;如果你正在使用Vue2项目&#xff0c;并且还在使用Webpack 3&#xff0c;那么是时候考虑升级一下Webpack了。我最近将我的Vue2项目从Webpack…

TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)

背景 当table的某一列的某些内容相同时&#xff0c;需要在视觉上合并这一部分的内容为同个单元格 如上图所示&#xff0c;比如需要合并当申请人为同个字段的列。 解决代码 <t-table:data"filteredData":columns"columns":rowspan-and-colspan"…

psutil库的使用说明

前言 psutil是一个跨平台的库&#xff0c;用于获取系统的进程和系统利用率&#xff08;包括 CPU、内存、磁盘、网络等&#xff09;信息。 目录 安装 应用场景 常用方法 一、系统信息相关函数 二、进程信息相关函数 三、网络信息相关函数 四、其他实用函数 使用样例 监控应…

YOLOv11改进 | Neck篇 | YOLOv11引入BiFPN双向特征金字塔网络

1.BiFPN介绍 摘要&#xff1a;模型效率在计算机视觉中变得越来越重要。 在本文中&#xff0c;我们系统地研究了用于目标检测的神经网络架构设计选择&#xff0c;并提出了几个提高效率的关键优化。 首先&#xff0c;我们提出了一种加权双向特征金字塔网络&#xff08;BiFPN&…