项目介绍
基于之前本人的项目如果感到快乐你就跳跳舞 进行升级迭代开发。项目通过比较在音乐鼓点时姿态的相似度进行计分统计,有较强的互动娱乐性,特别是对于作者这种老肥宅的程序员有很不错的减脂效果。欢迎大家尝试体验!
本次项目主要升级点:
- 采用了最新的更轻量级的PP-TinyPose升级版, 姿态点相对以前稳定性提升不少
- 使用了更轻量级的Picodet行人检测模型,推理性能超实时
- 在Intel Nuc硬件上基于OpenVino加速推理框架,性能非常惊艳
- 移植了sort跟踪算法,在这种简单场景下已足够支持几个人的跟踪
- 每次游戏结束还会通过PPLCNet提取行人特征,可简单大致查找选手之前的分数,要做到更精确识别需要进行人脸识别
- 选手在镜头前举手动作持续5秒可自动开始或结束当前游戏
- 同时为了提升体验,增加了音效和背景
todo 视频
注意: 所有素材均来自互联网,若有侵权,请联系删除
界面设计
界面布局主要分成3部分,上方中间显示姿态匹配正确的次数:
- 左侧上方是鼓点时刻参考舞蹈的姿态
- 左侧下方是参考舞蹈视频源
- 右侧上方是鼓点时实时视频的姿态
- 右侧下方是摄像头实时视频源头

