
简介本资源是一套面向健身教练、运动康复师及AI视觉开发者实践的深度学习运动评估系统聚焦高抬腿、仰卧起坐、俯卧撑等常见动作的实时识别与量化评估解决传统运动教学中依赖主观判断、缺乏客观数据支撑的痛点。压缩包共22个文件含12个核心Python脚本涵盖姿态估计、帧提取、模型推理、GUI应用等模块、3个预训练PyTorch模型sports_m.pt/sports_n.pt/yolov8s-pose.pt、2张示例图像bus.jpg/demo.jpg用于快速验证以及README.md、record.md等说明文档和.gitignore配置文件整体74.05MB结构清晰、开箱即用。已有137人学习下载提供完整端到端实现从视频流输入、关键点检测、动作计数与速度计算到关节角度解析与标准度打分配套说明文件与附赠文档进一步降低部署门槛适合计算机视觉入门者复现也便于教育与康复场景二次开发。1. 项目缘起从“数不清”到“看得懂”的智能健身助手不知道你有没有过这样的经历在家跟着健身App做高抬腿或者俯卧撑一组下来自己心里默数的次数和App记录的总对不上或者明明感觉动作已经变形了系统却依然给你计了一个“有效”。又或者在康复训练中医生或治疗师反复叮嘱“膝盖弯曲不能超过90度”但自己练的时候根本没法分心去判断角度是否达标。这些痛点正是传统运动监测方式的盲区——它们要么依赖穿戴式传感器成本高且不便要么就是完全依赖用户的主观计数和感觉既不准确也缺乏客观的反馈。我最近完成的一个项目就是为了解决这些问题。这个项目的核心是构建一个基于深度学习的运动姿势智能评估系统。简单来说就是让电脑摄像头像一位经验丰富的教练一样“看懂”你的动作。它不仅能识别出你是在做高抬腿、仰卧起坐还是俯卧撑还能实时地为你计数、测算动作速度、检测关键身体部位的角度并最终给出一个关于动作“标准度”的量化评估。这套系统完全基于计算机视觉技术无需任何额外的穿戴设备一个普通的网络摄像头或手机摄像头就能搞定。它的应用场景非常直接个人居家健身的智能陪练、健身房或学校的标准化运动教学辅助以及医疗康复领域的远程动作规范性监测。这个想法并非凭空而来。随着深度学习特别是卷积神经网络CNN和姿态估计算法的成熟让机器精确理解人体在二维图像乃至三维空间中的姿态成为了可能。像OpenPose、MediaPipe这样的开源库已经提供了相当鲁棒的人体关键点检测能力这为我们搭建上层应用——比如动作识别和评估——打下了坚实的基础。我的目标就是利用这些前沿工具结合具体的运动规则打造一个实用、精准且低成本的解决方案。2. 系统核心架构从像素到评估报告的流水线整个系统可以看作一条高效的数据处理流水线输入是摄像头捕捉的连续视频帧输出则是实时的计数、速度、角度和评分。这条流水线主要包含四个核心环节环环相扣。2.1 第一环人体姿态估计——找到身体的“坐标点”这是所有后续分析的基础也是最依赖深度学习模型的环节。我们的目标是从每一帧图像中提取出人体若干个关键关节点的二维坐标。通常我们会检测鼻子、眼睛、耳朵、肩膀、手肘、手腕、髋部、膝盖、脚踝等17到25个点。技术选型与理由在这个项目中我选择了MediaPipe Pose作为姿态估计的核心引擎。相较于需要复杂环境配置和GPU支持的OpenPoseMediaPipe的优势非常明显轻量与高效它提供了轻量级的模型即使在CPU上也能达到实时30 FPS的检测速度这对于需要流畅交互的健身应用至关重要。开箱即用MediaPipe的Python API极其简洁几行代码就能完成初始化并获取关键点坐标大大降低了开发门槛。精度足够对于健身这类非极端遮挡的场景MediaPipe的精度已经完全可以满足要求。它的工作原理是一个两阶段的CNN首先是一个检测器BlazePose Detector在图像中定位人体区域然后是一个跟踪器BlazePose Tracker在该区域内预测所有关键点的坐标。我们拿到这些坐标x, y以及可选的置信度后就得到了当前帧中人体的“骨骼图”。2.2 第二环运动姿势识别——判断“正在做什么”有了连续的骨骼关键点序列下一步就是判断用户正在执行哪种运动。这是一个时间序列分类问题。我们不能只靠单帧图像来判断因为一个动作的起始、过程和结束姿态可能完全不同。实现策略我采用了基于规则和基于机器学习相结合的方法兼顾了准确性和效率。基于规则对于特征非常明显的动作可以直接用关键点位置关系判断。例如识别“平板支撑”可以简单定义为躯干肩到髋几乎与地面平行且肘关节角度接近90度并持续一段时间。基于机器学习对于更复杂的动作或者需要区分相似动作如深蹲与箱式深蹲我提取了一段时间窗口内如2秒60帧的关键点坐标变化特征如关节点之间的相对距离、角度的时间序列统计量训练了一个轻量级的时序分类模型如LSTM或更简单的时序卷积网络TCN来识别动作类型。在实际部署中系统会先加载预定义的动作库高抬腿、仰卧起坐、俯卧撑等。当检测到用户进入“运动区域”并开始活动时系统启动识别流程并在UI上显示当前识别的动作名称。2.3 第三环关键指标量化——从“骨骼图”到“数据表”这是评估系统的“计算核心”。一旦动作被识别系统就会根据该动作的评判规则从骨骼关键点中计算出一系列量化指标。运动计数这是最直观的需求。核心逻辑是检测特定身体部位的空间位置或关节角度的周期性变化。以俯卧撑为例我们关注肩关节或髋关节的垂直位置y坐标。当身体下降到最低点时我们记录一个“波谷”当身体撑起到最高点时记录一个“波峰”。一个完整的“波谷-波峰-波谷”周期计为一次。这里需要引入滞后阈值来防止小幅抖动导致的误计数。例如只有当身体下降超过初始高度的20%时才认为进入“下降阶段”必须回升超过80%才认为完成一次。高抬腿则可以通过膝盖的垂直位置或大腿与躯干的夹角周期性变化来计数。速度测量这里通常指动作速度而非移动速度。例如计算一次俯卧撑从最高点到最低点的平均速度。公式很简单速度 位移 / 时间。位移可以通过髋关节关键点的垂直坐标差计算时间则是通过视频帧的时间戳差得到。系统可以实时显示当前动作的速度并与预设的“标准速度范围”进行比较提示用户“过快”或“过慢”。角度检测这是评估动作规范性的黄金指标。通过三个关键点可以计算夹角。例如俯卧撑肘关节角度使用“肩-肘-腕”三点。标准俯卧撑要求肘关节角度在下降时小于90度但不过小如45度以上避免肩部受伤。深蹲膝关节角度使用“髋-膝-踝”三点。康复训练中常要求深蹲时膝盖弯曲不能超过90度即角度大于90度以保护膝盖。仰卧起坐躯干夹角使用“肩-髋-膝”三点估算躯干与地面的夹角来判断起身幅度。计算角度可以使用向量点积公式。系统会实时在视频画面上用线条和数字标注出这些关键角度一目了然。2.4 第四环标准度评估与反馈——生成“评估报告”最后一步是将所有量化指标综合起来形成一个整体性的评估。这不是简单的及格/不及格而是一个多维度的评分体系。我设计了一个加权评分算法。每个动作都有一套评估标准包含多个维度每个维度有其权重。例如对于一个“标准俯卧撑”躯干稳定性权重30%评估过程中髋关节是否与肩关节保持近似直线即身体是否成一直线。可以通过计算肩、髋、踝三点连线的弯曲程度来量化。动作幅度权重40%肘关节最小角度是否达到标准范围如80-100度。未达到或超过均会扣分。速度均匀性权重20%上升和下降阶段的速度是否均衡有无突然加速或卡顿。关节对称性权重10%左右肘关节、肩关节的角度和运动轨迹是否对称。每个维度根据实测数据与标准值的偏差计算出一个子分数0-100分最后加权求和得到总分。同时系统会记录本次训练的所有数据次数、每组速度变化、角度历史生成简单的图表和文字反馈如“本次俯卧撑完成15次平均速度正常但后5次出现塌腰现象请注意核心收紧”。3. 实战开发环境搭建、代码结构与核心逻辑剖析理论讲完了我们来看看具体怎么实现。项目采用Python作为主语言因为它拥有最丰富的AI和计算机视觉生态。3.1 开发环境配置要点首先是最基础的环境。我强烈建议使用Anaconda来创建独立的Python环境避免包冲突。# 创建并激活一个名为‘fitness_ai’的Python3.8环境 conda create -n fitness_ai python3.8 conda activate fitness_ai接下来安装核心依赖。这里有个关键点MediaPipe的版本与系统环境特别是与Visual C Redistributable的兼容性有时会出问题。# 安装核心视觉与深度学习库 pip install opencv-python # 用于视频捕获、图像处理和显示 pip install mediapipe # 用于人体姿态估计 # 注意如果安装mediapipe失败可能是缺少Windows编译工具可尝试先安装指定版本或使用预编译轮子 # pip install mediapipe --only-binary:all: # 在某些系统上可避免编译 pip install numpy # 数值计算基础 pip install scikit-learn # 用于可能的机器学习分类如果采用 pip install pandas # 用于数据记录和分析注意如果在Windows上安装mediapipe时遇到关于pybind11或编译的错误一个常见的解决方案是确保已安装最新版的Microsoft Visual C 可再发行组件如2019版。或者直接使用pip install mediapipe-silicon针对Apple Silicon Mac或寻找对应Python版本和系统的预编译.whl文件。3.2 项目代码结构设计一个清晰的项目结构能让开发和维护事半功倍。我的项目目录如下fitness_ai_system/ │ ├── main.py # 主程序入口负责流程控制 ├── config.yaml # 配置文件存放动作标准、评分权重等参数 │ ├── core/ # 核心功能模块 │ ├── __init__.py │ ├── pose_estimator.py # 姿态估计模块封装MediaPipe调用 │ ├── action_recognizer.py # 动作识别模块 │ ├── metric_calculator.py # 指标计算模块计数、速度、角度 │ └── evaluator.py # 综合评估与评分模块 │ ├── utils/ # 工具函数 │ ├── __init__.py │ ├── angle_utils.py # 角度计算、滤波等几何工具 │ ├── counter_logic.py # 通用的计数逻辑 │ └── visualization.py # 绘图工具在图像上画骨骼、角度、文字 │ ├── data/ # 数据目录 │ ├── action_config/ # 存放不同动作的JSON配置文件 │ └── records/ # 存储用户每次的训练记录 │ └── requirements.txt # 项目依赖列表这种模块化设计使得每个部分职责单一。例如要修改俯卧撑的计数逻辑只需改动metric_calculator.py中对应的方法要增加一个新动作则在data/action_config/下添加一个配置文件即可。3.3 核心代码片段解析让我们深入到几个关键模块看看核心逻辑是如何实现的。姿态估计模块 (pose_estimator.py) 的核心初始化与调用import cv2 import mediapipe as mp class PoseEstimator: def __init__(self, static_image_modeFalse, model_complexity1, enable_segmentationFalse, min_detection_confidence0.5, min_tracking_confidence0.5): 初始化MediaPipe Pose解决方案。 static_image_mode: 设为False以启用追踪提升视频流中的性能。 model_complexity: 0,1,2。复杂度越高越准但越慢1是较好的平衡。 self.mp_pose mp.solutions.pose self.pose self.mp_pose.Pose( static_image_modestatic_image_mode, model_complexitymodel_complexity, enable_segmentationenable_segmentation, min_detection_confidencemin_detection_confidence, min_tracking_confidencemin_tracking_confidence ) self.mp_drawing mp.solutions.drawing_utils # 用于绘制骨骼 def process_frame(self, image): 处理一帧图像返回关键点坐标和带绘制的图像 # MediaPipe需要RGB图像但OpenCV默认是BGR image_rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 为了提高性能可以设置不写回 image_rgb.flags.writeable False results self.pose.process(image_rgb) # 转换回BGR用于OpenCV显示并恢复可写状态 image.flags.writeable True image cv2.cvtColor(image_rgb, cv2.COLOR_RGB2BGR) landmarks [] if results.pose_landmarks: # 将归一化坐标转换为图像像素坐标 h, w, _ image.shape for lm in results.pose_landmarks.landmark: landmarks.append((int(lm.x * w), int(lm.y * h), lm.visibility)) # 可选在图像上绘制骨骼连接 self.mp_drawing.draw_landmarks( image, results.pose_landmarks, self.mp_pose.POSE_CONNECTIONS) return image, landmarks # landmarks是一个列表包含(x, y, visibility)元组角度计算工具 (utils/angle_utils.py)import numpy as np def calculate_angle(a, b, c): 计算由三点a, b, c构成的角abc的角度以b为顶点。 参数a, b, c是包含(x, y)坐标的元组或列表。 返回角度值0到180度之间。 a np.array(a) b np.array(b) c np.array(c) # 计算向量 ba a - b bc c - b # 计算点积和模长 cosine_angle np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc)) # 防止数值误差导致cos值略超出[-1,1] cosine_angle np.clip(cosine_angle, -1.0, 1.0) # 计算角度并转换为度数 angle np.degrees(np.arccos(cosine_angle)) return angle def smooth_angle(angle_history, window_size5): 使用简单移动平均来平滑角度数据减少抖动。 if len(angle_history) window_size: return np.mean(angle_history) if angle_history else 0 return np.mean(angle_history[-window_size:])俯卧撑计数逻辑 (utils/counter_logic.py中的一部分)class PushUpCounter: def __init__(self, down_threshold0.7, up_threshold0.9): 初始化计数器。 down_threshold: 相对于起始高度判定为‘下降’的阈值比例。 up_threshold: 判定为‘上升’回位的阈值比例。 self.down_threshold down_threshold self.up_threshold up_threshold self.count 0 self.position None # ‘up’, ‘down’, or None self.start_y None # 起始时肩部或髋部的y坐标 def update(self, current_y): 根据当前关键点的y坐标更新计数。 current_y: 当前帧中用于判断的关键点y坐标如髋部中点。 if self.start_y is None: self.start_y current_y return self.count # 计算相对高度值越小表示位置越低 relative_height current_y / self.start_y if self.position is None: if relative_height self.down_threshold: self.position ‘up‘ else: self.position ‘down‘ elif self.position ‘up‘ and relative_height self.down_threshold: self.position ‘down‘ elif self.position ‘down‘ and relative_height self.up_threshold: self.position ‘up‘ self.count 1 # 完成一个从下到上的完整周期计数1 return self.count在主程序main.py中我们将这些模块串联起来形成一个实时处理循环# 伪代码流程 初始化摄像头 初始化姿态估计器、动作识别器、指标计算器、评估器 while True: 从摄像头读取一帧 使用姿态估计器获取关键点 if 有关键点: 使用动作识别器判断当前动作 if 动作被识别且有效: 根据该动作从指标计算器获取当前计数、速度、角度 使用评估器根据上述指标更新本次动作的实时评分 使用可视化工具在帧上绘制骨骼、角度、计数、评分等 显示帧 等待按键如‘q’退出 退出时保存本次训练记录到文件4. 调优与避坑让系统从“能用”到“好用”把流程跑通只是第一步要让系统在实际场景中稳定、准确还需要大量的调优工作这也是最能体现经验价值的部分。4.1 姿态估计的稳定性提升MediaPipe在大部分情况下表现良好但在快速运动、遮挡如手放在背后、侧面角度或穿着宽松衣物时关键点可能会抖动甚至丢失。关键点滤波直接使用原始坐标会导致计算出的角度和速度剧烈抖动。我采用了一维卡尔曼滤波器或指数移动平均EMA对关键点坐标进行平滑。卡尔曼滤波在预测运动轨迹方面更优而EMA实现更简单。例如smoothed_x alpha * current_x (1 - alpha) * previous_smoothed_x通常alpha取0.2到0.5之间。置信度过滤MediaPipe输出的每个关键点都有visibility或presence置信度。在计算角度或用于计数时只使用置信度高于阈值如0.7的关键点。如果必要关节点如肘部置信度过低则暂停该动作的评估并在UI上提示“请调整姿势确保关节可见”。多关键点备用方案例如计算躯干倾斜角度时如果髋部关键点不稳定可以尝试用双肩中点代替髋部与膝盖进行计算作为备用方案。4.2 计数逻辑的防误触设计计数逻辑看似简单但极易因姿势抖动而产生误计数。滞后阈值与去抖如前所述设置down_threshold和up_threshold是关键。这两个阈值需要根据具体动作和用户体型进行微调。一个更稳健的做法是引入时间约束只有当身体在“低位”或“高位”保持超过一定帧数如5帧约0.16秒才确认状态切换这能有效过滤掉短暂的抖动。状态机设计将计数逻辑设计为一个严谨的状态机如“初始”、“准备”、“下降中”、“低位”、“上升中”、“高位”只有完成完整的预设状态流转才计一次数。这比简单的“高-低”判断要鲁棒得多。起始位置校准计数开始前让用户保持动作的起始姿势如俯卧撑的撑起位置2-3秒系统记录此位置作为基准。这能自动适应不同用户的身高和摄像头距离。4.3 角度检测的准确性与参考系角度计算依赖于三个点的像素坐标。然而摄像头视角不是正对的或者用户身体发生旋转都会导致计算出的角度与真实物理角度有偏差。选择不易受视角影响的关节点对于侧向动作尽量选择在人体矢状面将人体分为左右两半的平面内运动的关节角度如肘关节屈伸、膝关节屈伸。像“身体是否成一直线”这种涉及侧向倾斜的判断在单一摄像头下本身就很难准确需要谨慎定义或作为次要指标。使用相对角度而非绝对坐标有时我们并不需要绝对的世界坐标系角度而是关心角度的变化范围。例如我们只关心深蹲时膝盖角度从170度变到100度变化了70度而不关心它绝对是不是100度。只要变化范围符合标准即可认为幅度达标。用户侧对摄像头时的处理这是最大的挑战。一个实用的方案是在系统引导中明确要求用户正面或背面朝向摄像头并在UI上给出实时反馈。如果检测到用户身体严重侧转则提示“请正对摄像头”。4.4 评估模型的个性化与校准一套固定的评分标准不可能适合所有人。身高臂长不同的人做俯卧撑时肘关节的标准角度范围可能就有细微差别。引入“标准动作录制”在用户首次使用某个功能时引导他按照系统提示缓慢、标准地完成几次动作。系统记录下他个人在“标准”执行时的各项指标范围如最大/最小角度、平均速度以此作为他个人的基线数据。后续评估时将实时数据与个人基线进行比较而不是与一个绝对标准比较这样更公平合理。评分权重动态调整对于康复场景“角度不超过安全阈值”的权重可能是100%其他指标权重为0。对于健身塑形“动作幅度”和“肌肉控制速度均匀性”的权重可以更高。系统应允许根据不同场景预设不同的评估方案。5. 应用场景深化与扩展思考将这套系统真正用起来你会发现它的价值远不止于一个简单的计数器。5.1 在健身教学中的应用从“模仿”到“纠正”对于健身新手看视频模仿往往不得要领。本系统可以实时对比在屏幕一侧播放标准动作视频带骨骼线另一侧显示用户的实时画面和骨骼线。用户能直观地看到自己与标准动作的形态差异。语音实时指导结合评估结果系统可以生成具体的语音提示如“肘部再向内收一些”、“注意不要塌腰”、“速度放慢感受肌肉发力”。生成训练报告课后提供详细报告指出本次训练中哪些动作完成质量高哪些动作存在代偿如深蹲时膝盖内扣并给出针对性的改进建议。5.2 在运动康复监测中的应用量化与依从性对于术后康复患者动作的规范性至关重要但治疗师无法24小时监督。安全边界预警系统设定严格的角度安全范围如膝关节屈曲0-60度。一旦患者动作超出“绿色区域”系统立即发出醒目警告屏幕闪烁、声音提示防止二次损伤。远程同步与报告训练数据次数、角度曲线、完成度自动加密上传到云端。治疗师或医生可以在后台查看所有患者的每日训练报告了解康复进度和依从性并远程调整训练方案。激励与游戏化将康复动作设计成简单的游戏任务如“控制小球穿过弯曲的膝盖角度曲线通道”提高患者尤其是儿童和老年患者的训练兴趣和坚持度。5.3 系统优化与未来方向当前系统仍有可优化和扩展的空间模型轻量化与前端部署目前依赖Python后端。未来可以考虑使用TensorFlow.js或MediaPipe的JavaScript版本将核心姿态估计和简单逻辑直接放在网页或手机浏览器中运行实现真正的免安装、跨平台。多角度融合使用两个或多个摄像头从不同视角捕捉动作可以重建更准确的3D姿态彻底解决单视角的遮挡和角度失真问题。虽然计算复杂度增加但对于专业评估场景是值得的。结合生理信号如果用户佩戴了心率带或肌电手环可以将心率、肌肉激活程度等数据与视觉分析结果融合评估训练强度和技术效率提供更全面的“运动处方”。更复杂的动作库从基础的健身动作扩展到瑜伽体式、舞蹈动作、体育专项技术如篮球投篮、高尔夫挥杆的评估。这需要为每个领域建立更专业的评估模型和知识库。从技术实现的角度看这个项目很好地串联了深度学习、计算机视觉、信号处理和软件工程等多个知识点。它不是一个停留在论文里的算法而是一个能解决真实问题的产品原型。在实际开发中我最大的体会是算法的精度只占成功的一半另一半在于如何设计稳健的业务逻辑和人性化的交互来处理算法的不确定性并将冰冷的数据转化为用户能理解、能执行的反馈。比如与其告诉用户“你的躯干侧倾角偏差12度”不如在画面上画一条红色的线并提示“请将身体向左侧移动直到蓝线与红线重合”。这种从“数据思维”到“用户思维”的转变才是工程落地的关键。本文还有配套的精品资源点击获取