预测人类动作
详细信息
这个项目是张博士的人本机器人(CSCI473)课程的第 3 个项目,于 2020 年春季学期在科罗拉多矿业学院进行。它旨在通过使用支持向量机(SVM)为机器人中的机器学习提供入门介绍。原始项目交付物/说明可在这里查看。
对于这个项目,使用了带有一些修改的 MSR Daily Activity 3D 数据集(图 2)。该数据集包含从 Xbox Kinetic 传感器收集并以骨架形式存储的 16 种人类活动。骨架是一个数组,包含在一帧中记录的人体 20 个关节的真实世界 (x, y, z) 坐标。下面是一张展示骨架是什么的图:
为了实现人类动作预测,原始数据必须以一种可以被 SVM 处理的形式来表示。对于这个项目,使用了以下表示方法:
- 相对角度和距离(RAD)表示
- 关节位置差异直方图(HJPD)表示
对于分类,这些表示被送入由 LIBSVM 驱动的 SVM 中,以创建一个可以预测人类动作的模型。将创建两个模型,一个使用 RAD,另一个使用 HJPD。目标是尽可能提高这些模型的准确性,并查看哪种表示方法表现最好。
了解这些之后,以下是代码执行内容的概述:
- 从修改后的数据集中加载原始数据
- 从加载的数据集中移除任何异常值和/或错误数据
- 将最终原始数据转换为 RAD 和 HJPD 表示
- 将这些表示送入调参后的 SVM 以生成两个模型
- 然后将测试原始数据输入这两个模型,并生成混淆矩阵来衡量模型的表现。
结果
在运行代码并尽我所能调优模型后,以下是 RAD 和 HJPD 两个模型的最终混淆矩阵:
Representation: RAD
Accuracy: 62.5%
LIBSVM Classification 8.0 10.0 12.0 13.0 15.0 16.0
Actual Activity Number
8.0 8 0 0 0 0 0
10.0 1 5 0 0 1 1
12.0 0 1 1 0 3 3
13.0 0 0 0 6 1 1
15.0 0 0 0 1 5 2
16.0 0 0 0 0 3 5
Representation: HJPD
Accuracy: 70.83%
LIBSVM Classification 8.0 10.0 12.0 13.0 15.0 16.0
Actual Activity Number
8.0 7 1 0 0 0 0
10.0 1 5 0 0 0 2
12.0 0 0 7 0 1 0
13.0 2 0 1 5 0 0
15.0 0 0 0 0 7 1
16.0 0 2 0 0 3 3
结论
由于这两个准确率都高于 50%,这个项目是成功的。此外,HJPD 表示似乎是用于此分类的更准确表示。有了这个,就有了一个使用骨架数据预测人类动作的模型。这里的模型远非完美,但比随机猜测要好。这个项目后来孕育了 Moving Pose 项目。
其他说明:
- 这个项目在 Python 3.8.13 版本上进行了测试
- 对于这个项目,使用了完整的 MDA3 数据集和一个修改后的 MDA3 数据集。修改后的 MDA3 只包含活动 8、10、12、13、15 和 16。此外,修改版本中包含一些“损坏”的数据点,而完整数据集不包含这些点。
- 基于 3D 骨架数据的人体时空表示:综述
- YouTube:Kinect 深度传感器在 2 分钟内的工作原理
- Medium:理解 Kinect V2 关节与坐标系
- Kinect 维基百科页面
- Jameco Xbox Kinect
- 关于 SVM 和 LibSVM 的信息:cjlin libsvm、libsvm pypi 页面 和 libsvm github
- SVM 和 LIBSVM 逻辑与文档:cjlin 指南论文 和 cjlin libsvmtools 数据集
- 有关所使用/修改数据集的信息