写点什么

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

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:2312404

评论

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

JVM系列之:详解java object对象在heap中的结构

程序那些事

Java JVM GC JOL

架构师第七周总结

傻傻的帅

架构师

架构师都该懂的 CAP 定理

闻人

架构 分布式 架构师

凡架构必拆分,分则有度

菜根老谭

微服务 康威定律 架构思维 分治思维

有趣的“第二个系统”

架构精进之路

提升认知 研发体系

tomcat 使用apr

zack

tomcat

计算机网络基础(七)---网络层-ICMP协议

书旅

计算机网络 网络协议 网络层

金融科技的碎片化思考(上)

曲水流觞TechRill

金融科技 FinTech

「架构师训练营」第 7周作业 - 性能测试

森林

k8s极简史:K8s多集群技术发展的历史、现状与未来

华为云开发者社区

Kubernetes 容器 云原生 容器技术 华为云

Oracle JDK7 bug 发现、分析与解决实战

vivo互联网技术

实操案例:字符串哈希表操作

华为云开发者社区

程序员 编程语言 C语言 哈希表 字符串

盘点技术史:流量运营(PC时代)

DeeperMan

大数据 流量

计算机专业基础课教材推荐(无责任书评)

星际行者

数据库 操作系统 计算机体系结构 编译器

波士顿动力狗 SPOT 权威购买指北

早睡蟒

Python 人工智能 学习 波士顿动力 机械狗

来自前端童鞋对后端的吐槽@#$%^

Java小咖秀

程序员 程序员人生 程序人生 前端

像写Flutter一样开发Android原生应用

萧文翰

flutter android Compose Android Studio

企业架构框架之DoDAF

Winfield

企业架构

Flask 的 url 处理器

Leetao

Python flask Web框架

「架构师训练营」第 7 周作业 - 总结

森林

Flink 1.11 Unaligned Checkpoint 解析

Apache Flink

flink

itchat替代品,追妹子神器,个人微信给多个好友(群)发消息,定时提醒妹子喝水

HPioneer

技术 后端 itchat 微信消息 定时提醒

ARTS打卡 第8周

引花眠

ARTS 打卡计划

什么?不写代码也能做功能开发!- RUOYI教程

HPioneer

Java 技术 后端 开发 框架

数据库周刊33丨5大国产数据库中标中国移动;Oracle7月CPU安全预警;腾讯Tbase新版本发布;“2020数据技术嘉年华”有奖话题遴选;阿里云技术面试题;APEX 实现数据库自动巡检;MYSQL OCP题库……

墨天轮

MySQL 数据库 oracle 阿里云 面试题

Java 面向对象知识整理

多选参数

Java 编程

Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车

newbe36524

容器 微服务架构 Reactive .net core ASP.NET Core

MySQL库表设计小技巧

Simon

MySQL 数据库设计

压测脚本

LEAF

OFD 版式技术解析系列(三):仿射变换在OFD中的应用

华宇法律科技

版式文档 OFD 仿射变换

最新:英特尔断供浪潮系内部供应链调整,现已恢复供货

Geek_116789

快手实时处理中存储痛点及解决方案

快手实时处理中存储痛点及解决方案

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