尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于LSTM与MediaPipe的人体动作姿态识别Python源码实战解析

发布时间:2026/9/28 17:18:04

资讯中心
01
ARTICLE

基于LSTM与MediaPipe的人体动作姿态识别Python源码实战解析

基于LSTM与MediaPipe的人体动作姿态识别Python源码实战解析
简介本资源是一套基于LSTM与MediaPipe实现人体动作姿态识别的Python项目源码面向计算机、人工智能、通信、物联网等专业的在校学生与教师可用于毕业设计、课程设计、大作业或项目立项演示。项目通过MediaPipe提取视频流中人体关键姿态信息再交由LSTM网络完成动作分类识别可应用于教育、运动分析、康复训练等场景。压缩包共280个文件约22.09MB包含16个py源码文件、240个npy数据文件、16个mp4示例视频、2个h5模型权重及说明文档等覆盖数据处理、模型训练与推理演示的完整流程。目前已有184人学习下载。代码完整且功能验证通过读者可据此理解姿态特征提取与序列建模的衔接方式并在此基础上进行二次开发替换数据集或调整网络结构以扩展其他动作识别功能。1. 从一段 30 帧视频说起这套 LSTMMediaPipe 姿态识别源码到底能跑出什么带过几届毕设之后我总结出一个规律凡是标题里同时出现「LSTM」和「MediaPipe」的项目八成卡在同一个地方——骨架点提取出来了但时序建模那一步接不上。你手里这份基于LSTM和mediapipe 实现人体动作姿态识别python源码就是冲着这个断点来的。它把 MediaPipe 的 Pose 模块当作前端特征提取器把每帧的 33 个关键点坐标序列喂给 LSTM 做时序分类最终输出动作类别。压缩包里能看到action.h5这个训练好的权重文件还有l0.mp4、r0.mp4、r1.mp4三段示例视频说明作者至少跑通了「视频输入 → 姿态序列 → 分类输出」这条链路。适合谁如果你正在做计算机相关专业的毕业设计、课程设计或者需要一个能演示的初期立项原型这套东西的性价比在于它不要求你从零标注数据集也不要求你手写 LSTM 单元。但前提是你得理解它每一环在干什么否则改一个参数就翻车。下面我按「先看懂结构 → 再跑通流程 → 再避开坑 → 最后做二次开发」的顺序拆一遍。2. 拆开压缩包MediaPipe 提点与 LSTM 时序建模怎么咬合2.1 为什么是 MediaPipe 而不是 OpenCVDNN人体姿态识别的前端方案常见有三类OpenCV 的 DNN 模块加载 Caffe/TF 模型、MediaPipe、以及 YOLO-Pose 这类端到端方案。这份源码选 MediaPipe理由很实际——它把「检测关键点回归」封装成一个Pose对象调用三行代码就能拿到 33 个归一化坐标不需要你单独处理 NMS、anchor 匹配这些底层逻辑。MediaPipe Pose 输出的 33 个关键点覆盖了面部鼻子、眼睛、耳朵、上肢肩、肘、腕、手部关键点、躯干髋、脊柱和下肢膝、踝、脚。每个点有x, y, z, visibility四个值其中x, y是归一化到[0,1]的图像坐标z是相对深度visibility表示该点是否被遮挡。对动作分类来说真正有用的是x, y和visibilityz的噪声偏大我一般会先丢掉。提示MediaPipe 的z是以髋部中心为原点的相对值不是真实深度做精细动作区分时不要依赖它。2.2 LSTM 在这里解决什么问题单帧的 33 个点只能告诉你「这一刻人是什么姿势」但「挥手」和「举手」在某一帧可能长得几乎一样。区别在于时间维度上的变化模式挥手是左右往复举手是单向抬升。LSTM 的门控机制遗忘门、输入门、输出门就是用来记住「前面几帧手在左边还是右边」这种上下文。源码里的action.h5是一个 Keras/TensorFlow 格式的权重文件从命名习惯推断网络结构大概率是LSTM → Dropout → Dense(softmax)这种经典堆叠。输入张量的形状通常是(batch, time_steps, features)其中time_steps是每次喂入的帧数常见 30 或 60features是每帧的关键点维度。如果你用 33 个点的x, y两个坐标features 66如果加上visibility就是 99。2.3 从视频到分类结果的完整数据流把整条链路拆成可操作的步骤大概是下面这样import cv2 import mediapipe as mp import numpy as np mp_pose mp.solutions.pose pose mp_pose.Pose(static_image_modeFalse, model_complexity1, min_detection_confidence0.5, min_tracking_confidence0.5) def extract_keypoints(video_path, max_frames30): cap cv2.VideoCapture(video_path) frames [] while cap.isOpened() and len(frames) max_frames: ret, frame cap.read() if not ret: break rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) result pose.process(rgb) if result.pose_landmarks: # 只取 x, y丢掉 z 和 visibility 的噪声 kp [[lm.x, lm.y] for lm in result.pose_landmarks.landmark] frames.append(np.array(kp).flatten()) # shape: (66,) cap.release() # 不足 max_frames 时用零填充保证输入维度一致 while len(frames) max_frames: frames.append(np.zeros(66)) return np.array(frames) # shape: (30, 66)这段代码的逻辑说明static_image_modeFalse让 MediaPipe 在视频模式下启用跟踪比逐帧检测快很多model_complexity1是精度和速度的折中0 最快但精度低2 最准但吃 CPUmin_detection_confidence和min_tracking_confidence都设 0.5 是保守值光线差的时候可以降到 0.3但会引入抖动。参数说明max_frames30对应 LSTM 的time_steps这个值必须和训练时一致否则action.h5加载后会报维度错误。零填充是为了处理短视频但填充过多会让模型把「静止」误判成某个动作后面避坑章节会细说。2.4 加载 action.h5 做推理拿到(30, 66)的序列后扩一维变成(1, 30, 66)就能喂给模型from tensorflow.keras.models import load_model model load_model(action.h5) seq extract_keypoints(l0.mp4) # (30, 66) seq np.expand_dims(seq, axis0) # (1, 30, 66) pred model.predict(seq, verbose0) class_id np.argmax(pred, axis1)[0] confidence np.max(pred) print(f预测类别: {class_id}, 置信度: {confidence:.3f})逻辑说明load_model会同时恢复网络结构和权重前提是你的 TensorFlow 版本和保存时兼容。np.argmax取最大概率对应的类别索引confidence低于 0.6 时基本可以认为模型在瞎猜这时候要检查输入序列是否有效比如 MediaPipe 根本没检测到人。3. 环境搭建与首次运行从 python 安装到跑通 l0.mp43.1 依赖版本是最大的玄学MediaPipe 和 TensorFlow 的版本兼容性堪称血泪经验。我见过太多人pip install mediapipe tensorflow之后直接报DLL load failed或者AttributeError: module mediapipe has no attribute solutions。原因是 MediaPipe 对 protobuf 和 numpy 的版本有硬性要求而 TensorFlow 2.x 又对 numpy 有另一套要求两者打架。我一般会这样锁版本Python 3.83.10 最稳3.11 以上 MediaPipe 支持还不完善python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install --upgrade pip pip install mediapipe0.10.9 pip install tensorflow2.13.0 pip install opencv-python4.8.1.78 pip install numpy1.24.3参数说明mediapipe0.10.9是写这篇文章时比较稳定的版本tensorflow2.13.0对应 Keras 2.13能正常加载大多数.h5文件。numpy1.24.3是这两个库的交集。如果你用pycharm配置python环境记得在项目解释器里选刚才建的 venv不要用系统 Python。注意项目路径不要带中文解压后重命名为英文比如action_recognition。MediaPipe 在 Windows 下对中文路径的处理有 bug会直接读不到模型文件。3.2 验证 MediaPipe 是否正常工作装完之后别急着跑主程序先单独测 MediaPipeimport mediapipe as mp import cv2 mp_pose mp.solutions.pose pose mp_pose.Pose() img cv2.imread(test.jpg) # 随便一张有人物的图 result pose.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) if result.pose_landmarks: print(检测到, len(result.pose_landmarks.landmark), 个关键点) else: print(未检测到人体)如果这里报错后面全白搭。常见错误是ImportError: cannot import name solutions说明 MediaPipe 装成了残缺版卸载重装。另一个是cv2显示不了图那是 OpenCV 的 GUI 后端问题服务器上跑就加cv2.imshow换成保存文件。3.3 跑通示例视频并观察输出用l0.mp4做端到端测试把每一帧的预测结果打印出来import cv2 import numpy as np from tensorflow.keras.models import load_model model load_model(action.h5) cap cv2.VideoCapture(l0.mp4) buffer [] while cap.isOpened(): ret, frame cap.read() if not ret: break rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) result pose.process(rgb) if result.pose_landmarks: kp [[lm.x, lm.y] for lm in result.pose_landmarks.landmark] buffer.append(np.array(kp).flatten()) if len(buffer) 30: seq np.expand_dims(np.array(buffer), axis0) pred model.predict(seq, verbose0) print(类别:, np.argmax(pred), 置信度:, np.max(pred)) buffer buffer[15:] # 滑动窗口每次移一半 cap.release()逻辑说明这里用了滑动窗口而不是每 30 帧切一次好处是预测更连续不会出现「第 30 帧才有输出」的卡顿感。buffer buffer[15:]表示每次保留后 15 帧新来 15 帧凑成下一个 30 帧窗口相当于 50% 重叠。参数说明重叠比例可以调buffer[10:]是 66% 重叠预测更平滑但计算量翻倍buffer[29:]几乎不重叠适合对实时性要求高的场景。我一般用 50%平衡得比较好。4. 避坑与排查五个让项目跑不起来的真实原因4.1 现象加载 action.h5 报ValueError: Input 0 is incompatible原因训练时的time_steps或features和你推理时不一致。比如训练用了 30 帧 × 99 维含 visibility你推理只给了 66 维。解决先打印模型输入形状确认print(model.input_shape) # 例如 (None, 30, 99)然后调整你的特征提取逻辑把visibility加回去或者用model.input_shape动态决定max_frames。4.2 现象MediaPipe 检测不到关键点result.pose_landmarks一直是 None原因三种可能——画面里没人、光线太暗、或者min_detection_confidence设太高。解决先把min_detection_confidence降到 0.3model_complexity升到 2然后保存一帧中间结果看看画面质量。如果画面本身模糊再调参数也没用得换视频源。4.3 现象预测结果全是同一个类别置信度还很高原因零填充过多。如果视频只有 10 帧有效数据剩下 20 帧全是零LSTM 会把「静止」这个模式学成某个动作。解决要么保证输入视频至少 30 帧要么在填充时用最后一帧复制而不是零填充while len(frames) max_frames: frames.append(frames[-1] if frames else np.zeros(66))4.4 现象TensorFlow 和 MediaPipe 同时导入时崩溃原因protobuf 版本冲突。MediaPipe 依赖protobuf4而新版 TensorFlow 可能装了protobuf4。解决强制降级pip install protobuf3.20.3如果还不行就分开两个进程跑——MediaPipe 提点存成 npy 文件TensorFlow 单独读文件推理。虽然麻烦但能绕开依赖地狱。4.5 现象视频播放卡顿帧率掉到个位数原因model_complexity2加上每帧都做model.predictCPU 扛不住。解决把model_complexity降到 0 或 1预测改成滑动窗口每 15 帧才推理一次中间帧复用上一次结果。如果还卡考虑用python生成exe可执行文件打包后放到性能更好的机器上跑。5. 二次开发与验证换动作、调窗口、看混淆矩阵5.1 换一套动作类别要改哪里action.h5的输出维度是固定的比如 5 类动作。如果你想识别自己的动作比如深蹲、开合跳必须重新训练。步骤是用 MediaPipe 把你的视频转成(N, 30, 66)的序列数据集标签用 one-hot然后搭一个同样的 LSTM 结构训练。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dropout, Dense model Sequential([ LSTM(64, return_sequencesTrue, input_shape(30, 66)), LSTM(32), Dropout(0.3), Dense(5, activationsoftmax) # 5 类动作 ]) model.compile(optimizeradam, losscategorical_crossentropy, metrics[accuracy]) model.fit(X_train, y_train, epochs50, batch_size16, validation_split0.2) model.save(my_action.h5)参数说明两层 LSTM 比单层能捕捉更复杂的时序模式但数据量少于 500 条时容易过拟合Dropout(0.3)就是用来压过拟合的。epochs50配合validation_split0.2可以观察验证集准确率是否还在涨不涨就停。5.2 用混淆矩阵验证模型是不是在瞎猜准确率高不代表模型学到了东西。如果 5 类动作里 4 类都是「站立」模型全预测成站立也能有 80% 准确率。我习惯跑一遍混淆矩阵from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt y_pred model.predict(X_test) y_pred_labels np.argmax(y_pred, axis1) y_true_labels np.argmax(y_test, axis1) cm confusion_matrix(y_true_labels, y_pred_labels) sns.heatmap(cm, annotTrue, fmtd, cmapBlues) plt.xlabel(预测) plt.ylabel(真实) plt.savefig(confusion_matrix.png)看对角线是否明显深于其他格子。如果某一行全黑说明那个动作模型完全没学会要么数据太少要么那个动作和别的动作在关键点层面区分度不够。5.3 滑动窗口的重叠率怎么选前面提过buffer[15:]是 50% 重叠。我做过一组对比重叠率 0% 时预测结果跳变明显同一个动作中间会闪出别的类别重叠率 50% 时跳变减少但仍有重叠率 80% 时输出非常平滑但推理频率是 0% 的五倍实时性差。我的习惯是离线分析用 80%实时演示用 50%嵌入式设备用 0% 加后处理投票连续 3 次预测取众数。从那以后我每次调窗口参数都强制跑一遍l0.mp4和r0.mp4对比两者的预测曲线是否稳定再决定要不要上线。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。