前言

前段时间很火的感人动画短片《Changing Batteries》讲了这样一个故事:独居的老奶奶收到儿子寄来的一个机器人,虽然鲜有语言的沟通,但是小机器人善于察言观色,不仅能在老奶奶口渴时为她端水、在老奶奶扫地时接过老奶奶的扫把,做力所能及的家务活,如果老奶奶在椅子上看电视睡着了,机器人还为她轻轻盖上毯子。有了它,老奶奶又重新感受到久违的快乐,过上了更轻松的生活。

那么,机器人是怎么察言观色的呢?

AI识别人的五重境界

AI识别人可以分成五个层次,依次为:

1.有没有人?->object detection (YOLO SSD Faster-RCNN)

2.人在哪里?->object localization & semantic segmentation(Mask-RCNN)

3.这个人是谁?->face identification(相对独立的一个领域,暂且不表)

4.这个人此刻处于什么状态?->pose estimation

5.这个人在当前一段时间里在做什么?->Sequence action recognition (水比较深,后续慢慢介绍)

五个层次由简单到复杂,4&5两个high level的视觉识别中,有一项很关键的先决技术-骨骼关键点提取,后者的检测的精度会直接影响姿态检测的准确度以及动作识别及预测的精度。下面就介绍下骨骼关键点提取及人体姿态估计。

什么是人体姿态估计?

人体姿态估计,pose estimation,就是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。

人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等,如下图。

通过对人体关键点在三维空间相对位置的计算,来估计人体当前的姿态。

进一步,增加时间序列,看一段时间范围内人体关键点的位置变化,可以更加准确的检测姿态,估计目标未来时刻姿态,以及做更抽象的人体行为分析,比如判断一个人是否在打电话等等。

姿态检测的挑战:

  1. 每张图片中包含的人的数量是未知的。

2. 人与人之间的相互作用是非常复杂的,比如接触、遮挡等,这使得联合各个肢体,即确定一个人有哪些部分变得困难。

3. 图像中人越多,计算复杂度越大(计算量与人的数量正相关),这使得real time变得困难。

OpenPose三大亮点

OpenPose是基于卷积神经网络和监督学习并以caffe为框架写成的开源库,可以实现人的面部表情、躯干和四肢甚至手指的跟踪,不仅适用于单人也适用于多人,同时具有较好的鲁棒性。可以称是世界上第一个基于深度学习的实时多人二维姿态估计,是人机交互上的一个里程碑,为机器理解人提供了一个高质量的信息维度。

