基于YOLO-NAS-Pose模型的单板滑雪姿态分析系统,能够从视频中提取滑雪者的姿态信息,分析下半身姿态和重心变化,为滑雪技巧改进提供数据支持。
- Python 3.8 或更高版本
- CUDA 兼容的 GPU (推荐) 或 CPU
-
克隆或下载项目到本地
-
创建并激活虚拟环境
# 使用 conda 创建环境
conda create -n skipose python=3.8
conda activate skipose
# 或使用 venv 创建环境
python -m venv skipose
# Windows
skipose\Scripts\activate
# Linux/Mac
source skipose/bin/activate- 安装依赖包
pip install -r requirements.txt如果没有 requirements.txt,请手动安装以下依赖:
pip install torch torchvision torchaudio
pip install super-gradients
pip install opencv-python
pip install numpy本系统使用 YOLO-NAS-Pose 模型进行姿态检测。模型文件应放置在 model 目录下:
- 创建
model目录
mkdir model- 下载预训练模型文件 (推荐使用 YOLO-NAS-POSE-L 版本以获得最佳精度)
yolo_nas_pose_l_coco_pose.pth- 大型模型,精度最高yolo_nas_pose_m_coco_pose.pth- 中型模型,平衡精度和速度yolo_nas_pose_s_coco_pose.pth- 小型模型,速度最快yolo_nas_pose_n_coco_pose.pth- 微型模型,速度极快
模型文件可以从 SuperGradients 官方仓库或通过以下方式获取:
from super_gradients.training import models
model = models.get("yolo_nas_pose_l", pretrained_weights="coco_pose")
model.save("model/yolo_nas_pose_l_coco_pose.pth")本系统主要由以下几个部分组成:
- 模型加载模块:加载YOLO-NAS-Pose预训练模型
- 视频处理模块:读取视频,提取指定时间段
- 姿态检测模块:使用模型检测每一帧的人体关键点
- 姿态分析模块:计算下半身姿态指标和重心位置
- 结果输出模块:生成可视化视频和JSON格式的分析数据
-
初始化阶段
- 设置设备 (GPU/CPU)
- 加载YOLO-NAS-Pose模型
- 配置输入输出路径
-
视频预处理
- 读取视频文件获取基本信息 (FPS、总帧数)
- 计算需要处理的帧范围 (根据指定的开始和结束时间)
- 使用模型对整个视频进行预测
-
数据筛选与缓存
- 将预测结果生成器转换为列表
- 根据时间范围筛选需要的帧
- 用筛选后的结果替换原始生成器
-
姿态分析
- 遍历每一帧的预测结果
- 提取17个COCO关键点
- 计算以下关键指标:
- 平衡指标 (balance_metric):重心与脚踝中心的水平偏移
- 膝盖弯曲度 (left_knee_bend/right_knee_bend):髋-膝-踝三点角度
- 躯干扭转 (torso_twist):肩线与髋线的角度差
- 垂直稳定性 (vertical_stability):重心的垂直位置
-
结果输出
- 将分析结果保存为JSON文件
- 生成带有姿态标注的可视化视频
-
关键点检测
- 使用COCO数据集的17个关键点,包括鼻子、眼睛、耳朵、肩膀、肘部、手腕、臀部、膝盖和脚踝
- 特别关注下半身关键点 (臀部、膝盖、脚踝) 用于滑雪姿态分析
-
角度计算
- 使用向量点积计算三点间角度
- 使用反正切函数计算水平角度
- 处理异常值和边界情况
-
重心计算
- 以左右髋关节中心作为重心近似点
- 计算重心与脚踝中心的相对位置评估平衡
-
准备视频文件
- 将滑雪视频放入
dataset目录 - 支持常见视频格式 (MP4, AVI, MOV等)
- 将滑雪视频放入
-
配置参数
- 在
yolo-nas-pose-detail.py中修改以下参数:INPUT_VIDEO_FILENAME = "your_video.mp4" # 视频文件名 START_TIME_SECONDS = 0 # 开始时间 (秒) END_TIME_SECONDS = 30 # 结束时间 (秒) CONFIDENCE = 0.6 # 检测置信度阈值
- 在
-
运行分析
python yolo-nas-pose-detail.py
-
使用简化版脚本进行基本姿态检测:
python simple_pose.py
-
修改
simple_pose.py中的视频路径:input_video = "dataset/chill-snowboard-01.mp4" # 修改为其他视频文件 output_video = "output/pose_result_01.mp4" # 修改输出文件名
系统会生成两种输出文件:
-
可视化视频 (
output/video/视频名-nas-pose.mp4)- 原始视频片段 (指定时间段)
- 关键点标注 (绿色点)
- 下半身关键点特别标注 (红色点)
- 骨架连接线
- 重心位置标记 (黄色点)
-
分析数据 (
output/json/视频名-pose-analysis.json)[ { "frame_index": 0, "persons": [ { "person_id": 0, "score": 0.95, "derived_metrics": { "balance_metric": 5.2, "left_knee_bend": 120.5, "right_knee_bend": 118.3, "torso_twist": 5.7, "vertical_stability": 320.1 } } ] } ]
- balance_metric: 重心与脚踝中心的水平偏移 (像素值)。正值表示重心偏向右侧,负值表示偏向左侧。
- left_knee_bend/right_knee_bend: 左右膝盖弯曲角度 (度)。值越小表示膝盖弯曲越大。
- torso_twist: 躯干扭转角度 (度)。正值表示顺时针扭转,负值表示逆时针扭转。
- vertical_stability: 重心的垂直位置 (像素值)。可用于分析身体姿态的稳定性。
sbPose/
├── dataset/ # 视频数据集
│ ├── chill-snowboard-01.mp4
│ ├── chill-snowboard-02.mp4
│ └── ...
├── model/ # 模型文件目录
│ ├── yolo_nas_pose_l_coco_pose.pth
│ └── ...
├── output/ # 输出结果目录
│ ├── video/ # 可视化视频
│ └── json/ # 分析数据
├── yolo-nas-pose-detail.py # 详细分析脚本
├── simple_pose.py # 简化版YOLOv8 Pose脚本
├── yolo-nas-pose.py # 基础YOLO-NAS-Pose脚本
├── requirements.txt # 依赖包列表
└── README.md # 项目说明
模型检测的17个COCO关键点包括:
- 0: 鼻子
- 1: 左眼
- 2: 右眼
- 3: 左耳
- 4: 右耳
- 5: 左肩
- 6: 右肩
- 7: 左肘
- 8: 右肘
- 9: 左腕
- 10: 右腕
- 11: 左髋
- 12: 右髋
- 13: 左膝
- 14: 右膝
- 15: 左踝
- 16: 右踝
- 视频中滑雪者应清晰可见,避免严重遮挡
- 建议使用侧面或斜侧面视角的视频,以便更好地分析姿态
- 处理时间取决于视频长度和硬件性能,建议使用GPU加速
- 模型检测置信度可根据视频质量调整,质量较低时可适当降低阈值
-
模型加载失败
- 检查模型文件是否存在于
model目录 - 确认模型文件名是否正确
- 检查模型文件是否存在于
-
视频处理失败
- 检查视频文件路径是否正确
- 确认视频格式是否受支持
-
内存不足
- 减少处理的视频长度
- 降低视频分辨率
- 使用更小的模型 (如YOLO-NAS-POSE-S)
- Python 3.8+
- SuperGradients (YOLO-NAS-Pose)
- OpenCV
- PyTorch
- NumPy