如今说到体感游戏,大家一定都不陌生,比如微软的 Kinect、任天堂的 Switch,都曾是游戏业的革命性产品。而另一款网红产品—抖音,也在去年底上线过一个“尬舞机”的音乐体感游戏(现在成了隐藏功能):

游戏开始后,随着音乐会给出不同的动作提示,用户按照提示摆出正确动作即可得分。援引官方说法,“尬舞机”主要应用了今日头条 AI Lab 自主开发的“人体关键点检测技术”,依靠这项技术,抖音能够检测到图像中所包含人体的各个关键点的位置,从而实现从用户姿态到目标姿态的准确匹配。

以上这些体感游戏,都牵涉到计算机视觉中的一个细分领域: 人体姿态估计(pose estimation) ,即识别图像中的人体关键点(人体上有一定自由度的关节,如头、颈、肩、肘、腕、腰、膝、踝等)并正确的联系起来,通过对人体关键点在三维空间相对位置的计算,来估计人体当前的姿态。

人体姿态估计有不少难点,比如:如何从图片中区分出人和背景;如何定位人体的关键点;如何根据二维的关键点坐标计算出三维中的姿态;如何处理四肢交叉或遮挡的情况;如何定位多人;如何提升计算速度等等。而相关技术在游戏、安防、人机交互、行为分析等方面都有应用前景。因此,这是计算机视觉甚至人工智能领域中极具挑战的一个课题。(小声说句,我的硕士毕业论文就是这个方向)

不过,因为前人的贡献,现在你只需通过少量的 Python 代码,也可以实现从照片或视频中进行人体姿态估计。这都要仰赖于 CMU 的开源项目: Openpose

OpenPose 是基于卷积神经网络和监督学习并以 caffe 为框架写成的开源库,可以实现人的面部表情、躯干和四肢甚至手指的跟踪,适用多人且具有较好的鲁棒性。是世界上第一个基于深度学习的实时多人二维姿态估计,为机器理解人类提供了一个高质量的信息维度。
其理论基础来自《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》,是 CVPR 2017 的一篇论文,作者是来自 CMU 感知计算实验室的曹哲、Tomas Simon、Shih-En Wei、Yaser Sheikh。
项目地址: https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
(摘自网络)

论文演示效果:

此方法可以达到对视频流的实时多人检测。要知道,Kinect 可是加了一个额外的红外深度摄像头才做到如此准确地识别(还不能是这么多人)。

详细的原理,我在这里就不冒充大牛强行解释了。但通俗地说几点,为什么 Openpose 有如此突破性地效果:

  1. 以往的识别思路是自上而下:先找人,找到人了再进一步区分身体不同部分。Openpose 则是自下而上: 先找手脚关节等特征部位,再组合人体
  2. Openpose 团队将 人脸识别手部识别 的已有成果整合到了姿态识别中,取得了更好的效果;
  3. 有了 大数据 的支持,这是过去的研究所没有的。看看这个 CMU 为采集人体数据所搭建的设备,你就会有所体会:

之前的文章 Python+OpenCV 十几行代码模仿世界名画 中,我们提到 OpenCV-Python 在 3.3 版本中加入了 深度神经网络(DNN) 的支持。同样在项目 Samples 中,提供 Openpose 的一个 Python 简单实现版本。(只支持图像中有单个人)

官方代码:

https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py

使用方法,命令行进入代码所在目录执行:

python openpose.py --model pose.caffemodel --proto pose.prototxt --dataset MPI

--model 参数和 --proto 参数分别是预先训练好的人体姿态模型和配置文件。因为模型文件很大,并不包括在 OpenCV 代码库中,可以在 Openpose 项目(https://github.com/CMU-Perceptual-Computing-Lab/openpose )找到下载地址。

另外可以通过 --input 参数指定识别的图片或视频地址,默认则使用摄像头实时采集。

执行后效果:

核心代码:

net = cv.dnn.readNetFromCaffe(args.proto, args.model)
inp = cv.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)
net.setInput(inp)
out = net.forward()

和之前 fast-neural-style 的代码类似,大部分的工作都是 Openpose 做好的,OpenCV 这里只是使用训练好的神经网络进行计算。所以核心代码其实没有几行,而且跟上次的例子几乎一致。剩下一半的代码都是在把获取到的关键点坐标绘制成人体的骨架结构。

这里顺带提醒一下,我发现代码中的一个断言 assert(len(BODY_PARTS) == out.shape[1]) 无法满足,会导致程序终止。如果出现这样的问题,就把这句注释掉,并不会对结果有影响。

拿到人体关键点数据后,我们就可以做进一步的判断。比如我们加一个很简单的判断:

neck = points[BODY_PARTS['Neck']]
left_wrist = points[BODY_PARTS['LWrist']]
right_wrist = points[BODY_PARTS['RWrist']]
print(neck, left_wrist, right_wrist)if neck and left_wrist and right_wrist and left_wrist[1] < neck[1] and right_wrist[1] < neck[1]:cv.putText(frame, 'HANDS UP!', (10, 100), cv.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2)

如果左手腕和右手腕的高度都超过脖子的高度,就认为是一个抬手的动作,在屏幕上输出“ HANDS UP! ”。注意在 OpenCV 坐标系里,图像的坐标原点是左上角。

