AI人体骨骼检测结果导出:CSV/Excel格式转换教程
1. 引言
1.1 学习目标
本文将带你掌握如何从AI 人体骨骼关键点检测系统(基于 Google MediaPipe)中,提取并结构化输出 33 个关节点的坐标数据,最终实现以CSV 和 Excel 文件格式保存的完整流程。无论你是做运动分析、姿态评估还是行为识别研究,本教程都能帮助你快速将视觉检测结果转化为可分析的数据集。
学完本文后,你将能够: - 理解 MediaPipe Pose 输出的关键点数据结构 - 编写 Python 脚本提取关键点坐标(x, y, z, visibility) - 将多帧或多图像的姿态数据批量导出为 CSV 文件 - 使用pandas进一步生成带标签的 Excel 表格 - 在 WebUI 应用中集成“一键导出”功能
1.2 前置知识
建议具备以下基础: - 基础 Python 编程能力 - 了解 NumPy 和 Pandas 数据处理库 - 熟悉 OpenCV 或图像处理基本概念(非必须)
💡 本文适用于本地部署的 MediaPipe Pose 镜像环境,所有代码均可在 CPU 上高效运行。
2. 技术背景与数据结构解析
2.1 MediaPipe Pose 模型简介
MediaPipe Pose 是 Google 开发的轻量级人体姿态估计模型,能够在普通 CPU 上实现实时推理。它通过单张 RGB 图像预测33 个 3D 关键点,包括:
- 面部特征点(如鼻子、眼睛)
- 上肢(肩、肘、腕)
- 下肢(髋、膝、踝)
- 躯干与脊柱连接点
每个关键点包含四个维度: -x,y:归一化图像坐标(0~1) -z:深度信息(相对深度,单位与 x 相同) -visibility:置信度分数(越接近 1 越可靠)
这些数据以landmark列表形式返回,是后续导出的核心来源。
2.2 关键点索引对照表
以下是部分常用关键点的索引编号(共 33 个):
| 索引 | 名称 | 描述 |
|---|---|---|
| 0 | nose | 鼻子 |
| 11 | left_shoulder | 左肩 |
| 13 | left_elbow | 左肘 |
| 15 | left_wrist | 左手腕 |
| 23 | left_hip | 左髋 |
| 25 | left_knee | 左膝 |
| 27 | left_ankle | 左脚踝 |
| 12 | right_shoulder | 右肩 |
| 14 | right_elbow | 右肘 |
| 16 | right_wrist | 右手腕 |
| 24 | right_hip | 右髋 |
| 26 | right_knee | 右膝 |
| 28 | right_ankle | 右脚踝 |
📌 提示:可通过
mp_pose.PoseLandmark枚举类直接调用名称,避免硬编码索引。
3. 实现步骤详解
3.1 环境准备与依赖安装
确保你的环境中已安装以下库:
pip install mediapipe opencv-python pandas openpyxlmediapipe:核心姿态检测模型opencv-python:图像读取与绘制pandas:数据整理与导出openpyxl:支持 Excel (.xlsx) 写入
3.2 单张图像关键点提取
以下代码展示如何加载图像、执行检测并提取原始坐标数据:
import cv2 import mediapipe as mp import numpy as np # 初始化 MediaPipe Pose 模型 mp_pose = mp.solutions.pose pose = mp_pose.Pose( static_image_mode=True, model_complexity=1, enable_segmentation=False, min_detection_confidence=0.5 ) # 读取图像 image_path = 'person.jpg' image = cv2.imread(image_path) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行姿态检测 results = pose.process(rgb_image) # 提取关键点数据 if results.pose_landmarks: landmarks = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): # 将归一化坐标转为像素值(可选) h, w, _ = image.shape cx, cy = int(landmark.x * w), int(landmark.y * h) cz = landmark.z visibility = landmark.visibility landmarks.append({ 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x_norm': landmark.x, 'y_norm': landmark.y, 'z': cz, 'visibility': visibility, 'x_pixel': cx, 'y_pixel': cy }) print(f"✅ 成功提取 {len(landmarks)} 个关键点") else: print("❌ 未检测到人体")📌说明: - 使用static_image_mode=True保证高精度静态图检测 - 返回的landmark是归一化坐标,乘以图像宽高可得像素位置 -visibility字段可用于后期过滤低置信度点
3.3 导出为 CSV 文件
将上述landmarks列表保存为 CSV 格式,便于后续分析:
import pandas as pd # 转换为 DataFrame df = pd.DataFrame(landmarks) # 保存为 CSV output_csv = 'skeleton_keypoints.csv' df.to_csv(output_csv, index=False) print(f"📁 关键点数据已保存至: {output_csv}")生成的 CSV 文件包含如下字段:
index,name,x_norm,y_norm,z,visibility,x_pixel,y_pixel 0,nose,0.492,0.312,-0.003,0.998,984,624 1,left_eye_inner,0.488,0.305,...,... ...3.4 批量处理多张图像并合并数据
若需对多个动作或视频帧进行分析,可遍历文件夹并汇总所有数据:
import os from glob import glob def process_images_in_folder(folder_path): all_data = [] for img_file in sorted(glob(os.path.join(folder_path, "*.jpg"))): image = cv2.imread(img_file) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(rgb_image) if not results.pose_landmarks: continue frame_data = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): frame_data.append({ 'frame': os.path.basename(img_file), 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x_norm': landmark.x, 'y_norm': landmark.y, 'z': landmark.z, 'visibility': landmark.visibility }) all_data.extend(frame_data) return pd.DataFrame(all_data) # 示例调用 df_batch = process_images_in_folder('./images/') df_batch.to_csv('batch_skeleton_data.csv', index=False) print("📊 批量数据已导出")此方法适合用于: - 视频逐帧抽样分析 - 不同动作对比实验 - 训练数据预处理
3.5 导出为 Excel 多工作表格式
使用pandas.ExcelWriter可创建结构化 Excel 文件,提升可读性:
with pd.ExcelWriter('skeleton_analysis.xlsx') as writer: # 主表:所有关键点坐标 df.to_excel(writer, sheet_name='Keypoints_Raw', index=False) # 统计表:可见性分布 visibility_stats = df.groupby('name')['visibility'].mean().reset_index() visibility_stats.to_excel(writer, sheet_name='Visibility_Summary', index=False) # 动作摘要(示例) summary_df = pd.DataFrame([{ 'total_frames': 1, 'detected_keypoints': len(df), 'avg_visibility': df['visibility'].mean(), 'notes': 'Standing pose' }]) summary_df.to_excel(writer, sheet_name='Summary', index=False) print("📄 数据已导出至 Excel,含多个工作表")生成的.xlsx文件包含三个标签页,方便研究人员直接查看和筛选。
4. WebUI 中集成导出功能(进阶)
如果你使用的是带有 WebUI 的镜像平台(如 Gradio 或 Flask),可以添加一个“导出按钮”,让用户点击即可下载 CSV/Excel。
4.1 使用 Gradio 实现导出接口
import gradio as gr def detect_and_export(image): # 执行检测(同上) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(rgb_image) if not results.pose_landmarks: return None, "未检测到人体" # 构建数据框 landmarks = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): landmarks.append({ 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x': landmark.x, 'y': landmark.y, 'z': landmark.z, 'visibility': landmark.visibility }) df = pd.DataFrame(landmarks) # 临时保存为 CSV csv_path = "output_keypoints.csv" df.to_csv(csv_path, index=False) # 返回图像 + 文件路径 annotated_image = draw_skeleton(image, results.pose_landmarks.landmark) return annotated_image, csv_path # Gradio 界面 demo = gr.Interface( fn=detect_and_export, inputs=gr.Image(type="numpy"), outputs=[ gr.Image(type="numpy", label="骨骼可视化"), gr.File(label="下载关键点数据 (CSV)") ], title="AI 人体骨骼检测 & 数据导出", description="上传图片,自动检测骨骼关键点并支持导出为 CSV" ) demo.launch()用户上传图像后,不仅能看见火柴人连线图,还能点击“下载”按钮获取结构化数据。
5. 常见问题与优化建议
5.1 常见问题解答(FAQ)
| 问题 | 解决方案 |
|---|---|
| 导出文件为空? | 检查是否成功检测到人体,确认results.pose_landmarks不为None |
| 坐标全是 0~1? | 这是归一化值,若需像素坐标,请乘以图像宽高 |
| Excel 打不开? | 安装openpyxl:pip install openpyxl |
| 多人场景只出一人? | MediaPipe 默认仅返回最显著的一人,可通过max_num_people=1控制 |
5.2 性能优化建议
- 缓存模型实例:避免重复初始化
Pose(),提升批量处理速度 - 降低图像分辨率:在不影响精度前提下缩小输入尺寸(如 640x480)
- 异步导出:Web 场景下使用后台线程生成文件,防止阻塞 UI
- 压缩输出:大量数据时可用
gzip压缩 CSV:df.to_csv('data.csv.gz', compression='gzip')
6. 总结
6.1 核心收获回顾
本文系统讲解了如何从 MediaPipe Pose 模型中提取人体骨骼关键点数据,并将其导出为结构化文件格式:
- ✅ 掌握了 MediaPipe 关键点的数据结构与访问方式
- ✅ 实现了单图/批量图像的关键点提取流程
- ✅ 完成了 CSV 和 Excel 格式的自动化导出
- ✅ 在 WebUI 中集成了“一键导出”功能,提升用户体验
这些技能特别适用于: - 运动科学中的姿态分析 - 康复训练的动作评分系统 - 动画制作的角色绑定预处理 - AI 教练系统的反馈引擎构建
6.2 下一步学习建议
- 尝试结合 OpenPose 或 HRNet 对比精度差异
- 将 3D 坐标导入 Blender 实现动作重建
- 使用 LSTM 模型对时序关键点做动作分类
- 构建私有 API 接口供其他系统调用
💡获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。