该项目整合了 RTMPose 姿态识别和 ST-GCN 时空图卷积两个模型,结合开创性的距离角度判定算法成功实现了“基于人体姿态关键点的视频分类和打分任务”。
以中国传统文化中的“八段锦”“五禽戏”共计 14 个动作为分类目标,使用“中国移动动感地带AI+高校创智计划”提供的数据集,在 14 个类别上实现高效推理和评分。
在验证集上的输出如下表展示。可以看到,模型成功完成了对动作的分类和打分。
| 视频名称 | 动作分类 | 标注度评分 | 推理耗时 |
|---|---|---|---|
| reference_10.mp4 | 10 | 0.52 | 7.03 |
| reference_157.mp4 | 14(NG) | 0.00 | 13.33 |
| reference_158.mp4 | 14(NG) | 0.00 | 13.10 |
| reference_159.mp4 | 14(NG) | 0.00 | 13.07 |
| reference_160.mp4 | 14(NG) | 0.00 | 12.96 |
| reference_161.mp4 | 14(NG) | 0.00 | 13.08 |
| reference_8.mp4 | 8 | 0.61 | 8.66 |
| standard_10.mp4 | 10 | 1.00 | 6.48 |
| standard_8.mp4 | 8 | 1.00 | 8.32 |
| 动作0-4-29.mp4 | 0 | 0.86 | 6.46 |
| 动作0-4-43.mp4 | 0 | 0.76 | 6.53 |
| 动作0-4-44.mp4 | 0 | 0.64 | 6.50 |
| 动作0-5-1.mp4 | 0 | 0.78 | 6.91 |
| 动作1-4-3.mp4 | 1 | 0.45 | 6.37 |
| 动作1-4-30.mp4 | 1 | 0.57 | 5.85 |
| 动作1-4-4.mp4 | 1 | 0.60 | 6.32 |
| 动作1-4-45.mp4 | 1 | 0.47 | 6.03 |
| 动作10-1-13.mp4 | 10 | 0.52 | 6.57 |
| 动作10-1-2.mp4 | 10 | 0.54 | 6.45 |
| 动作10-1-8.mp4 | 10 | 0.51 | 6.39 |
| 动作10-3-3.mp4 | 10 | 0.56 | 6.29 |
| 动作11-10-14.mp4 | 11 | 0.49 | 5.99 |
| 动作11-10-28.mp4 | 8 | 0.50 | 6.30 |
| 动作11-10-42.mp4 | 11 | 0.50 | 6.10 |
| 动作11-10-55.mp4 | 11 | 0.47 | 5.80 |
| 动作12-12-45.mp4 | 12 | 0.82 | 5.56 |
| 动作12-12-66.mp4 | 12 | 0.79 | 5.89 |
| 动作12-12-67.mp4 | 12 | 0.75 | 6.16 |
| 动作12-13-26.mp4 | 12 | 0.83 | 5.74 |
| 动作13-10-16.mp4 | 13 | 0.54 | 6.24 |
| 动作13-10-30.mp4 | 13 | 0.61 | 5.37 |
| 动作13-10-44.mp4 | 13 | 0.60 | 5.52 |
| 动作13-10-57.mp4 | 13 | 0.68 | 5.27 |
| 动作13-9-70.mp4 | 13 | 0.64 | 5.19 |
| 动作2-4-31.mp4 | 2 | 0.68 | 5.23 |
| 动作2-4-47.mp4 | 2 | 0.74 | 5.06 |
| 动作2-4-5.mp4 | 2 | 0.62 | 5.19 |
| 动作2-4-6.mp4 | 2 | 0.64 | 5.13 |
| 动作3-11-37.mp4 | 3 | 0.80 | 5.77 |
| 动作3-11-38.mp4 | 3 | 0.79 | 6.30 |
| 动作3-12-10.mp4 | 3 | 0.82 | 6.28 |
| 动作3-12-11.mp4 | 3 | 0.81 | 5.92 |
| 动作4-11-40.mp4 | 4 | 0.38 | 8.07 |
| 动作4-11-41.mp4 | 4 | 0.40 | 7.89 |
| 动作4-12-13.mp4 | 4 | 0.39 | 8.73 |
| 动作4-12-14.mp4 | 4 | 0.41 | 7.62 |
| 动作4-12-15.mp4 | 4 | 0.23 | 8.24 |
| 动作5-5-48.mp4 | 5 | 0.54 | 8.25 |
| 动作5-5-60.mp4 | 5 | 0.60 | 8.38 |
| 动作5-5-79.mp4 | 5 | 0.71 | 8.87 |
| 动作5-5-80.mp4 | 5 | 0.39 | 9.78 |
| 动作6-4-13.mp4 | 6 | 0.32 | 5.08 |
| 动作6-4-14.mp4 | 6 | 0.28 | 4.47 |
| 动作6-4-35.mp4 | 6 | 0.34 | 4.58 |
| 动作6-4-55.mp4 | 6 | 0.42 | 5.01 |
| 动作6-4-56.mp4 | 6 | 0.41 | 4.58 |
| 动作6-5-21.mp4 | 6 | 0.38 | 4.60 |
| 动作6-5-35.mp4 | 7 | 0.32 | 4.60 |
| 动作6-5-49.mp4 | 6 | 0.36 | 4.72 |
| 动作6-5-61.mp4 | 6 | 0.43 | 4.64 |
| 动作6-5-7.mp4 | 6 | 0.38 | 4.76 |
| 动作6-5-81.mp4 | 6 | 0.45 | 4.63 |
| 动作7-11-48.mp4 | 7 | 0.99 | 6.79 |
| 动作7-11-49.mp4 | 7 | 0.93 | 6.30 |
| 动作7-11-50.mp4 | 7 | 0.96 | 6.50 |
| 动作7-12-22.mp4 | 7 | 0.92 | 6.32 |
| 动作8-1-23.mp4 | 8 | 0.57 | 8.98 |
| 动作8-1-34.mp4 | 8 | 0.71 | 9.61 |
| 动作8-1-4.mp4 | 8 | 0.75 | 8.74 |
| 动作9-10-12.mp4 | 9 | 0.55 | 8.16 |
| 动作9-10-26.mp4 | 9 | 0.46 | 7.83 |
| 动作9-8-49.mp4 | 9 | 0.61 | 8.50 |
在机器学习中,混淆矩阵是一个非常有用的工具,尤其是在分类问题的评估中。它提供了一个简明扼要的方式来了解模型在不同类别上的表现,尤其是每个类别的预测结果和实际结果之间的关系。
我们分别制作了训练集和验证集上的混淆矩阵图,来直观观察模型的分类效果。从图中可以看出,大多数类别的预测准确度非常高,主对角线上的值接近1.00。这表明模型对这些类别的分类性能非常好。
我们简要实现了对 RTMPose 模型输出的关键点 keypoints.npy 数据的可视化,用于直观检查关键点生成效果。可以看到,模型在整个视频时长内都完全准确识别出了人物,并高效、实时地生成了关键点数据。
- best_model.pth: 最初的模型,未添加数据增强模块,采用 Padding 的方法填充时间轴。直接在训练集上训练,采用早停和 K 折交叉验证,并选取一个 val accuracy 最高的模型。
- best_model_2.pth: 利用三次样条插值算法填充时间轴,解决了模型对时间的过拟合现象;添加旋转、平移和缩放数据增强模块。
- best_model_3.pth: 数据增强中添加随机采样,减少模型对特定模式的过拟合,增强泛化性能。
- best_model_4.pth: 优化随机采样算法,更加均匀;添加镜面数据增强模块,解决无法识别镜面动作的问题。
- 获取 mp4 RAW data: 使用“中国移动动感地带AI+高校创智计划”提供的数据集用作模型训练,共 15 类视频(八段锦 * 8, 五禽戏 * 6, 其它 * 1),每类视频各 50 个;
- 将视频文件转化为姿态关键点 keypoints:利用
RTMlib实现RTMPoseTran类,将单个视频文件转化为关键点数据; - 姿态关键点预处理:利用插值算法对姿态关键点数据预处理,with
PreProcess()方法,将关键点数据转变为模型可以处理的张量形状; - 随机分配到训练集和验证集:按 9 :1 比例,分配数据到训练集和验证集。
K 折交叉验证(K-Fold Cross Validation)是一种模型评估方法,将数据集分为 K 份(folds),每次用其中 K-1 份作为训练集,剩下的一份作为验证集,循环 K 次,最终取所有验证结果的平均值作为模型性能的评估。
作用:
- 减少数据分割偏差:通过多次训练和验证,避免单次划分导致的偶然性。
- 充分利用数据:每个数据点都被用作训练和验证,避免浪费数据。
- 提供稳健的性能评估:更可靠地反映模型在未见数据上的泛化能力。
采用多种数据增强方式,包括旋转、平移、缩放、镜像、随机采样,最终将数据量扩充至原先的 5 倍。
为了验证模型的泛化效果,需要获取在训练集和验证集上从未出现过的视频数据。通过发动身边的同学和家长录制视频,以及网络资料汇总,共同构建测试集。由于不同人对“八段锦”和“五禽戏”的理解大相径庭,以及视频拍摄角度各不相同,和验证集相比,我们构建的测试集的识别难度相当高,想要完全准确识别,是一个相当具有挑战性的任务。
测试集数据共 70 个视频,14 个动作每类动作各 5 个,不包含“其它”类。
实现 model 类,定义网络结构 ST-GCN Block ST-GCN 以及关节连接图 Graph 类。
将预训练模型转为 val mode,在测试集上进行测试。利用混淆矩阵,直观展现模型在训练集、验证集和测试集上的效果,并选择最优模型。
/config: "包含距离角度判定算法需要的依赖文件;/data: 包含模型训练用到的视频关键点 numpy 文件,由 datagen.py 生成,避免每次训练都要重新读取视频;/model: 存放预训练模型,或模型训练完毕后的默认保存位置;/res: 存放推理结果,通常为 .csv 文件;/src: 项目源代码;/tools: 项目用到的其他工具代码,包括数据结构转换、数据集自动构建、numpy 文件可视化等/vid: 默认的视频存放路径;/doc: 存放项目说明文档和相关依赖图片。
一级目录下的其他文件:
PoseTracking.py: 基于预训练模型实现推理和打分任务;README.md: 本文件;main.py: 实现 ST-GCN 模型训练和推理功能,已逐步弃用并耦合进 /src;requirements.txt: 依赖文件列表,不包含 pytorchsetup.py: 自动化部署脚本,待实现
data_feeder.py: 创建 dataset 的依赖类;datapro.py: 数据增强模块,包含多种数据增强算法;early_stopping.py: 早停类,实现训练过程的早停;infer.py: 推理方法,实现批量推理;model.py: ST-GCN 模型实现;rtmpose_tran.py: 调用 RTMPose 实现视频转关键点;score.py: DAA 打分模型算法实现;test.py: 测试模型并可视化;train.py: 训练模型,包含多个训练方法;utils.py: 工具方法的实现;visualize.py: 数据可视化例如混淆矩阵的实现
如果你希望通过 Git 克隆项目,你需要首先确保你的系统已经安装了 Git。可以在终端或命令行中运行以下命令来克隆项目:
git clone https://github.com/ZHmQAQ/PoseClassifier.git
cd PoseClassifier将 [项目Git仓库URL] 替换为你的实际项目 Git 仓库地址。
略。
根据你的系统和是否需要 GPU 支持,安装命令可能有所不同。你可以在 PyTorch 的官方网站(PyTorch Get Started)上找到适合你系统的安装指令。
你可以使用以下命令安装所有必要的 Python 库:
pip install -r requirements.txt如果希望使用 GPU 进行推理,由于 RTMPose 采用 ONNX 模型,因此需要安装以下相关依赖组件:
- 访问 NVIDIA CUDA Toolkit 网站。
- 选择适合你的操作系统的版本(确保与你的 GPU 驱动兼容)。
- 下载并安装 CUDA Toolkit。
- 访问 NVIDIA cuDNN 页面。
- 需要注册并登录 NVIDIA 开发者账户以下载 cuDNN。
- 根据你已安装的 CUDA 版本选择对应的 cuDNN 版本。
- 下载并按照官方指南安装 cuDNN。
安装 ONNX Runtime 以支持 GPU,可以使用 pip 直接安装适配 GPU 的版本:
pip install onnxruntime-gpu