其理论基础来自Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ,是CVPR 2017的一篇论文,作者是来自CMU感知计算实验室的曹哲(http://people.eecs.berkeley.edu/~zhecao/#top),Tomas Simon,Shih-En Wei,Yaser Sheikh 。

主要流程

  1. 输入一幅图像,经过卷积网络提取特征,得到一组特征图,然后分成两个岔路,分别使用 CNN网络提取Part Confidence Maps 和 Part Affinity Fields;
  2. 得到这两个信息后,我们使用图论中的 Bipartite Matching(偶匹配) 求出Part Association,将同一个人的关节点连接起来,由于PAF自身的矢量性,使得生成的偶匹配很正确,最终合并为一个人的整体骨架;
  3. 最后基于PAFs求Multi-Person Parsing—>把Multi-person parsing问题转换成graphs问题—>Hungarian Algorithm(匈牙利算法)

(匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)

卷积网络

亮点1:PAF-Part Affinity Fields(本paper的核心贡献):

人体姿态检测,通常是top-down的思路,也就是先做行人检测,然后把每一个人分割出来,最后基于每一个独立个体,找出各自的手手脚脚(人体关键点)。这个办法有两个问题:

1.结果严重依赖第一步行人检测器的结果,如果人都没找到,就无从进行找手手脚脚这一步了。

2.计算时间和人数正相关,人越多越耗费时间。

OpenPose 使用了另一种思路,即bottom-up,先找出图中所有的手手脚脚,再用匹配的方法拼装成一个个人体骨架。这种办法有一个缺陷,就是没办法利用全局上下文的信息。

为了克服这个问题,本文想出了一个办法,就是PAF(Part Affinity Fields), 部分区域亲和。它负责在图像域编码着四肢位置和方向的2D矢量。同时,使用CMP(Part Detection Confidence Maps)标记每一个关键点的置信度(就是常说的“热图”)。通过两个分支,联合学习关键点位置和他们之间的联系。

同时推断这些自下而上的检测和关联的方式,利用贪婪分析算法(Greedy parsing Algorithm),能够对全局上下文进行足够的编码,获得高质量的结果,而只是消耗了一小部分计算成本。并行情况下基本达到实时,且耗时与图片中的人数无强关联。

亮点2: 高鲁棒性

这是CMU的研究成果。很多人好奇,为啥CMU的模型鲁棒性好,精度高?我觉得这主要归功于数据集规模大,质量好。

下图是CMU家的数据采集设备,一个封闭的大球,可以做到任意角度的人体数据采集。大球上面镶嵌了480 VGA cameras+31 HD cameras+10 Kinect Ⅱ Sensors+5 DLP Projectors. 并且,全部实现了硬件同步。

由于工作原因,笔者也接触过不少国内外的训练数据采集公司,但是这样的豪华配置,还是非常少见的。

实物长这样:

海量高质量的数据,使得仅仅基于2D图像就可以实现鲁棒性很好的人体姿态检测。

这充分说明了,数据为王的时代,数据多就是硬道理。

亮点3:终于将人体、人手、人脸的landmarks三元归一

以前,人体骨骼关节点是行为分析动作识别的人做,人脸landmark提取是人脸识别或者美颜算法开发团队做,手部关节点是手势识别人机交互团队在做,属于不同的细分方向。

CMU的团队,因为前期的人体骨骼关节点识别取得了不错的成果,有了更大的目标(野心),于是把人脸人手都整合了进来,做成了一个统一的graph,效果也还可以。face alignment和pose alignment串起来了,而且根据人体头部的刚体属性及四肢的非刚体特性设计了一套基于caffe的点估计与扩散模型,并建立树状决策加速,据此再加之3D背景分割技术。

当然,如果野心再大一点点,做一个结合了表情识别和手势识别的人体行为识别方案就更了不起了,比如人在打架的时候,脸部表情通常是紧绷或者愤怒的,手部通常会攥成拳头,这样,整合脸和手的识别结果,都整体复杂行为的分析和预测会有帮助。

多人70关键点人脸估计:

多人2*21关键点手势估计:

有什么短板?

耗显存

计算量本来就很大,为了达到实时的目的,使用了高并行的策略。基于cuda加速,所以非常吃显存,基本劝退显存低于4G的机器了(GTX 980ti+)。

时间分析(仅作参考): 
<基于GTX-1080 GPU> 
原始图像尺寸是1080×1920, 为了适应GPU memory,resize成了 368×654;

包含是19个人的视频检测是8.8 fps;

对于9个人, parsing耗时0.58 ms, CNN耗时99.6 ms。

特殊场景下检测效果差

比如人体姿势比较诡异的时候,如下图(曾经对这个场景产生过心理阴影)

非直立向上朝向的人

其他情况,诸如图像分辨率低、运动模糊、低亮度、检测目标密集、遮挡严重、不完整目标等,效果都不是很理想。但是,这是全天下图像检测算法都会犯的错。

完整视频测试

有个日本人做过一段印度舞蹈的骨骼提取,这里我做了一段国产的:

<芳华,群舞片段>

<叶问,我要打十个片段>

有什么应用场景(脑洞时间)?

--------------------------2018.6.15更新--------------------------------

抖音尬舞机:经评论区知友提醒,活捉一个已经上线的人体姿态估计应用:

这是脑洞照进现实的时刻~~

---------------------------------------------------------------------------

3D 个人健身教练:

体育类教学(包括上面提到的武术舞蹈教学):

尤其像高尔夫这种固定位置且非常强调姿势正确的运动,很适合用姿态检测技术来辅助训练和错误姿势矫正。

3D试衣:现在也有,但是加入实时姿态检测,可以做到人动衣动的效果。

游戏人物动作设计(精度在高些,有潜力取代动作捕捉那套昂贵的设备):

古画分析(美术学院教学辅助):

人体绘画教学(适用于初学者)

照相馆拍照姿势指南:

无意义的逗逼(抖x):

结语

效果无疑是很出众的。仅仅基于2D图像,廉价的普通摄像头,就可以实现多人的、实时的、鲁棒性很好的人体骨骼关节点提取与姿态检测。

但是问题也很明显。如果是离线检测的话,这个对终端的硬件配置是有很高要求的。一台监控设备,为了骨骼提取,配置一块几千大洋的NV独显,这产品基本被判死刑了。Intel的RealSense D400和Microsoft的kinect2等3D摄像头都可以实现实时人体骨骼提取,但是价格前者1000大洋,后者1500大洋,极具竞争力。

给创业者一点思路:如果把这套模型移植到ASIC或者FPGA上,速度和成本得到很好的平衡,会有一些机会。

机器会越来越了解我们,越来越熟悉我们的体态特征和行为方式,总有一天,人类在机器面前,如同naked,再无秘密可言。

目前看来,这是不可逆的趋势。

相关链接:

【1】论文:https://arxiv.org/pdf/1611.08050.pdf

【2】姿态检测视频制作源码:muyiguangda/caffe_rtpose

【3】开头视频:Changing Batteries 更换电池「中字」

【4】CMU训练数据集: CMU Panoptic Dataset

【4】匈牙利算法: Hungarian algorithm

原创声明:本文系知乎原创文章,将同步发布在微信公众号 BloomCV计算视觉与深度学习的小屋)中,欢迎关注!

