摘要:本案例使用Windows版本的ModelBox SDK进行二次开发,主要是针对姿态匹配案例开发实践。

本文分享自华为云社区《姿态匹配:抖抖手动动脚勤做深呼吸》,作者:吴小鱼。

在之前发布的AI说ModelBox推理真的高效吗一文中,我们使用双阶段单人人体关键点检测作为案例对比测试了ModelBox的性能。作为一个性能测试案例我们只是简单的将检测到的关键点画在原图上,并未进行进一步的应用开发。昨晚做梦,梦到关键点检测案例哭诉大材小用为何对它弃之不理明明广阔天地大有可为,愧疚之下连夜写了这篇动手动脚的案例 ,最终效果如下:

画面左上角随机绘制一个标准姿势,同时检测用户的姿态与标准姿势进行相似性比对,得分绘制在画面中央。如果得分超过阈值,则视为姿态一致,将更新下一个标准姿势。

本案例使用Windows版本的ModelBox SDK进行二次开发。如果对此还不熟悉,请先阅读ModelBox端云协同AI开发套件(Windows)开发环境篇,如果对ModelBox AI应用开发感兴趣,欢迎参加我们的ModelBox实战营

工程目录

本案例是在single_human_pose应用基础上修改而来,案例所需资源(代码、模型、测试数据等)均可从obs桶下载。工程目录与原始版本基本一致,下面列出其中不一样的地方:

single_human_pose
├─data
│ └─norm_kpts.npy // 标准姿态关键点
├─etc
│ └─flowunit // 功能单元目录
│ ├─draw_pose // 关键点绘制功能单元
│ ├─draw_pose.py // 关键点绘制功能单元入口文件
│ ├─draw_pose.toml // 关键点绘制功能单元配置文件
│ ├─draw_utils.py // 关键点匹配算法
│ └─smooth.py // 平滑算法,使关键点更稳定
│ ├─... // 其他功能单元
├─graph
│ └─single_human_pose.toml // 默认技能流程图,使用摄像头运行
├─...
└─build_project.sh

主要的不同点有两处:

1.我们希望姿态与标准姿态匹配得分超过阈值后持续展示几帧匹配结果,使结果更可感,这就需要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()

2.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应用基础上开发了体感小游戏,有兴趣的朋友可以玩一下。

可以看到,在基础案例上进行简单的二次开发即可得到一个可玩应用,期待大家脑洞大开让基础案例们都可以一展抱负

11月3号晚19点,将进行AI养猪 实时看护猪的健康直播,华为云AI发烧友在线带你学习ModelBox框架,快速AI应用,实现AI监测猪的健康状态。

参与直播互动,有机会赢取华为自拍杆、雷柏机械键盘、ModelArts书籍等多重好礼,还等什么,马上报名吧!

报名链接:http://su.modelarts.club/5a7o

点击关注,第一时间了解华为云新鲜技术~

