基于MediaPipe模型能力的多种人体关键点姿态估计可视化
背景介绍
人体姿态估计是计算机视觉(computer vision,CV)中一个有趣的任务,发展至今已有大量优秀的解决方案产生,较为经典的2D人体姿态估计解决方案有:
- 《DeepPose: Human Pose Estimation via Deep Neural Networks》
- 《Stacked Hourglass Networks for Human Pose Estimation》
- 《Chained Predictions Using Convolutional Neural Networks》
- 《Multi-Context Attention for Human Pose Estimation》
- 《Learning Feature Pyramids for Human Pose Estimation》
Github开源项目Pytorch-Human-Pose-Estimation提供了上述解决方案在MPII和COCO数据集上的统一训练框架。
值得注意的是,在使用该框架的过程中,由于其nms计算部分的代码修改自py-faster-rcnn项目,其Cython源代码编译生成的是.pyx文件,该文件在Linux系统上可直接运行,在Windows系统上不会被加载使用1(.pyx等python文件类型的介绍参照文章《详解Python文件: .py、.ipynb、.pyi、.pyc、.pyd !》2)。
同时,训练上述解决方案需要大量的计算资源,并且在应用各解决方案时,可视化速度较慢,难以应对实时视频中人体关键点的姿态估计。在不考虑对解决方案进行算法创新时,MediaPipe提供的人体关键点姿态估计模型能力非常具有吸引力。
项目难点
对于MediaPipe与其模型能力不再赘述,感兴趣的可浏览其官方主页以及各解决方案的详细介绍,本项目侧重于应用其提供的模型能力进行多种人体关键点姿态估计可视化。
MediaPipe在进行姿态估计时,其内置的人体关键点如下图所示,共包含33个人体关键点。
MediaPipe定义了其关键点的数据类型landmark,而非简单的列表或字典数据类型,并且MediaPipe封装了可视化方法draw_landmarks。因此本项目的主要难点在于分析其数据类型以及可视化方法,利用其数据类型以及可视化方法完成多种人体关键点的姿态估计可视化。
本项目以COCO数据集的人体关键点为例,介绍如何利用MediaPipe进行COCO数据集的人体关键点姿态估计可视化。
环境配置
本项目在Python环境下进行,使用的Python环境为mediapipe=0.10.11、opencv-python & opencv-contrib-python=4.10.0.84
。
其中opencv-contrib-python
应当是mediapipe
的依赖库之一,其为mediapipe
安装时自带安装的,opencv-python
则是为了与opencv-contrib-python
保持一致,实际上非必要安装。
Step1:建立两组人体关键点映射
COCO数据集的人体关键点如下图所示,共包含17个人体关键点。
将其与MediaPipe内置的人体关键点分别进行对应,可得到相同关键点处的索引的映射,代码实现如下:
# MediaPipe关键点对应的索引
mediapipe_keypoints_mapping = {
"nose": 0, "left_eye_inner": 1, "left_eye": 2, "left_eye_outer": 3, "right_eye_inner": 4, "right_eye": 5,
"right_eye_outer": 6, "left_ear": 7, "right_ear": 8, "mouth_left": 9, "mouth_right": 10, "left_shoulder": 11,
"right_shoulder": 12, "left_elbow": 13, "right_elbow": 14, "left_wrist": 15, "right_wrist": 16,
"left_pinky": 17, "right_pinky": 18, "left_index": 19, "right_index": 20, "left_thumb": 21, "right_thumb": 22,
"left_hip": 23, "right_hip": 24, "left_knee": 25, "right_knee": 26, "left_ankle": 27, "right_ankle": 28,
"left_heel": 29, "right_heel": 30, "left_foot_index": 31, "right_foot_index": 32
}
# COCO关键点对应的索引
coco_keypoints_mapping = {
0: "nose", 1: "left_eye", 2: "right_eye", 3: "left_ear", 4: "right_ear", 5: "left_shoulder",
6: "right_shoulder", 7: "left_elbow", 8: "right_elbow", 9: "left_wrist", 10: "right_wrist",
11: "left_hip", 12: "right_hip", 13: "left_knee", 14: "right_knee", 15: "left_ankle", 16: "right_ankle"
}
# 根据COCO关键点对应的索引位置构建MediaPipe关键点映射字典
coco_to_mediapipe_mapping