菜单管理
这次升级中暂无明显改动,在参考舞蹈视频源区域右键单击显示菜单, 主要包括
- 摄像头设置
- 歌曲管理
- 开始游戏(游戏未开始时)
- 停止游始(游戏运行时)
- 全屏显示
- 退出
点击歌曲管理后可以添加删除舞蹈视频, 也可以在歌曲列表切换当前选中歌曲。
行人检测模型转换
# 下载openvino
!pip install openvino-dev --user
# 下载框架代码
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git
Cloning into 'PaddleDetection'...
remote: Enumerating objects: 254557, done.[K
remote: Counting objects: 100% (235027/235027), done.[K
remote: Compressing objects: 100% (42643/42643), done.[K
remote: Total 254557 (delta 193625), reused 232717 (delta 191595), pack-reused 19530[K
Receiving objects: 100% (254557/254557), 411.82 MiB | 24.67 MiB/s, done.
Resolving deltas: 100% (208174/208174), done.
Checking connectivity... done.
# 导出行人检测静态图模型
%cd /home/aistudio/PaddleDetection
!python tools/export_model.py -c configs/picodet/application/pedestrian_detection/picodet_s_320_lcnet_pedestrian.yml \
-o weights=https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/picodet_s_320_lcnet_pedestrian.pdparams \
export.benchmark=False export.nms=False \
--output_dir=output_pedestrain_onnx
/home/aistudio/PaddleDetection
Warning: import ppdet from source directory without installing, run 'python setup.py install' to install ppdet firstly
[11/22 00:28:41] ppdet.utils.checkpoint INFO: Finish loading model weights: /home/aistudio/.cache/paddle/weights/picodet_s_320_lcnet_pedestrian.pdparams
[11/22 00:28:41] ppdet.data.source.category WARNING: anno_file 'dataset/coco/annotations/instances_val2017.json' is None or not set or not exist, please recheck TrainDataset/EvalDataset/TestDataset.anno_path, otherwise the default categories will be used by metric_type.
[11/22 00:28:41] ppdet.data.source.category WARNING: metric_type: COCO, load default categories of COCO.
[11/22 00:28:41] ppdet.engine INFO: Export inference config file to output_pedestrain_onnx/picodet_s_320_lcnet_pedestrian/infer_cfg.yml
[11/22 00:28:46] ppdet.engine INFO: Export model and saved in output_pedestrain_onnx/picodet_s_320_lcnet_pedestrian
# 导出onnx
# !pip install paddle2onnx
%cd /home/aistudio/PaddleDetection
!paddle2onnx --model_dir output_pedestrain_onnx/picodet_s_320_lcnet_pedestrian/ \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 11 \
--input_shape_dict "{'image':[1, 3, 320, 320]}" \
--save_file pedestrain.onnx
/home/aistudio/PaddleDetection
[1;31;40m2022-11-22 00:29:45 [WARNING] [Deprecated] The flag `--input_shape_dict` is deprecated, if you need to modify the input shape of PaddlePaddle model, please refer to this tool https://github.com/jiangjiajun/PaddleUtils/tree/main/paddle [0m
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: output_pedestrain_onnx/picodet_s_320_lcnet_pedestrian/model.pdmodel
[Paddle2ONNX] Paramters file path: output_pedestrain_onnx/picodet_s_320_lcnet_pedestrian/model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 11 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2022-11-22 00:29:46 [INFO] ===============Make PaddlePaddle Better!================
2022-11-22 00:29:46 [INFO] A little survey: https://iwenjuan.baidu.com/?code=r8hu2s
# 安装onnx和onnxsim
!pip install -U onnx onnxsim onnxruntime
# 优化onnx模型
%cd /home/aistudio/PaddleDetection
!onnxsim pedestrain.onnx pedestrain_sim.onnx
/home/aistudio/PaddleDetection
Simplifying[33m...[0m
Finish! Here is the difference:
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃[1m [0m[1m [0m[1m [0m┃[1m [0m[1mOriginal Model[0m[1m [0m┃[1m [0m[1mSimplified Model[0m[1m [0m┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
│ Add │ 81 │ 81 │
│ BatchNormalization │ 82 │ [1;32m0 [0m │
│ Clip │ 78 │ 78 │
│ Concat │ 7 │ 7 │
│ Constant │ 774 │ [1;32m0 [0m │
│ Conv │ 98 │ 98 │
│ Div │ 78 │ 78 │
│ GlobalAveragePool │ 6 │ 6 │
│ HardSigmoid │ 2 │ 2 │
│ MatMul │ 4 │ 4 │
│ Mul │ 90 │ 90 │
│ Relu │ 2 │ 2 │
│ Reshape │ 12 │ 12 │
│ Resize │ 2 │ 2 │
│ Sigmoid │ 12 │ 12 │
│ Softmax │ 4 │ 4 │
│ Split │ 1 │ 1 │
│ Sqrt │ 4 │ 4 │
│ Transpose │ 4 │ 4 │
│ Model Size │ 4.6MiB │ [1;32m4.5MiB [0m │
└────────────────────┴────────────────┴──────────────────┘
姿态模型转换
# 导出姿态模型静态图
%cd /home/aistudio/PaddleDetection
!python tools/export_model.py -c configs/keypoint/tiny_pose/tinypose_256x192.yml \
-o weights=https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/tinypose_256x192.pdparams \
--output_dir=output_pose
/home/aistudio/PaddleDetection
Warning: import ppdet from source directory without installing, run 'python setup.py install' to install ppdet firstly
[11/21 23:24:52] ppdet.utils.download INFO: Downloading tinypose_256x192.pdparams from https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/tinypose_256x192.pdparams
100%|█████████████████████████████████████| 5439/5439 [00:01<00:00, 3179.96KB/s]
[11/21 23:24:55] ppdet.utils.checkpoint INFO: Finish loading model weights: /home/aistudio/.cache/paddle/weights/tinypose_256x192.pdparams
[11/21 23:24:55] ppdet.engine INFO: Export inference config file to output_pose/tinypose_256x192/infer_cfg.yml
[11/21 23:25:10] ppdet.engine INFO: Export model and saved in output_pose/tinypose_256x192
# 导出onnx模型
%cd /home/aistudio/PaddleDetection
!paddle2onnx --model_dir output_pose/tinypose_256x192/ \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 11 \
--save_file tinypose.onnx
/home/aistudio/PaddleDetection
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: output_pose/tinypose_256x192/model.pdmodel
[Paddle2ONNX] Paramters file path: output_pose/tinypose_256x192/model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 11 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2022-11-21 23:25:45 [INFO] ===============Make PaddlePaddle Better!================
2022-11-21 23:25:45 [INFO] A little survey: https://iwenjuan.baidu.com/?code=r8hu2s
# 将模型转为openvino的IR格式
%cd /home/aistudio/PaddleDetection
!mo --framework onnx --input_model tinypose.onnx --output_dir ./ --input_shape [1,3,256,192]
行人检测和姿态识别联合推理
结合使用sort跟踪算法,推理第100帧图片, 目前在aistudio中无法直接运行openvino, 会报错 ModuleNotFoundError: No module named ‘openvino.runtime’
%cd /home/aistudio/track/
!python detector.py
运行推理结果示例如下:

REID模型转换
本项目使用REID模型仅仅用于特征保存,方便快速查找某个舞者的历史分数,若要进一步更准确的查找,也可以用人脸识别模型替换。
参考转换姿态模型的步骤,简单几步即可完成:
CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c configs/mot/deepsort/reid/deepsort_pplcnet.yml -o reid_weights=https://paddledet.bj.bcebos.com/models/mot/deepsort/deepsort_pplcnet.pdparams
paddle2onnx --model_dir output_inference/deepsort_pplcnet \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 11 \
--save_file reid.onnx
mo reid.onnx --output_dir . --input_shape [1,3,64,192]
写在最后
本项目需要本地运行,基本可以运行,程序运行稳定性和匹配效果还需要进一步优化。
后期将做更多的功能升级,例如尝试3D姿态,多人模式,Unity等等。
关于作者
- 成都飞桨领航团团长
- PPDE
- PFCC
- AICA三期学员
我在AI Studio上获得青铜等级,点亮0个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/89442
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
此文章为搬运
原项目链接