ModelBox姿态匹配:抖抖手动动脚勤做深呼吸的更多相关文章

  1. Regex of Perl: ?= 指的是如果后面匹配到,则后面的内容不做替换,保留。 ab, s/a?=b/x/,变为xb,即后面匹配到b,b保留不做替换

    Regex of Perl: ?= 指的是如果后面匹配到,则后面的内容不做替换,保留.  ab, s/a?=b/x/,变为xb,即后面匹配到b,b保留不做替换

  2. 自从学会了Python自动化Pytest框架,领导再也不敢在我背后指手划脚了

    前言 大家都知道Python有自带的单元测试框架unittest,那为什么还要学习Pytest呢?先了解下Pytest优点 pytest: pytest是一个非常成熟的全功能的Python测试框架,是 ...

  3. (转)手游应该怎么做 UI 设计?

    之前一直做互动设计,在UI上有一些积累. 转战手游后发现,有着标准.互动方式.用户行为等等与常规大屏UI设计的不同,但是在设计流程,思考方式上是一样的. 以目前项目中一个界面为例(未完成版本)来说一下 ...

  4. poj 1325 Machine Schedule 二分匹配,可以用最大流来做

    题目大意:机器调度问题,同一个任务可以在A,B两台不同的机器上以不同的模式完成.机器的初始模式是mode_0,但从任何模式改变成另一个模式需要重启机器.求完成所有工作所需最少重启次数. ======= ...

  5. 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩

    抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...

  6. JAVA去除抖音视频的水印源码!!!

    @PostMapping("geturl") public DataResponse decodeDouiyin(@RequestBody DouyinRequest req ) ...

  7. JAVA代码实现抖音短视频去水印功能

    今天有人找我帮他抖音视频去水印,发到朋友圈,然后就研究了一下.去水印功能代码如下: public class DouYinQushuiyin { public static void main(Str ...

  8. 烂泥:haproxy学习之手机规则匹配

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 今天我们来介绍下有关haproxy匹配手机的一些规则配置. 一.业务需要 现在根据业务 ...

  9. 手写@koa/router源码

    上一篇文章我们讲了Koa的基本架构,可以看到Koa的基本架构只有中间件内核,并没有其他功能,路由功能也没有.要实现路由功能我们必须引入第三方中间件,本文要讲的路由中间件是@koa/router,这个中 ...

  10. 第二十五节:scrapy爬虫识别验证码(四)手绘验证码识别

    一.介绍 今天主要介绍的是微博客户端在登录时出现的四宫格手绘验证码,不多说直接看看验证码长成什么样.        二.思路 1.由于微博上的手绘验证码只有四个宫格,且每个宫格之间都有有向线段连接,所 ...

随机推荐

  1. Java核心知识体系5:反射机制详解

    Java核心知识体系1:泛型机制详解 Java核心知识体系2:注解机制详解 Java核心知识体系3:异常机制详解 Java核心知识体系4:AOP原理和切面应用 1 介绍 无论是那种语言体系,反射都是必 ...

  2. 18.1 Socket 原生套接字抓包

    原生套接字抓包的实现原理依赖于Windows系统中提供的ioctlsocket函数,该函数可将指定的网卡设置为混杂模式,网卡混杂模式(Promiscuous Mode)是常用于计算机网络抓包的一种模式 ...

  3. html笔记重点

    第五周-周二 一.视频和音频 <video src="路径" controls="controls"></video> 1.加contr ...

  4. Codeforces Round #702 (Div. 3) 题解

    写在前边 链接:Codeforces Round #702 (Div. 3) 比较简单,但是总是感觉脑子有点转不过弯来. A. Dense Array 链接:A题链接 题目大意: 在数组中插入若干个数 ...

  5. go基础-依赖管理

    有些不可思议,简洁.优雅的go语言依赖管理如此混乱,发布多年也没有可靠的依赖管理机制,官方先后推出了多种依赖管理机制gopath.vendor.dep等,没有一个顺手,直到在Go 1.11推出go m ...

  6. UIPath初识和安装

    即使没有人为你鼓掌,也要优雅的谢幕,感谢自己的认真付出. 一. UiPath组成   学习UiPath,我们一定先要了解Studio,Robot和Orchestrator这3个重要组成部分. UiPa ...

  7. 泛微OA与ERP集成的关键要点

    泛微OA办公系统与ERP系统的集成是为了实现企业内部各个系统之间的数据共享和协同工作,提高工作效率和管理水平.下面将详细介绍泛微OA办公系统如何与ERP系统集成以及轻易云数据集成平台在该过程中发挥的重 ...

  8. SQL与NoSQL数据库选型及实际业务场景探讨

    在企业系统架构设计中,选择合适的数据库类型是一项关键决策.本文将对比SQL和NoSQL数据库的特点,分析它们在数据模型.可扩展性.一致性与事务.查询复杂性与频率,以及性能与延迟等方面的优势和劣势.同时 ...

  9. 31. 干货系列从零用Rust编写正反向代理,HTTP限流的实现(limit_req)

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  10. raft算法的自我理解

    1.raft算法是什么? 答:共识算法 2.raft算法有什么用? 答:维持不同机器的强一致性 3.raft算法通过什么方式来维持不同机器的强一致性? 答:传递log日志 ,按照官方的说法日志里面包含 ...