基于 BlazePose 算法的机器人人体姿势识别与模仿研究与实现
包含五部分:
-
01.BlazePose_train_test
这是BlazePose的复现工作,具体操作可以查看[(01.BlazePose_train_test/train.md)。
-
02.BlazePose_pc
本[文件夹]主要是 BlazePose PC端的姿态识别代码,具体操作可以查看(02.BlazePose_pc/pc.md)。
-
03.BlazePose_app
该部分主要是 BlazePose 移动端的[姿态识别]代码,具体信息查看[(03.BlazePose_app/app.md)
-
04.BlazePose_unity
本文件夹主要是 BlazePose 虚拟机器人的姿态模仿代码,具体操作可以查看(04.BlazePose_unity/[unity].md)。
-
05.BlazePose_robot
该部分主要是 BlazePose 真实机器人的姿态模仿代码,具体操作可以查看(05.BlazePose_robot/robot.md)。
Requirements
tensorflow
pathlib
scipy
cv2
mediapipe
numpy
matplotlib
open3d
time
tqdm
socket
serial
math
环境
Linux (Ubuntu 18.04 LTS)
RTX 3090ti
windows10
python3.9
IntelliJ IDEA 2021.3 (Ultimate Edition)
Android Studio Bumblebee | 2021.1.1 Patch 2
Unity 2022.1.0f1c1
arduino 1.8.19
训练部分:
BlazePose复现代码
BlazePose paper is “BlazePose: On-device Real-time Body Pose tracking” by Valentin Bazarevsky, Ivan Grishchenko, Karthik Raveendran, Tyler Zhu, Fan Zhang, and Matthias Grundmann. Available on [arXiv].
Requirements
tensorflow
cv2
numpy
pathlib
scipy
环境
Linux (Ubuntu 18.04 LTS)
python3.9
RTX 3090ti
数据集
使用的是lsp数据集
关键点的顺序如下:
右脚踝
右膝
右臀部
左髋
左膝
左脚踝
右手腕
右肘
右肩
左肩
左肘
左手腕
脖子
头
训练
训练热图分支
将config.py
中的train_mode
设置为train_mode = 0
,然后运行python train.py
。
微调联合回归分支
将config.py
中的train_mode
设置为train_mode = 1
,并且设置一个合适的best_pre_train
值,best_pre_train
是训练损失下降但测试准确的最佳时期数。然后运行python train.py
。
测试
将config.py
中的epoch_to_test
设置为想要测试的epoch
,然后运行python test.py
。
性能比较
Quality
Model
LSP Dataset
PCK@0.2
官方模型(Heavy)
97.5
官方模型(Full)
95.7
官方模型(Lite)
93.5
AlphaPose ResNet50
96.0
Apple Vision
88.6
Ours
82.5
FPS
Model
FPS
AMD Ryzen 7 5800H with
Radeon Graphics 3.20 GHz
官方模型(Heavy)
38
官方模型(Full)
32
官方模型(Lite)
25
OpenPose
6
Ours
29
BlazePose 手机端的姿态识别代码
使用Android Studio
部署,将./BlazePose_app/examples/android
作为项目打开。
环境
windows10
Android Studio Bumblebee | 2021.1.1 Patch 2
对于移动端的部署,本项目采用腾讯的 轻量化框架,其提供了各种框架模型 (如 TensorFlow、PyTorch、Caffe等) 转化为TNN模型文件的脚本,还有丰富的 demo 可供学习。
目前TNN具有的以下特性获得了广泛的好评。
-
计算优化
- 针对不同架构在硬件指令发射、吞吐、延迟、缓存带宽、缓存延迟、寄存器数量等特点,深度优化底层算子,极致利用硬件算力。
- 主流硬件平台 (CPU: ARMv7,ARMv8,X86 GPU: Mali,Adreno,Apple,NV GPU) 深度调优。
- CNN 核心卷积运算通过 Winograd,Tile-GEMM,Direct Conv 等多种算法实现,保证不同参数、计算尺度下高效计算。
- Op 融合:离线分析网络计算图,多个小 Op(计算量小、功能较简单)融合运算,减少反复内存读取、kernel 启动等开销。
-
低精度优化
- 支持 INT8,FP16 低精度计算,减少模型大小、内存消耗,同时利用硬件低精度计算指令加速计算。
- 支持 INT8 Winograd 算法,(输入 6bit),在精度满足要求的情况下,进一步降低模型计算复杂度。
- 支持单模型多种精度混合计算,加速计算同时保证模型精度。
-
内存优化
- 高效“内存池”实现:通过 DAG 网络计算图分析,实现无计算依赖的节点间复用内存,降低 90% 内存资源消耗。
- 跨模型内存复用:支持外部实时指定用于网络内存,实现“多个模型,单份内存”。
-
通过 ONNX 支持 TensorFlow,PyTorch,MXNet,Caffe 等多种训练框架,充分利用和融入不断完善的 ONNX 开源生态。当前支持 ONNX 算子 100+,覆盖主流 CNN, NLP 网络。
-
支持主流安卓、iOS、Embedded Linux 操作系统, Windows, Linux,支持 ARM CPU, x86, Mali GPU, Adreno GPU, NV GPU, 达芬奇 NPU,RK NPU。
-
模块化设计,将模型解析、计算图构建、优化、底层硬件适配、高性能 kernel 实现各部分抽象隔离,通过 Factory Mode 注册、构建设备,方便接入更多的底层硬件、加速方案。
-
移动端动态库尺寸仅约 400KB,并提供基础图像变换操作,调用简单便捷。跨平台模型统一、调用接口统一,通过单个配置参数快速切换。
在移动端的部署需要先用 TNN 的官方脚本将本项目训练得出的 h5(*.h5) 模型文件转换成 TNN 模型文件 (tnnmodel)
然后使用 TNN 的 demo 项目将其构建到手机端。
BlazePose 虚拟机器人的姿态模仿代码
首先值得注意的是,本项目的代码大量使用了mediapipe库,但是将官方模型替换成了我们训练好的模型。
因此需要将训练的.h5
模型用tf
工具转换成.tflite
模型,并重命名为pose_landmark_full.tflite
,将其复制替换到Python39/Lib/site-packages/mediapipe/modules/pose_landmark
下。
该部分有2部分代码,包括./MotionCapture.py
、./PoseModule.py
、./unity.rar
。
Requirements
cv2
mediapipe
numpy
matplotlib
open3d
time
tqdm
socket
serial
math
环境
windows10
python3.9
IntelliJ IDEA 2021.3 (Ultimate Edition)
Unity 2022.1.0f1c1
本部分使用unity创建了一个拥有33个关键点的虚拟机器人。
由python程序获得每个点的相对位置/角度,从而使得机器人能够姿态跟踪。
MotionCapture.py
代码使用的是UDP,创建了在本机"127.0.0.1"上的5052端口,此端口用于将数据传到虚拟机器人端(unity)。
unity.rar
将本压缩包解压得到./unity
,再将./unity
导入到Unity 2022.1.0f1c1
即可得到拥有33个关键点的机器人。
项目目录结构: