2021腾讯数字生态大会直播预约通道开启!技术内容大爆发,开发者必看! 了解详情
写点什么

深度学习人体姿态估计算法综述

2019 年 5 月 19 日

深度学习人体姿态估计算法综述

人体骨架是以图形形式对一个人的方位所进行的描述。本质上,骨架是一组坐标点,可以连接起来以描述该人的位姿。骨架中的每一个坐标点称为一个“部分(part)”(或关节、关键点)。两个部分之间的有效连接称为一个“对(pair)“(或肢体)。注意,不是所有的部分之间的两两连接都能组成有效肢体。下图是一个典型的人体骨架举例。


图:左:COCO关键点格式的人体骨架。右:将骨架映射到人体图片上。(图片来源:https://github.com/CMU-Perceptual-Computing-Lab/openpose)


人体姿态估计有多个应用场景,其中一些应用将在本博客的最后讨论。多年来,人们发展出了多种人体姿态估计算法。最早(也是最慢)的方法通常针对图像中仅有一个人的情景,只估计单个人的姿态。这些方法通常首先识别出各个部分,然后在它们之间形成连接以创建姿态。


自然,这种单人姿态估计不太适用于很多现实生活中的情形,因为在真实情况下往往图像中包含很多个人。


多人姿态估计

多人姿态估计比单人姿态估计要难一些,因为图像中的人数以及每个人的位置是未知的。一般来说,我们可以用以下两种方法之一来解决这些问题:


  • 比较简单的方法是先使用一个人体检测器,然后再估计检测器检出的每个人的关节,进而恢复每个人的姿态。这种方法被称为自顶向下的方法。

  • 另外一种方法是先检测出一幅图像中的所有关节(即每个人的关节),然后将检出的关节连接/分组,从而找出属于各个人的关节。这种方法叫做自底向上方法。


图:上:典型的自顶向下方法。下:典型的自底向上方法。(图片来源:https://unsplash.com/photos/XuN44TajBGo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)


一般情况下,自顶向下的方法比自底向上的方法更容易实现,因为添加检测算法比增加连接/分组算法要简单得多。很难去评判这两种方法哪种的整体性能更好,因为这种性能比较的本质是在比较人体检测器和连接/分组算法哪个更好(实际上是没有可比性的)。


在本文中,我们主要介绍基于深度学习算法的多人人体姿态估计。在下一节中,我们将介绍一些当前比较流行的自顶向下和自底向上方法。


深度学习方法

1. OpenPose

OpenPose(https://arxiv.org/pdf/1812.08008.pdf)是当前最流行的几种多人人体姿态估计算法之一。OpenPose 大获成功的一部分原因是它在 GitHub 上开源了其实现代码(https://github.com/CMU-Perceptual-Computing-Lab/openpose),并配有详细的说明文档。


和很多自底向上的方法一样,OpenPose 首先检测出图像中所有人的关节(关键点),然后将检出的关键点分配给每个对应的人。下图展示了 OpenPose 模型的架构。


图:OpenPose架构流程图。(图片来源:https://arxiv.org/pdf/1611.08050.pdf)


OpenPose 网络首先使用前面的几个网络层(在上面的流程图中使用的是 VGG-19),从图像中提取特征。接下来,这些特征被传给两个平行的卷积层分支。第一个分支用来预测 18 个置信图,每个图代表人体骨架中的一个关节。第二个分支预测一个集合,该集合中包含 38 个关节仿射场(Part Affinity Fields,PAFs),描述各关节之间的连接程度。


图:OpenPose人体姿态估计步骤。(图片来源:https://arxiv.org/pdf/1812.08008.pdf)


接着,OpenPose 用一连串的步骤来优化每个分支的预测值。使用关节置信图,可以在每个关节对之间形成二分图(如上图所示)。使用 PAF 值,二分图里较弱的连接被删除。通过上述步骤,可以检出图中所有人的人体姿态骨架,并将其分配给正确的人。针对该算法更详细的解释,请参考其论文:


https://arxiv.org/pdf/1812.08008.pdf


和这篇博客:


https://arvrjourney.com/human-pose-estimation-using-openpose-with-tensorflow-part-2-e78ab9104fc8。


2. DeepCut

DeepCut(https://arxiv.org/abs/1511.06645)是一个自底向上的多人人体姿态估计方法。针对人体姿态估计任务,作者定义了以下问题:


  1. 生成一个由 D 个关节候选项组成的候选集合。该集合代表了图像中所有人的所有关节的可能位置。在上述关节候选集中选取一个子集。

  2. 为每个被选取的人体关节添加一个标签。标签是 C 个关节类中的一个。每个关节类代表一种关节,如“胳膊”“腿”“躯干”等。

  3. 将被标记的关节划分给每个对应的人。


图:DeepCut示意图。(图片来源:https://arxiv.org/pdf/1511.06645.pdf)


上述几个问题可以被建模为整数线性规划问题(ILP,链接:https://en.wikipedia.org/wiki/Integer_programming),从而被一起解决。考虑二值随机变量的三元组(x,y,z),其中的二值变量的域如下图所示:


图:二值随机变量的域。(图片来源:https://arxiv.org/pdf/1511.06645.pdf)


考虑候选集 D 中的两个候选关节 d 和 d’,以及类别集 C 中的两个类 c 和 c’。关节候选项是通过 Faster RCNN(https://arxiv.org/abs/1506.01497)或稠密 CNN 获得的。现在,我们有下述声明:


  • 如果 x(d,c) = 1,代表候选关节 d 属于类别 c。

  • 同样,x(d,d’) = 1 代表候选关节 d 和 d’属于同一人。

  • 作者还定义了 z(d,d’,c,c’) = x(d,c) * y(d,d’)。如果上式值为 1,则代表候选关节 d 属于类别 c,候选关节 d’属于类别 c’,且候选关节 d 和 d’属于同一人。


最后一个声明可以用于划分不同人的姿态。显然,上述声明可以表示成关于(x,y,z)的线性方程组。这样一来,整数线性规划(ILP)的模型就建立好了,多人姿态估计就可以化为解这组线性方程的问题。想要了解线性方程组的具体形式和更详细的分析,请参见原论文(链接:https://arxiv.org/pdf/1511.06645.pdf)。


3. RMPE(AlphaPose)

RMPE(https://arxiv.org/abs/1612.00137)是一个流行的自顶向下姿态估计算法。该论文的作者认为,自顶向下方法的性能通常依赖于人体检测器的精度,毕竟人体姿态估计是在检测器检出的框的区域内进行的。因此,错误的定位和重复的候选框会使姿态检测算法的性能降低。


图:重复候选框(左)和低置信度候选框(右)的影响。(图片来源:https://arxiv.org/pdf/1612.00137.pdf)


为解决这一问题,作者提出了使用对称空间变换网络(Symmetric Spatial Transformer Network,SSTN)来从不准确的候选框中抽取高质量的单人区域。然后,作者使用了一个单人的姿态估计器(Single Person Pose Estimator,SPPE)来从抽取到的区域中估计此人的姿态骨架。接着,作者用一个空间逆变换网络(Spatial De-Transformer Network,SDTN),将估计出的姿态重新映射到图像坐标系下。最后,用一个参数化的姿态非极大抑制(Non-Maximum Suppression,NMS)方法来处理重复预测的问题。


另外,作者还引入了一种姿态候选生成器(Pose Guided Proposals Generator),来增广训练样本,以便更好地训练 SPPE 和 SSTN 网络。RMPE 的显著特征是,该方法可以推广到任意的人体检测算法和 SSPE 的组合。


4. Mask RCNN

Mask RCNN(https://arxiv.org/abs/1703.06870)是一个非常流行的语义和实例分割架构。该模型可以同时预测图像中多个物体的候选框位置及分割其语义信息的 mask。该模型的基础架构很容易被扩展到人体姿态估计上来。


图:Mask RCNN架构流程图。(图片来源:https://medium.com/@jonathan_hui/image-segmentation-with-mask-r-cnn-ebe6d793272)


其基本架构首先使用 CNN 从图像中提取特征图。这些特征接着被用于一个区域候选网络(Regin Proposal Network, RPN)来为各个对象生成候选框。候选框会从 CNN 提取出的特征图中选取一个区域。由于候选框可能会有多种尺寸,网络接下来会采用一个层,称为 RoIAlign,用来减小特征图的尺寸,使它们具有相同的尺寸。现在,抽取出的特征被传给平行的 CNN 分支,用来输出候选框和分割 mask 的最终预测。


我们现在主要关注一下分割的分支。假设我们图像中的对象可以属于 K 个类别中的一个。分割分支输出 K 个尺寸为 m*m 的二值 mask,每个二值 mask 代表只属于该类别的所有对象。我们可以将每种特征点建模为一个类别,然后将姿态估计任务看作一个分割任务,从而提取图像中每个人的特征点。


与此同时,可以训练一个对象检测算法来确定每个人的位置。通过组合每个人的位置信息和他们的特征点集合,我们可以得到图像中每个人的人体骨架。


该方法和自顶向下方法比较类似,但不同的是,其人体检测步骤和关键点检测步骤是同时进行的。换句话说,人体检测步骤和关键点检测步骤是相互独立的。


5. 其他方法

多人人体姿态估计是一个很大的问题,有许多其他方法。限于篇幅,我们只选择了其中的几种方法在本文中加以介绍。如需要获取更详尽的方法列表,请参见以下链接:



应用

姿态估计可以应用在很多领域。接下来就列举其中的一些。


1. 动作识别

追踪一段时间内一个人姿态的变化也可以应用在动作、手势和步态识别上。在这方面有好几个应用场景,包括:


  • 用于检测一个人是否摔倒或疾病

  • 用于健身、体育和舞蹈等的自动教学

  • 用于理解全身的肢体语言(如机场跑道信号、交警信号等)

  • 用于增强安保和监控


图:追踪人的步态可以用于安保和监控。(图片来源:http://www.ee.oulu.fi/~gyzhao/research/gait_recognition.htm)


2. 运动捕捉和增强现实

人体姿态估计的一个有趣应用是 CGI(computer graphic image,一种电影制造技术)应用。如果可以检测出人体姿态,那么图形、风格、特效增强、设备和艺术造型等就可以被加载在人体上。通过追踪人体姿态的变化,渲染的图形可以在人动的时候“自然”地与人“融合”。


图:CGI渲染举例。(图片来源:https://i.kym-cdn.com/photos/images/facebook/001/012/571/0a4.jpg)


姿态估计的一个很好的可视化例子是 Animoji(https://www.wired.com/story/all-the-face-tracking-tech-behind-apples-animoji/)。虽然在 Animoji 中只是跟踪了人脸的结构,但这个技术可以被扩展到人体关键点上。同样的概念可以被用于渲染增强现实(AR)元素,使其能够模仿人的运动。


3. 训练机器人

除了手动为机器人编程、让它们跟随特定的路径,我们也可以让机器人跟随一个做特定动作的人体骨架。人类教练可以仅通过演示特定的动作,来教机器人学习这一动作。接着,机器人就可以计算如何移动自己的活动关节,来进行相同的动作。


4. 控制台中的运动追踪

姿态估计的一个有趣应用是在交互游戏中追踪人体对象的运动。比较流行的 Kinect 使用 3D 姿态估计(采用 IR 传感器数据)来追踪人类玩家的运动,从而利用它来渲染虚拟人物的动作。


图:Kinect传感器的工作过程。(图片来源:https://appleinsider.com/articles/14/07/11/apples-secret-plans-for-primesense-3d-tech-hinted-at-by-new-itseez3d-ipad-app)


结论

人体姿态估计领域发展迅速,因此可以应用在越来越多的任务上。另外,相关领域的研究,例如姿态追踪,可以大大增强姿态估计的应用范围。本文列举的概念并不全面,但介绍的几个算法和应用较为典型,适合入门者阅读。


本文首发于 medium 平台,英文原文链接:https://medium.com/beyondminds/an-overview-of-human-pose-estimation-with-deep-learning-d49eb656739b



2019 年 5 月 19 日 14:2314234

评论

发布
暂无评论
发现更多内容

【Flutter 专题】59 图解 Android Native 获取 Flutter 资源文件

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

Java中的注解到底是怎么一回事?,jvm原理面试题

Java 程序员 后端

Java中高级核心知识全面解析,Java工程师需要掌握的技能

Java 程序员 后端

【LeetCode】所有奇数长度子数组的和Java题解

HQ数字卡

算法 LeetCode 9月日更

Linux之lastb命令

入门小站

Linux

LeetCode题解:143. 重排链表,数组,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

JavaScript数组常用的方法总结

孙叫兽

JavaScript 前端 数组 引航计划

LeetCode刷题13-简单-罗马数字转整数

ベ布小禅

9月日更

找啊找啊找工长,找到一个好工长

escray

生活记录 9月日更

Go 专栏|开发环境搭建以及开发工具 VS Code 配置

AlwaysBeta

Go

IntelliJ IDEA 如何快速查看提交代码的对比

HoneyMoose

C语言:十进制、BCD码互换

不脱发的程序猿

C语言 十进制、BCD码互换

linux网络包收发讲解

赖猫

Linux

架构实战训练营|作业|模块2

Frode

#架构实战营

架构实战营模块七作业

老猎人

架构实战营

前端开发css这些样式你还熟悉吗,Chrome是必备技能

前端史塔克

CSS html css3 前端

Java中高级核心知识全面解析,Java大厂高级面试题灵魂100问

Java 程序员 后端

Java全面学习视频书籍,阿里架构师看到都觉得好,Java自学教程

Java 程序员 后端

C语言:十进制、十六进制数据互换

不脱发的程序猿

C'语言 进制转换

08. 语音识别与第二次AI热潮

数据与智能

人工智能

java web 部分(1),Java技术总监面试常见问题及答案

Java 程序员 后端

粗放生长时代结束,高精地图收紧灰色地带

脑极体

HTTP系列之:HTTP缓存

程序那些事

缓存 Netty HTTP 程序那些事

在线JSON转Mongoose工具

入门小站

工具

JDK 8 及其后续 JDK 中 Period 和 Duration

HoneyMoose

网络攻防学习笔记 Day123

穿过生命散发芬芳

9月日更 互联网安全 流量采集

Excelize 开源五周年 🎉

xuri

Go Excel Excel数据分析 Excelize

java web 部分,Java教学视频百度云盘

Java 程序员 后端

Java-进阶:多线程1,Java程序员必须掌握的技术

Java 程序员 后端

我们为什么要学习TypeScript ?

法医

typescript 前端 9月日更

epoll底层实现源码及epoll反应堆模型

hanaper

英特尔On技术创新峰会

英特尔On技术创新峰会

深度学习人体姿态估计算法综述-InfoQ