姿态匹配:抖抖手动动脚勤做深呼吸👯♀️
姿态匹配:抖抖手动动脚勤做深呼吸👯♀️
在之前发布的ModelBox推理真的高效吗一文中,我们使用双阶段单人人体关键点检测作为案例对比测试了ModelBox的性能。作为一个性能测试案例我们只是简单的将检测到的关键点画在原图上,并未进行进一步的应用开发。昨晚做梦,梦到关键点检测案例哭诉大材小用为何对它弃之不理明明广阔天地大有可为,愧疚之下连夜写了这篇动手动脚的案例🥺,最终效果如下:
画面左上角随机绘制一个标准姿势,同时检测用户的姿态与标准姿势进行相似性比对,得分绘制在画面中央。如果得分超过阈值,则视为姿态一致,将更新下一个标准姿势。
本案例使用Windows版本的ModelBox SDK进行二次开发。如果对此还不熟悉,请先阅读ModelBox端云协同AI开发套件(Windows)开发环境篇,如果对ModelBox AI应用开发感兴趣,欢迎参加我们的ModelBox实战营。
工程目录
这个应用对应的ModelBox
版本已经做成模板放在华为云OBS中,可以用sdk中的solution.bat
工具下载,接下来我们给出该应用在ModelBox
中的完整开发过程:
1)下载模板
执行.\solution.bat -l
可看到当前公开的技能模板:
PS ███> .\solution.bat -l
...
Solutions name:
mask_det_yolo3
...
single_human_pose_match_yolov7_tinypose
结果中的single_human_pose_match_yolov7_tinypose即为姿态匹配应用模板,可使用如下命令下载模板:
PS ███> .\solution.bat -s single_human_pose_match_yolov7_tinypose
...
solution.bat
工具的参数中,-l
代表list
,即列出当前已有的模板名称;-s
代表solution-name
,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox
核心库的solution
目录下。
2)创建工程
在ModelBox sdk
目录下使用create.bat
创建single_human_pose_match
工程:
PS ███> .\create.bat -t server -n single_human_pose_match -s single_human_pose_match_yolov7_tinypose
sdk version is modelbox-xxx
success: create single_human_pose_match in ███\modelbox\workspace
create.bat
工具的参数中,-t
表示创建事务的类别,包括工程(server)、Python功能单元(Python)、推理功能单元(infer)等;-n
代表name
,即创建事务的名称;-s
代表solution-name
,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。
workspace
目录下将创建出single_human_pose_match
工程,工程目录与原始版本基本一致,下面列出其中不一样的地方:
single_human_pose_match
├─data
│ └─norm_kpts.npy // 标准姿态关键点
├─etc
│ └─flowunit // 功能单元目录
│ ├─draw_pose // 关键点绘制功能单元
│ ├─draw_pose.py // 关键点绘制功能单元入口文件
│ ├─draw_pose.toml // 关键点绘制功能单元配置文件
│ ├─draw_utils.py // 关键点匹配算法
│ └─smooth.py // 平滑算法,使关键点更稳定
│ ├─... // 其他功能单元
├─graph
│ └─single_human_pose_match.toml // 默认技能流程图,使用摄像头运行
├─...
└─build_project.sh
主要的不同点有两处:
-
我们希望姿态与标准姿态匹配得分超过阈值后持续展示几帧匹配结果,使结果更可感,这就需要
draw_pose
单元是有序的,所以我们在关键点绘制功能单元配置文件draw_pose.toml
中将单元类型改为流单元:# Flowunit Type stream = true # Whether the flowunit is a stream flowunit
同时要在
draw_pose.py
中补充流单元需实现的接口data_pre、data_post:def data_pre(self, data_context): # Before streaming data starts return modelbox.Status() def data_post(self, data_context): # After streaming data ends return modelbox.Status()
-
draw_utils.py
中新增关键点匹配算法,主要思路是将检测到的关键点对检测框进行归一化处理后与标准关键点计算oks:def compute_kpts_oks(self, dt_kpts, area=1): g = np.array(self.target_kpt) xg = g[:, 0] yg = g[:, 1] d = np.array(dt_kpts) xd = d[:, 0] yd = d[:, 1] vd = d[:, 2] dx = xd - xg dy = yd - yg e = (dx ** 2 + dy ** 2) / self.variances / (area + np.spacing(1)) / 2 e = e[vd > self.kpts_thre] return np.sum(np.exp(-e)) / e.shape[0] if e.shape[0] else 0.0
为防止某些低置信度关键点漂移影响相似性计算,我们只取置信度大于
kpts_thre
的关键点计算得分。
此外,一时手痒替换了人形检测模型,检测的前后处理以及技能流程图稍有改变;如果使用原本的检测模型只修改上述部分也可以正常运行。由于本项目随机选择标准姿势,所以只提供了使用摄像头运行的技能流程图。
运行项目
打开工程目录下bin/mock_task.toml文件,设置其中的任务输入和任务输出配置为如下内容:
[input]
type = "url"
url = "0"
# 任务输出,目前仅支持"webhook", 和本地输出"local"(输出到屏幕,url="0", 输出到rtsp,填写rtsp地址)
# (local 还可以输出到本地文件,这个时候注意,文件可以是相对路径,是相对这个mock_task.toml文件本身)
[output]
type = "local"
url = "0:Pose"
即使用编号为0的摄像头(默认为PC自带的摄像头),输出画面显示到名为Pose的本地屏幕窗口中。
执行bin/main.bat 运行应用,就可以开始伸展胳膊腿儿了:
另外,巨佬飞戈在single_human_pose
应用基础上开发了体感小游戏,有兴趣的朋友可以玩一下。
可以看到,在基础案例上进行简单的二次开发即可得到一个可玩应用😜,期待大家脑洞大开让基础案例们都可以一展抱负🤸♂️。
- 点赞
- 收藏
- 关注作者
评论(0)