其他精彩内容:

浩克匠心:【目标检测简史】YOLOv3的实景大片儿(含源码)​zhuanlan.zhihu.com浩克匠心:【目标检测简史】进击的YOLOv3,目标检测网络的巅峰之作​zhuanlan.zhihu.com

【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接相关推荐

  1. 实时多人2D姿态估计

    前言 OpenPose是基于卷积神经网络和监督学习并以caffe为框架写成的开源库,可以实现人的面部表情.躯干和四肢甚至手指的跟踪,不仅适用于单人也适用于多人,同时具有较好的鲁棒性.可以称是世界上第一 ...

  2. Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货

    作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 人体姿态估计指从单个 RGB 图像中精确地估计出人体的位置以及检测骨骼关键点的位置.人体姿态估计是计算机视觉领域的研究热点,是诸 ...

  3. java机票实时比价系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java机票实时比价系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java机票实时比价系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B ...

  4. unity3d游戏2d横版射击游戏完整项目源码分享

    unity3d游戏2d横版射击游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1YwhEy7DeKIHFU8pBLdJFPg 提取码:3wnx 复制这段内容 ...

  5. 【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)

    本博文来自于:http://www.cnblogs.com/zcsor/archive/2012/12/25/2832820.html 经过这半年左右的学习和探索,现在对五子棋AI有了一定的认识,给大 ...

  6. python五子棋ai棋力最高_【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)...

    本博文来自于:http://www.cnblogs.com/zcsor/archive/2012/12/25/2832820.html 经过这半年左右的学习和探索,现在对五子棋AI有了一定的认识,给大 ...

  7. 『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码

    目录 前言 一.CRNN 1.1 CRNN 介绍 1.2 CRNN 网络结构 1.2.1 CNN 1.2.2 Map-to-Sequence 1.2.3 RNN 1.2.4 CTC Loss 1.3 ...

  8. 无需人脸检测,实时3维人脸姿态估计img2pose 2020

    提出了一种实时的6自由度3D人脸姿态估计方法,其不依赖于人脸检测和关键点对齐.我们观察到直接估计6自由度刚体变换是一个比在3D人脸对齐中广泛使用的关键点检测更简单的问题.基于此我们做出了一下几个贡献( ...

  9. 2D姿态估计regression-based之RLE损失函数

    参考:镜子,Indigo6 使用特定损失函数的前提是我们对标签的分布进行了某种假设,在这种假设的前提下通过极大似然法推出所有样本构成的极大似然公式,然后再使用凸优化的方法比如常见的梯度下降法进行求解. ...

  10. 多人视频相亲交友源码打破传统相亲

    从前几年就有开始主打"聊天免费""视频相亲"的视频相亲软件走进单身群体的视线,早抖音和头条也是猛打广告.这个视频相亲的话软件就相当于线下咱们看的"非诚 ...

最新文章

  1. PHP 通过数组判断数组顺序输出是否是二叉排序树的后序遍历结果
  2. 油品调和计算软件_海博柴油批发:调和密度的利润空间
  3. 交叉编译_Golang交叉编译
  4. python sftp_Python使用sftp实现上传和下载功能(实例代码)
  5. leetcode 542. 01 Matrix | 542. 01 矩阵(图解,广度优先搜索)
  6. 使用JacpFX和JavaFX2构建富客户端
  7. HBase原理和安装
  8. linux input输入子系统分析《四》:input子系统整体流程全面分析
  9. 结构体:struct关键字
  10. html 下拉列表返回值,jquery 根据后台返回值来选中下拉框 option 值
  11. python 读取并显示图片,用plt 同时显示多幅图像
  12. 图解物联网---物联网基础知识
  13. php 快递打印设置,让ecshop批量打印快递单修改方法
  14. 5个理由告诉你为什么用NAS网络存储
  15. AWS VPC(二)-----创建VPC Peering
  16. 泛微oa ecology8.0创建工作流程示例
  17. 深度学习系列2:框架tensorflow
  18. FAST-LIO2.0代码解析(一)preprocess.h
  19. lcd显示数字+0x30
  20. 容器云和传统云平台有什么区别?

热门文章

  1. Excel操作技巧大全
  2. Java Web项目开发项目经验总结
  3. java毕业设计大学生体检管理系统Mybatis+系统+数据库+调试部署
  4. 植物冠层部分参数的定义及含义解释
  5. 计算机操作系统第三次作业,操作系统第三次作业参考答案
  6. Instagram使用教程
  7. 计算机知识竞赛策划案,计算机基础知识竞赛策划书.doc
  8. win10鼎信诺为什么安装不了_两个方法教你彻底解决win10系统更新补丁安装失败的问题-系统操作与应用 -亦是美网络...
  9. 【软技能】完全写作指南--即时信息
  10. CentOS8.4搭建PXE启动Ubuntu-server20.04(UEFI)