尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于MediaPipe的深蹲姿势分析Python实现与源码解析

基于MediaPipe的深蹲姿势分析Python实现与源码解析 简介本资源是一个面向健身教练、运动科学学习者及Python计算机视觉初学者的深蹲动作智能分析实践项目聚焦于利用开源技术实现人体姿态评估与动作纠错。压缩包共含3个Python源文件总大小2.43MB涵盖视频上传处理Upload_Video.py、实时摄像头流姿态捕获Live_Stream.py及交互式演示主程序Demo.py核心依赖OpenCV进行帧处理、OpenPose完成关键点检测并结合Pandas进行关节角度统计与matplotlib可视化轨迹与角度变化曲线。已有222人下载学习适合希望掌握运动生物力学AI落地结合路径的开发者可直接运行复现深蹲姿势识别全流程理解从视频输入、骨骼关键点定位、动态角度计算到错误姿势判别的完整逻辑链同时获得模块清晰、注释友好的工程化脚本结构便于迁移至硬拉、卧推等其他力量训练动作分析场景。1. 为什么“深蹲姿势分析”值得自己动手写一遍1.1 这个项目到底能干什么先说结论这个标题里挂的“深蹲姿势分析-python源码.zip”单看文件名就知道它不是一个PPT式的概念演示而是一个能直接跑起来的计算机视觉项目。核心输入是摄像头画面或者本地视频文件核心输出是每一帧里人物的深蹲姿态是否合格以及整个动作过程中膝盖、髋部、背部的角度变化曲线。我拿到这类源码时的第一反应不是急着解压跑demo而是先确认它解决的真实痛点。深蹲这个动作看起来人人会做但练错的人比例相当高。膝盖内扣、上半身过度前倾、蹲不到底就起身、重心偏到脚尖上——这些问题光靠肉眼很难实时发现尤其是自己练的时候没人帮你盯动作。如果有一份Python源码能通过摄像头实时捕捉骨骼关键点再用几何角度去判断动作是否标准那相当于请了一个不会累的私人教练。这类项目的应用场景也不止健身房。康复训练里医生需要客观记录患者的下蹲角度恢复情况体育教学里老师需要同时盯十几个学生的动作是否到位甚至电子游戏、体感交互里也可以用同样的逻辑判断玩家是否做出了指定的下蹲动作。所以尽管标题写的是“深蹲”背后的技术框架是可以平移复用的。1.2 项目适合哪些人、需要什么基础如果你准备打开这个zip我默认你至少有这些背景之一你正在学Python想找一个不那么“玩具级”的实战项目你本身健身想用技术手段量化自己的训练质量或者你已经在做姿态识别相关的工作想看看别人是怎么设计深蹲判定逻辑的。技术栈预期是Python 3.8以上版本依赖OpenCV、MediaPipe或者OpenPose、NumPy。如果源码里用了MediaPipe那整个项目的安装成本会低很多因为MediaPipe对硬件要求不算高CPU也能跑实时推理。如果是OpenPose那套跑起来会明显吃力需要GPU才流畅。看到源码后第一件事就是确认姿态检测用的到底是哪个库。还有一点需要提醒这份源码大概率不是一个“开箱即用”的商业软件它更像是一个架构清晰的参考实现。你下载它核心目的是读懂里面的判定逻辑然后根据自己的需求去改、去调、去优化。后面我会详细拆解里面最值得学习的几个模块。2. 技术选型MediaPipe方案是现阶段最稳的路径2.1 为什么不用传统OpenCV人形检测很多刚入门的人会好奇OpenCV不是也能检测人体吗为什么还要用MediaPipe这里必须把两个概念拆开。OpenCV本身是一个图像处理库它确实提供了HOG特征行人检测、Haar级联人脸检测这些传统算法但它的输出是“一个矩形框”告诉你画面里哪里有个人至于这个人是什么姿势、胳膊腿往哪伸传统OpenCV给不了。深蹲分析需要的是人体姿态估计也就是要定位出肩膀、手肘、手腕、髋部、膝盖、脚踝这些关节点在图像上的像素坐标。这个任务在深度学习普及之前想做到实时且稳定几乎不可能。而MediaPipe Pose正是专为这个任务设计的轻量级方案它在COCO数据集上训练过输出的33个关键点里下半身相关的点覆盖得相当完整。我当时选型时也对比过OpenPose。OpenPose的精度在某些边缘场景下确实更好但它的模型文件动辄几百MB边缘设备上跑不起来安装配置也复杂。MediaPipe的Pose模型压缩后只有几十MB默认的lite模型在普通笔记本CPU上能跑到每秒20帧以上这个性能对深蹲分析完全够用。一句话总结能用轻量方案解决的事情没有必要上重武器。2.2 MediaPipe Pose核心能力与关键点分布MediaPipe Pose输出的33个关键点索引号是有固定规范的。0号点是鼻子1号到10号覆盖眼睛、耳朵、嘴巴这些面部区域11号和12号是左右肩膀13号和14号是左右手肘15号和16号是左右手腕23号和24号是左右髋部25号和26号是左右膝盖27号和28号是左右脚踝29号到32号是脚掌相关点位。做深蹲分析时最核心的计算对象是髋关节23/24、膝关节25/26、踝关节27/28这三组六个点。通过它们可以组成三个关键角度左右髋角、左右膝角。膝角是判断下蹲深度的核心指标髋角则能反映上半身前倾程度。这里有一个很多人容易忽略的点MediaPipe返回的坐标是归一化的x和y的范围在0到1之间z坐标是相对深度信息单位不是像素。如果你要在视频画面里画框、画线必须先把归一化坐标乘以图像的宽和高转回像素坐标。很多新手跑这个项目时直接在归一化坐标上画图结果点全部挤在一个角落里就是这个换算没做。2.3 完整依赖清单与运行环境建议拿到源码后建议先用虚拟环境隔离依赖。我用的是conda创建环境时指定Python版本避免系统全局环境的OpenCV版本冲突。conda create -n squat_analysis python3.9 conda activate squat_analysis pip install opencv-python mediapipe numpy这三件套是跑通项目的最小依赖集。如果你的源码里还用了matplotlib画角度曲线再加一行pip install matplotlib即可。版本号方面MediaPipe建议装0.10.x以上的版本因为早期版本的API接口有过调整最新版本去掉了部分历史遗留参数用起来更顺手。3. 深蹲判定说到底是骨架角度学3.1 用哪个角度区分深蹲与半蹲先想明白一个问题什么是“深蹲”从动作标准来看公认的合格标准是下蹲到大腿至少与地面平行髋关节的折叠点低于膝关节的顶点。但从计算机视觉的角度我们没法直接“看”大腿是否与地面平行因为画面是二维的相机角度一旦不正平行关系会被透视扭曲。所以工程上更通用的做法是用膝关节角度作为深蹲深度的代理指标。站直时膝盖角度接近180度以大腿和小腿的外侧夹角计算下蹲过程中这个角度持续减小。当膝盖角度小于或等于120度时可以判定为“进入半蹲状态”当膝盖角度小于或等于90度时通常就认为大腿已经接近与地面平行达到了深蹲的合格线。如果小于75度那就是深度全蹲了。3.2 防止身体前倾的辅助校验只看膝角有个明显的漏洞人完全可以撅着屁股、弓着背用错误的姿势“骗过”膝角判断。比如上半身过度前倾膝盖确实蹲到了90度但腰椎承受的压力非常大。所以一份合格的深蹲分析源码必须同时校验髋角变化。髋角在这里指的是躯干延长线与大腿之间的夹角取髋关节为顶点连接肩膀和髋部的线段再连接髋部和膝盖的线段两条线段形成的夹角。站直时这个角度大约是180度躯干和大腿在一条直线上下蹲时因为髋部后移、躯干前倾髋角会减小。如果髋角小于100度说明上半身已经过度前倾了。通过膝角和髋角两个维度的组合判断就能在“蹲得够深”和“姿势不够稳”之间做出区分。这也是我认为类似源码里最有价值的业务逻辑设计。3.3 深度计数器的状态机设计如果你希望源码不只是画几条线还能自动统计做了多少个标准深蹲那一定需要一个状态机。状态机是深蹲计数项目的灵魂没有它骨架上角度指标一抖一抖很难判定一个动作是否完整完成。我习惯把深蹲周期拆成四个状态站立态STANDING、下蹲态DESCENDING、底部态SQUAT、上升态ASCENDING。程序从视频流中逐帧提取关键点计算膝角然后根据角度的变化趋势切换状态。状态切换的规则大概是站立态膝角大于160度。如果检测到膝角开始小于160度进入下蹲态。下蹲态膝角持续减小一旦小于90度进入底部态。底部态膝角小于90度当检测到膝角开始增大进入上升态。上升态膝角持续增大回到160度以上判定为一个完整的深蹲周期计数器加1状态复位为站立态。加了状态机之后计数器不会因为手在画面里晃一下就误判也不会因为蹲到一半停住就重复计数。这个设计思路在任何计数类项目里都通用——俯卧撑、引体向上、卷腹都是同一个模式。4. 代码逻辑拆解从姿态数据到姿势结论4.1 读取视频流与Pose模型初始化拿到源码之后我会按照“数据流”的顺序去读代码视频源 → 姿态推理 → 特征提取 → 判定逻辑 → 可视化。第一步通常是视频读取。源码里大概率用的是OpenCV的VideoCapture接口要支持摄像头输入就把参数设为0要处理本地视频就传入文件路径。姿态模型的初始化部分MediaPipe的写法通常是import mediapipe as mp mp_pose mp.solutions.pose pose mp_pose.Pose( static_image_modeFalse, model_complexity1, min_detection_confidence0.5, min_tracking_confidence0.5 )这里的model_complexity参数有意思取值0、1、2对应lite、full、heavy三档模型。我实测下来数值0在CPU上最快但精度略逊数值1在精度和速度之间最平衡。如果你的显卡性能强可以调到2姿态估计会更稳尤其是在遮挡较多的场景下。4.2 关键点坐标提取与骨架归一化每处理一帧图像从pose.process()的结果里取出pose_landmarks对象里面有landmark列表包含33个点的x、y、z和visibility。写代码时不能直接拿这些数字去算角度因为返回的是归一化坐标必须先乘上图像的宽高h, w frame.shape[:2] landmarks [] for lm in results.pose_landmarks.landmark: cx, cy int(lm.x * w), int(lm.y * h) landmarks.append((cx, cy, lm.visibility))这一步看起来简单但数据格式转换的正确与否直接决定后续所有计算是否准确。我在自己项目里还会顺手过滤掉visibility低于0.5的点因为当人体部分被遮挡时MediaPipe输出的坐标置信度很低这些“不可信”的点如果参与角度计算会产生完全离谱的结果。4.3 角度计算、阈值判定与可视化渲染角度计算是这份源码的数学核心。已知三个点的坐标求中间点的夹角用的是余弦定理。假设髋、膝、踝三个点坐标已知要计算膝盖角度就以膝盖为中点构建从膝盖指向髋部的向量和从膝盖指向脚踝的向量import math def calculate_angle(hip, knee, ankle): hx, hy hip[0] - knee[0], hip[1] - knee[1] ax, ay ankle[0] - knee[0], ankle[1] - knee[1] cos_theta (hx * ax hy * ay) / ( math.sqrt(hx**2 hy**2) * math.sqrt(ax**2 ay**2) 1e-6 ) cos_theta max(-1.0, min(1.0, cos_theta)) return math.degrees(math.acos(cos_theta))注意分母里加的1e-6这是为了防止向量长度为零时出现除零错误。虽然正常人不会拍出髋膝踝完全重合的画面但代码鲁棒性就是在这些细节里体现的。可视化部分在帧上画出关键点和连线用不同颜色表示当前姿态是否合格。比如膝角大于110度时画绿色标线小于110度时变红。这个实时反馈对使用者来说非常直观戴上护膝做一组的功夫屏幕上每个动作的状态都清清楚楚。5. 实测表现与最容易翻车的三个坑5.1 下蹲速度过快导致漏检我跑这套逻辑时遇到的第一个坑是快速下蹲时姿态检测跟不上。主要体现在人从站立到蹲底的过程可能只用了0.3秒而MediaPipe逐帧推理在CPU上大概需要40到60毫秒一帧虽然看起来“实时”但实际上动作关键的底部状态可能只被捕捉到一两帧甚至因为运动模糊被漏掉。解决办法有两个方向。一是把输入帧的尺寸缩小减少推理耗时比如把分辨率从1280x720压到640x480牺牲一点显示精度换来更高的帧率稳定性。二是用形态学缓冲——不要只依据当前帧的膝角做判定而是维护一个最近3帧的膝角列表取中间值可以显著减少噪声影响。5.2 半蹲误判与阈值调整策略还有一个高频问题很多人做深蹲时根本蹲不满90度但程序偶尔会判定为合格。我排查后发现问题出在阈值判断的单一性上。如果只用膝角小于90度来判合格某些侧向拍摄角度下膝盖角度的投影会被透视缩短本来实际105度画面上看起来却像88度。这是二维图像分析固有的问题无法彻底消除只能缓解。最有效的方法是不要用死阈值而是加一个缓冲区间。比如膝角在85度到95度之间时不立刻判定为合格或不合格而是结合髋角、骨架总高度变化综合判断。骨架总高度从站立到蹲底会明显压缩如果高度压缩比不达标即使膝角到了90度也可能是靠身体蜷缩实现的。5.3 光线、背景与侧身问题MediaPipe的推理效果对画质相当敏感。背光环境下人脸区域欠曝躯干轮廓被阴影吞掉关键点置信度整体下降。强逆光、纯黑背景、大面积镜子里的倒影都会干扰检测。实操建议是摄像头尽量站在光源一侧不要正对窗户背景不要太杂乱穿紧身或浅色衣服躯干轮廓越清晰姿态估计越稳定。还有一个容易忽略的点是相机角度——从正侧面拍摄的深蹲膝角的透视关系最直观如果摄像头在正面偏斜45度左右腿的关键点会出现严重重叠角度计算会跳动得很厉害。6. 源码发布与解压踩坑的那些事6.1 压缩包结构设计与运行说明做完了项目很多人忽略了打包发布这件事。标题里既然带着“zip”标识说明作者是打包发布源码的。一个负责任的压缩包至少要包含这几层内容项目主目录、main.py或run.py入口脚本、requirements.txt依赖清单、README.md使用说明、测试视频样例可选。我在实际发布时会特别强调requirements.txt的重要性。没有这份文件使用者根本不知道要装什么版本全凭猜。README里面要写清楚三件事第一用什么版本的Python跑过第二安装依赖的命令解析第三摄像头模式下按哪个键退出程序。不要觉得这些是废话真实使用者遇到的环境检查比你想的复杂得多。6.2 解压失败“could not find EOCD”的排查思路这一节内容是我根据很多人的提问专门补进来的。下载了别人的zip源码解压时却提示“could not find end of central directory recordEOCD”或者报“file is not a zip file”这个问题在技术社区里提问频率相当高。先说结论90%的情况是文件下载不完整或者文件被某种传输方式破坏了。zip文件的末尾必须有一个EOCD记录它相当于整份压缩包的索引目录。如果下载过程中网络中断、服务器没有正确处理Range请求zip文件就可能少了一截解压工具找不到EOCD就会报错。排查思路建议按顺序走先用ls -l看看文件大小是否和发布页标注的大小一致。再用file xxx.zip命令验证文件类型如果输出不是zip archive说明文件头已经损坏。如果文件头没问题但解压报错尝试用unzip -t xxx.zip测试压缩包完整性。如果是自己用Python代码读取zip可以加一个异常兜底import zipfile try: with zipfile.ZipFile(squat_analysis.zip, r) as zf: zf.extractall(squat_analysis) except zipfile.BadZipFile as e: print(f压缩包损坏或不是有效的zip格式: {e})这层保护虽然简单但在生产脚本里能避免程序直接崩溃还能把错误原因明确告诉用户。6.3 环境不一致导致的import报错解压成功、依赖装好运行main.py时又报ImportError: cannot import name XXX from mediapipe这种问题也很常见。原因通常是MediaPipe版本太新或太旧。比如旧版本有mp.solutions.pose.Pose新版本里某些参数名改了或者源码作者用的是OpenCV 4.5而本机装的是OpenCV 3.x接口行为不同。我自己的习惯是每次发布源码之前新建一个干净环境从零把requirements装一遍跑通后再发布。这样做虽然多花二十分钟但能过滤掉绝大多数环境依赖问题。如果你的运行环境报错也别急着怀疑源码先用pip list对比一下依赖版本大概率是某个库的版本不对齐。7. 这个项目还能怎么继续折腾7.1 从单次检测升级为训练计数器现在的源码如果已经跑通可以试试把它改造成一个完整的训练计数器。核心思路就是前面讲的状态机。我在这个项目里还加了一个“次数组”的逻辑每次完整深蹲结束计数器加1然后把该次动作期间的膝角曲线保存下来训练结束后用matplotlib画出来让用户回看自己每一组的动作节奏。这个功能对训练者非常有价值因为很多人下蹲速度太快是借反弹力起立的角度曲线上一眼就能看出问题。7.2 加入节奏提示与左右对称分析深蹲做的多了还能继续加高级功能。比如用语音合成库输出实时提示“再低一点”、“起身不要太快”、“重心偏右了”。声音反馈比屏幕上的线条更实用因为锻炼时人的视线往往不在屏幕上。左右对称分析也是个好方向。很多人深蹲时左右腿发力不均反映在骨架数据上就是左右膝盖角度曲线有明显偏差。如果源码里已经提取了左右髋、膝、踝三组点直接对比两边的膝角变化曲线计算平均偏差就能量化评估对称性。7.3 更多形态的拓展做完了深蹲分析你会发现这套骨架角度分析框架换几个阈值、换一套状态机就能复用到其他动作上。我也将这套代码的基础部分做成了更通用的框架通过简单的配置就能适配俯卧撑、引体向上等不同动作。具体到深蹲这个项目我个人在实际操作中的体会是骨架角度判断逻辑是核心调试时最先关注角度曲线其次是状态机设计的稳定性它决定了计数器的误判率最后才是可视化效果。把这三层一层层做好这个项目才算真正跑透了。本文还有配套的精品资源点击获取
返回列表