作者 | 站长 pursueYfuture
来源 | AI专栏(ID: pursue-Y-future)
计算机视觉的一大研究热点是人体姿态估计,还有很多问题急需解决,比如遮挡,交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基于深度学习的实时多人姿态估计。
人体姿态估计要干嘛?
关于人类活动规律的研究,必定是计算机视觉领域首要关注的内容。其中,人体姿态估计便是计算机视觉领域现有的热点问题,其主要任务是让机器自动地检测场景中的人“在哪里”和理解人在“干什么”。
随着信息化时代的迅速发展,人类每时每刻都在通过多种多样的手段和途径获得海量的可视化图像数据,这使得基于自然场景图像的人姿态估计研究在现实生活中拥有很多潜在的应用价值。图1展示了自然场景图像中人体姿态估计的研究应用。
Fig.1: 自然场景图像人体姿态估计的研究应用
在信息化的时代,视频监控正在银行、超市以及公安机关等关乎人民财产、人身安全的重要场所发挥着举足轻重的角色。面对海量的视频图像序列,为了及时地制止现场事故的进一步发生,工作人员必须长时间且精神高度集中地观察视频监控画面并对异常事件作出处理。
除了工作人员很难长时间地保持高度警惕外,长期投入大量的人力来监测小概率发生的事件也不是单位机构提倡的做法。因此,实现视频监控的智能化成为一种互联网时代的必然趋势。但是,实现智能视频监控的前提条件是让机器自动地识别视频图像序列中的人体姿态,从而进一步分析视频图像中人类的行为活动。
这就涉及到了我们下面所要说的人体行为分析了。
人体行为分析又为那般?
人体行为分析理解成为了近几年研究的热点之一。在人体行为分析理解的发展过程中,研究人员攻克了很多技术上的难关,并形成了一些经典算法,但仍有很多尚未解决的问题。从研究的发展趋势来看,人体行为分析的研究正由采用单一特征、单一传感器向采用多特征、多传感器的方向发展。而人体姿态估计作为人体行为识别的一个重要特征,是进行人体行为分析的基础,是人体行为分析领域备受关注的研究方向之一。
Fig.2: 人体行为分析的实际应用情形
人体姿态估计是指从图像中检测人体各部分的位置并计算其方向和尺度信息。人体行为分析是基于多帧图像的前后关系进行分析理解,而人体姿态识别是针对单帧静态图像进行处理。正确识别出多帧连续的静态图像的姿态信息,为实现正确的行为分析理解提供了可能。因此,人体姿态估计的准确性与实时性直接影响人体行为分析的准确性和实时性,确保实时准确的姿态识别是进行下一步行为分析的基础。
现在,我们的人体姿态估计课题的发展已越来越贴近实际,例如在步态分析、人机交互以及视频监控等领域,人体姿态估计均具有广泛的应用前景。所以呢,研究人体姿态估计还是蛮有意思的,好玩 !
当前姿态估计算法有哪些?
目前主流的人体姿态估计算法可以划分为传统方法和基于深度学习的方法。
基于传统方法的人体姿态估计
传统方法一般是基于图结构和形变部件模型,设计2D人体部件检测器,使用图模型建立各部件的连通性,并结合人体运动学的相关约束不断优化图结构模型来估计人体姿态。
其缺点是什么?
First,传统方法虽然拥有较高的时间效率,但是由于其提取的特征主要是人工设定的HOG和SHIFT特征,无法充分利用图像信息,导致算法受制于图像中的不同外观、视角、遮挡和固有的几何模糊性。同时,由于部件模型的结构单一,当人体姿态变化较大时,部件模型不能精确地刻画和表达这种形变,同一数据存在多个可行的解,即姿态估计的结果不唯一,导致传统方法适用范围受到很大限制。
Second,另一方面,传统方法很多是基于深度图等数字图像提取姿态特征的算法,但是由于采集深度图像需要使用专业的采集设备,成本较高,所以很难适用于所有的应用场景,而且采集过程需要同步多个视角的深度摄像头以减小遮挡问题带来的影响,导致人体姿态数据的获取过程复杂困难。因此这种传统的基于手工提取特征,并利用部件模型建立特征之间联系的方法大多数是昂贵和低效的。
基于深度学习的人体姿态估计算法
随着大数据时代的到来,深度学习在计算机视觉领域得到了成功的应用。因此,考虑如何将深度学习用于解决人体姿态估计问题,是人体姿态估计领域的学者们继图结构模型后所要探索的另一个重点。早期利用深度学习估计人体姿态的方法,都是通过深度学习网络直接回归出输入图像中关节点的坐标。
Fig.3: DeepPose
基于深度学习的人体姿态估计方法主要是利用卷积神经网络(CNN)从图像中提取人体姿态特征,相比于传统方法人工设计特征,CNN 不仅可以得到语义信息更为丰富的特征,而且能够获得不同感受野下多尺度多类型的人体关节点特征向量和每个特征的全部上下文(contextual),摆脱对部件模型结构设计的依赖,然后对这些特征向量进行坐标回归以反映当前姿态,从而将姿态信息应用于具体实际之中。
其好处是什么?
First,相较之下日常生活中的单目摄像头更为常见,虽然其采集的彩色图像容易受到光照等环境因素的影响,但是可以利用神经网络提取出比人工特征更为准确和鲁棒的卷积特征,以预测更为复杂的姿态,所以基于深度学习的人体姿态估计方法得到了深入的研究。
Second,不同于传统方法显式地设计特征提取器和局部探测器,进行深度学习时构建CNN比较容易实现,同时可以设计处理序列问题的CNN模型,例如循环神经网络RNN,通过分析连续多帧图像获得人体姿态的变化规律,进而为人体姿态中各个关节点之间建立更为准确的拓扑结构。
OK,in summary,人体姿态估计算法其实主要可分为基于传统方法的人体姿态估计和基于深度学习的人体姿态估计计算法两大类,而基于传统方法的人体姿态估计一般通过待处理图像到,部位或关节定位的非线性映射来实现。不论是具有理论优势的匹配模型,还是使得人体姿态估计准确性有所提升的深度学习网络,都正促使着人体姿态估计领域快速地发展。
但是,如何在表征人体复杂结构的理论数学模型和提升估计结果的精度上同时取得突破,是人体姿态估计领域一直以来探索的终极目标。因此,人体姿态估计领域在未来的工作中具有较大的研究发展空间。
Fig.4: 2D估计
多人姿态估计
本文站长主要是想谈谈基于深度学习的实时多人姿态估计。主要是拜读了文献7,所以本文站长想谈谈自己通过很多文献的全面阅读后,自己的一些想法和理解,有理解不到位的地方请大家斧正,谢谢。
目前多人姿态估计主要有两种思路,一种是基于自顶向下的算法,另一种是基于自底向上的算法。
Fig.5: 实时多人估计
自顶向下
自顶向下的算法先从图像中检测出所有人,随后利用单人姿态估计的方法对所有人进行姿态估计。自顶向下算法的缺点是算法运行效率随着人数增加而降低,且部分被遮挡的人无法被检测,精度不高。
自底向上
自底向上的算法,先检测出所有人的骨点,再将骨点进行连接形成图,最后通过图优化的方法剔除错误的连接,实现多人姿态估计。自底向上算法的优点是运行时间不随人数增加而线性增加,更有利于实时多人姿态估计。
站长这次采用的多人姿态估计方法是基于自底向上的方法,是一种六阶段双分支的深度神经网络结构,可同时获得骨点位置以及骨点之间的连接置信度,有效稀疏骨点连接图,提高算法运行效率。对于骨点连接置信度,有骨点之间的亲和区域方法,通过在亲和区域上的线性积分计算骨点连接置信度。
网络结构
对于一张输入图像,深度神经网络同时预测出每个骨点的热力图S=(S1,S2,…,SJ)和骨点之间的亲和区域L=(L1,L2,…,LC) 。热力图的峰值为骨点的位置,骨点相互连接构成二分图,亲和区域对图的连接进行稀疏,最后对二分图进行最优化实现多人姿态估计。
网络结构深度解读
如图6所示,整体网络架构为六阶段双分支,上分支负责预测骨点位置,下分支负责预测骨点之间的亲和区域。前一阶段的预测结果融合原有图像特征并作为下一阶段的输入,经过多阶段的操作以提高骨点预测精度。
Fig.6: 网络结构
图像特征采用VGG-19模型进行提取,并用符号F表示图像特征。在第一阶段,网络以F作为输入,输出关节点的热力图S1 = ρ1 (F) 和骨点之间的亲和区域L1 = φ1(F),其中 ρ1 和 φ1 为网络的映射函数,其本质是一系列的卷积操作。
在第一阶段,对于输入特征采用3×3大小的卷积核连续进行三次卷积,之后用1×1 大小的卷积核连续进行三次卷积。
之后的阶段将前一阶段的预测结果和原图像特征F进行融合,作为当前阶段的输入,经过卷积操作分别预测出关节点热力图和关节点的亲缘关系程度(站长自己的理解haha,简单点就是两个关节点的朋友关系的亲密程度呗):
其中ρt 和φt 分别表示现阶段t 的卷积操作,先用大小为7×7的卷积核连续进行五次卷积操作,之后用大小为1×1的卷积核连续两次卷积操作,最终输出本阶段的关节点热力图和关节点亲和区域。
损失函数
由于关节点热力图和关节点的亲缘关系程度本质有所不同,因此在训练的时候需要分别对关节点位置和亲和区域进行监督,损失函数均采用L2损失。为了避免梯度消失现象发生,在每个阶段的输出都添加损失函数,起到中继监督作用。
另外在样本标注的时候,会存在行人漏标等情况对损失函数造成影响,因此需要对损失函数在各个位置进行掩膜操作。于是,对于关节点位置和亲和区域的损失函数形式如下:
其中S*j和L*c分别为关节点位置和亲和区域的实际测量值,W为掩膜函数,有标注的位置为1,没标注的位置为0,W(p)=0表示在位置p处没有标注。
Finally,整个网络的最终损失为每个阶段两个损失之和的累加:
站长关于两个概念的深层剖析
前面站长谈到了关节点热力图和关节点亲和区域(这个名称是曹大佬自己说的haha),可能有些站友对这2个概念可能云里雾里,下面站长就根据自己的理解好好的盘他一般。
关节点热力图
关节点热力图是衡量关节点在图像某位置出现的置信度,由一系列二维的点组成,每个点表示骨点出现在该位置的置信度,骨点最终位置定义为置信度最高的位置。对于图像中只有一个人的情况,则某一类型可见的关节点在热力图中只有一个峰值。对于多人情况,某一类型可见的骨点存在多个峰值,表示不同人的同一个类型骨点。
Fig.7: 关节点热力图(引自文献7)
强调!Attention!
这里站长还是要强调下多人情况下的热力图和单人是有很大区别的。
与CPM不同,CPM网络只是针对单个人的Pose,所以它的网络输出的P张置信度图中(假如一个人总共有P个关节点),每一张置信度上只有一个热点,这个热点只是一个人的一个关节点,比如右手腕关节这个关节点。
但如果图片上有多个人,它的第一行网络输出的P张置信度图中(假如单个人总共有P个关节点),每一张置信度上就有多个热点了,比如右手腕关节,假设有K个人,则要有K个右手腕关节点,所以此时这张置信度上就要有K个热点了。
为了更清楚地解释这件事,站长画了下图以形象化得辅助大家理解(画得太丑了orz大家别见怪haha,道理理解清楚就行了)
Fig.8: 站长丑画haha
In other way,我们在对样本进行标注时,只需确定骨点的位置,则该骨点真值热力图为在该点处放置一个固定方差的高斯核,用高斯函数确定各个位置的置信度。对于第k个人的第j个骨点,以xj,k表示骨点的实际位置,则该骨点周围的像素点的置信值为:
其中标准差σ控制了置信值的分布范围。对于一张存在多人的图像,每个人特定骨点的实际热力图为取得高斯核范围内的最大值:
Fig.9: Max操作(引自文献7)
注意:P是个二维的坐标点(x,y),表示图片中的每一个点。
关节点亲和区域
这个概念其实可以简单点理解就是两个关节点的朋友关系的亲密程度。
如图10所示,骨点亲和区域由一系列单位向量组成,每一段肢体对应一个亲和区域,位于肢体上的像素点都由一个单位向量进行表示,包含了位置和方向信息,所有在肢体上的单位向量构成亲和区域。
Fig.10: 关节点亲和区域
二分图优化(重点来了)
这是这个网络实现关节点检测的关键所在了,上面经过网络推理,得到骨点热力图以及骨点之间的亲和区域,对热力图采取非极大值抑制得到一系列候选骨点。由于多人或者错误检测,对于每一类型的骨点会存在多个候选骨点。这些候选骨点之间的连接构成二分图,每两个骨点之间的连接置信度通过线积分计算得到。为二分图找到最优的稀疏性是NP-Hard 问题。
优化该二分图即在所有边中选择一组边使得最终二分图的总权重最大,所以目标函数可写为:
约束条件:
其中Ec为二分图优化之后肢体c的权重,我们要取其中总权重之和最大的;
Zc为所有骨点连接集合Z的子集;
约束条件表示一段肢体最多只存在一条连接边。
Fig.11: 算法效果
问题分解与简化
为扩展到多人所有骨点的最优化问题,即定义Z为K 维匹配问题,这是一个NP-hard问题,为了提高最优化效率,如图所示,本文采用两种方法降低二分图优化算法的复杂度。
首先,如图所示,剔除跨骨点之间的连接构成稀疏二分图,代替全连接二分图;
然后根据肢体将稀疏后的二分图拆解得到图所示的多个简化二分图。
Fig.12: 多人姿态估计求解(引自文献7)
因此,整体优化问题转化为对各个简化后的二分图进行最优化。而最优化的目标函数为所有简化二分图的权重之和达到最大:
优化之后将各个简化二分图中共同的骨点进行整合得到最终多人人体姿态估计。这样做的优点是将NP-hard问题转化为多个较容易求解的二分图最优化,可以有效逼近全局最优解,同时降低算法复杂度,提高算法的运行效率,达到实时多人姿态估计的目的。
站长的笔记整理
我对这个算法的整体思路做了个笔记,字太丑了orz,大家别见怪haha,道理讲明白理解清楚就行了。
Fig.13: 站长的算法笔记(求各位大佬斧正)
站长的实验结果和分析
实验所使用的显卡为NVIDIA TITAN XP,CPU为Intel i7-6900K。图像大小为1920× 1080,通过下采样方法额外获得1280 × 720 和720 × 480 两个低分辨率的视频。
首先分析运行效率与人数的关系,在相同视频流和相同分辨情况下,计算自顶向下与自底向上运行时间与人数关系,计算结果如图14所示。由图可知,自顶向下随着人数的增加耗时几乎呈线性增加,而自底向上的运行耗时几乎不随人数增加而递增。卷积神经网络预测关节点的耗时也几乎不随人数增加而增加。因此我所使用的自底向上算法的运行效率不受行人数量的影响,对人数不确定的情况依然可以实时进行多人姿态估计。
Fig.14: 实验的运行耗时
最后,对三种分辨率视频采用两种不同方法进行耗时分析,结果如表所示,随着分辨率的降低,处理速度越来越快。若对视频所有帧都进行关节点检测,在最高分辨率情况下每秒可处理23帧,人眼感觉不到卡顿,基本达到实时。如果采用间隔检测结合跟踪,帧率可提高十几帧,完全达到实时要求。
站长测试(使用自己乱糟糟的图片才有说服力哈)
以下是我采用深度学习算法(Openpose)最终的实验结果(效果果然杠杠的):
Fig.15: 一次旅游haha
总体而言,效果还算很nice的,关节点都检测出来了,Great!(羞涩的我)
能阅读到这里,说明你也是个踏踏实实的做研究的人了。此时,我们娱乐时间到了,让我们来段测试视频放松放松下哈:
总结
六阶段双分支网络结构在关节点预测精度上略高于现有传统的的人体姿态估计算法。本次站长采用的算法利用自底向上的思想,首先预测出所有骨点位置,并将骨点连接形成图结构,通过图优化实现多人体姿态估计。算法运行效率方面,由于网络同时预测出关节点位置和关节点之间的空间关系,为多人姿态估计算法提供更加稀疏的二分图,降低二分图优化复杂度而达到了实时的效果。
巨人的肩膀
[1] Qian C, Sun X, Wei Y, et al. Realtime and robust hand trackingfrom depth[C]//Proceedings of the IEEE conference on computer vision and patternrecognition. 2014: 1106-1113.
[2] Joseph Tan D, Cashman T, Taylor J, et al. Fits like a glove: Rapid and reliable hand shape personalization[A]. IEEE Conference on Computer Vision and Pattern Recognition[C], 2016: 5610-5619.
[3] Tang D, Jin Chang H, Tejani A, et al. Latent regression forest:Structured estimation of 3d articulated hand posture[A]. IEEE conference oncomputer vision and pattern recognition[A], 2014: 3786-3793.
[4] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification withdeep convolutional neural networks[A]. Advances in neural informationprocessing systems[C], 2012: 1097-1105.
[5] Zhou E, Cao Z, Yin Q. Naive-Deep Face Recognition: Touching theLimit of LFW Benchmark or Not?[J]. Computer Science, 2015.
[6] Sharp T, Keskin C, Robertson D, et al. Accurate, robust, and flexible real-time hand tracking[A]. Proceedings of the 33rd Annual ACM Conference on Human Factors in Computing Systems. ACM[C], 2015: 3633-3642.
[7] Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields.2017
[8] Oberweger M , Wohlhart P , Lepetit V . Hands Deep in Deep Learning for Hand Pose Estimation[J]. ComputerScience, 2015.
推荐阅读
![](https://i-blog.csdnimg.cn/blog_migrate/1fdb5a596886b43765d2677ce2f3244a.png)
你点的每个“在看”,我都认真当成了AI
你点的每个“在看”,我都认真当成了AI