用 Python 实现抖音尬舞机

2020-06-19 00:00:00 代码 识别 关键 人体 姿态

如今说到体感游戏,大家一定都不陌生,比如微软的 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。
项目地址: github.com/ZheC/Realtim
(摘自网络)

论文演示效果:

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

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

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

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

官方代码:

github.com/opencv/openc

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

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

相关文章