效果:

如此,一个简单的动作识别程序就有了。虽然很粗糙,但已经可以附加在很多应用上,比如:商场、科技馆里的互动游戏、交互式的视觉艺术作品等等。感兴趣的同学不妨亲自试一试,期待看到你们借此做出更有意思的项目。

获取文中相关代码和模型下载地址,请在公众号( Crossin的编程教室 )对话里回复关键字 姿态

════
其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | 如何debug? | Python单词表 | 知乎下载器 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 抓抖音 | requests | AI平台 | AI名画

欢迎微信搜索及关注: Crossin的编程教室

用 Python+openpose 实现抖音尬舞机 1相关推荐

  1. 用 Python+openpose 实现抖音尬舞机

    游戏开始后,随着音乐会给出不同的动作提示,用户按照提示摆出正确动作即可得分.援引官方说法,"尬舞机"主要应用了今日头条 AI Lab 自主开发的"人体关键点检测技术&qu ...

  2. 抖音是用python写的吗_用 Python 实现抖音尬舞机

    原标题:用 Python 实现抖音尬舞机 如今说到体感游戏,大家一定都不陌生,比如微软的 Kinect.任天堂的 Switch,都曾是游戏业的革命性产品.而另一款网红产品-抖音,也在去年底上线过一个& ...

  3. 用 Python 实现抖音尬舞机

    2019独角兽企业重金招聘Python工程师标准>>> 如今说到体感游戏,大家一定都不陌生,比如微软的 Kinect.任天堂的 Switch,都曾是游戏业的革命性产品.而另一款网红产 ...

  4. 用Python爬取抖音短视频实战,如此简单

    前言 抖音,是一款可以拍短视频的音乐创意短视频社交软件,该软件于2016年9月上线,是一个专注年轻人的15秒音乐短视频社区.用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品.此AP ...

  5. Python自动化实现抖音自动刷视频

    本文主要介绍了Python自动化实现抖音自动刷视频,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 环境准备 实现 环境准备 Py ...

  6. python爬取抖音用户数据_使用python爬取抖音视频列表信息

    如果看到特别感兴趣的抖音vlogger的视频,想全部dump下来,如何操作呢?下面介绍介绍如何使用python导出特定用户所有视频信息 抓包分析 Chrome Deveploer Tools Chro ...

  7. 使用python编写从抖音下载视频的代码

    使用 Python 编写从抖音下载视频的代码,可以使用第三方库来帮助你完成这个任务. 其中一种方法是使用 PyDouyin 库,这是一个 Python 库,可以帮助你从抖音下载视频. 要使用 PyDo ...

  8. 用python写一个抖音登录代码

    好的,以下是一个用Python写的抖音登录代码示例: import requestsurl ="https://aweme.snssdk.com/passport/user/login/&q ...

  9. python一键去抖音视频水印工具,请勿用于学习以外的用途!

    一.前言 翻了翻爬虫代码存货,决定把抖音APP视频批量下载的代码拿出来做个文章. 二.实战背景 抖音越来越火,越刷越上瘾,总感觉下一个视频一定会更精彩,根本停不下来.想将抖音里喜欢的小哥哥/×××姐的 ...

最新文章

  1. Python3 字符串format使用代码示例
  2. ICCV 2019 COCO Mapillary挑战赛冠军团队技术分享
  3. Spark读取配置源码剖析
  4. dibian+9+oracle+java_debian – 安装了Oracle Java,但在安装软件时,我得到了`你的Java版本不受支持....
  5. groovy怎样从sql语句中截取表名_Mysql和SQL
  6. cobalt strick 4.0系列教程(3)---数据管理
  7. CYQ.Data 轻量数据层之路
  8. python图纸教程_python入门教程 python入门神图一张
  9. 史上最全的php面试题-带有答案,史上最全的PHP面试题-带有答案
  10. var,object和dynamic
  11. PS黑作坊人像磨皮 精修 快速伪商业修图 插件 扩展面板
  12. 《学习日记之Python》——GIF分解成图片
  13. 纯css绘制斜线表头
  14. 如何将Caj转Word,免费CAJ转换的方法
  15. 给一整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3.“a的bit3”
  16. Facebook主页照片和封面照片的尺寸要求
  17. 苹果屏幕录制没有声音_苹果手机屏幕不亮但有声音是怎么回事?不要慌,这样就可以解决...
  18. Beyond Compare 的开源替代工具meld
  19. 基于docker 搭建Prometheus+Grafana监控
  20. Mybatis Plus 自定义SqlInjector sql注入器

热门文章

  1. 明治乳业“解锁乳酸菌之旅”趣味科普展览限时亮相虹桥南丰城;佛罗伦萨小镇开启10周年狂欢购 | 知消...
  2. 原生js实现大屏可视化
  3. 数据库中有哪些索引?
  4. oppo r9 android版本,OPPO R9s有几个版本?OPPO R9s各版本区别对比评测
  5. QT的UDP通信详解
  6. Java编程基础测题(二十道)
  7. 信号处理在matlab常用函数
  8. 微信小程序自定义组件-城市选择
  9. 什么是计算机硬件和用户之间的接口,操作系统类似于计算机硬件和人类用户之间的接口是准确的吗?_常见问题剖析...
  10. linux查找文件中是否含有某个字符串