01.任务概览
人体姿态估计的任务是从包含人体的图片中检测出人体关键点,并恢复人体位姿。随着深度学习的发展,越来越多的深度学习方法被应用到了人体姿态估计任务上来。
难点
2D Pose estimation主要面临的困难:遮挡、复杂背景、光照、真实世界的复杂姿态、人的尺度不一、拍摄角度不固定等。
主流方法
1. 单人姿态估计
传统方法:基于Pictorial Structures, DPM
▪ 基于深度学习的算法包括直接回归坐标(Deep Pose)和通过热力图回归坐标(CPM, Hourlgass)
目前单人姿态估计,主流算法是基于Hourlgass各种更改结构的算法。
2. 多人姿态估计
(1)Top-Down Approaches,即two-step framework,就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成一个人形,缺点就是受检测框的影响太大,漏检,误检,IOU大小等都会对结果有影响,算法包括RMPE、Mask-RCNN 等。
(2)Bottom-Up Approaches,即part-based framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的部件拼接成一个人形,缺点就是会将不同人的不同部位按一个人进行拼接,代表方法就是openpose、DeepCut 、PAFs。
02.单人姿态检测
Stacked Hourglass(ECCV_2017)
paper:Stacked Hourglass Networks for Human Pose Estimation
code:https://github.com/princeton-vl/pose-hg-train
这篇论文提出了一种新的网络结构Stacked Hourglass Networks来对人体的姿态进行识别,这个网络结构能够捕获并整合图像所有尺度的信息。之所以称这种网络为Stacked Hourglass Networks,主要是它长得很像堆叠起来的沙漏。
Hourglass模块设计的初衷就是为了捕捉每个尺度下的信息,因为捕捉像脸,手这些部分的时候需要局部的特征,而最后对人体姿态进行预测的时候又需要整体的信息。为了捕获图片在多个尺度下的特征,通常的做法是使用多个pipeline分别单独处理不同尺度下的信息,然后再网络的后面部分再组合这些特征,而作者使用的方法就是用带有skip layers的单个pipeline来保存每个尺度下的空间信息。
03. 多人姿态检测
RMPE(ICCV_2017)
性能:MPII AP82.1%
paper:RMPE: Regional Multi-Person Pose Estimation
code:https://github.com/MVIG-SJTU/RMPE
RMPE是一个流行的自顶向下姿态估计算法,自顶向下方法的性能通常依赖于人体检测器精度,因此不太精确的人体检测框定位以及重复候选框会使姿态检测算法性能降低,该论文致力于解决这些问题。
为解决这一问题,作者提出了使用对称空间变换网络(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 的组合。
Generative Partition Networks
性能:MPII AP80.4,WAF AP84.8%
paper:Generative Partition Networks for Multi-Person Pose Estimation
code:https://github.com/NieXC/pytorch-ppn
这篇文章提出了一种生成划分网络(GPN)来解决多人姿态估计问题,与现有的自顶向下和自底向上的模型不同,GPN提出了一种全新的策略:
它从整张图片的多人关节候选区域生成单个人的关节划分,然后再同时对单个人的关节实例做推断。GPN设计了一个生成模型,该模型通过执行一个前向传播来有效生成具有单个人体关键节点划分的人结构。此外,它将人体关键节点构型的推理过程作为一个图划分问题进行推断,并对每个人体姿态检测问题进行局部优化,降低了复杂度,提高了性能。
Associative Embedding(NIPS_2017)
性能:MPII AP77.5%
paper:Associative Embedding:End-to-End Learning for Joint Detection and Grouping
code: https://github.com/stevehjc/pose-ae-demo-tf
目前多人目标检测多用bottom-up方法,即先检测关节然后分组,而相互依赖的两个步骤会导致误差的叠加。这篇文章致力于将检测和分组合并到一起,构建完全端到端的网络,作者认为后一阶段可以完全嵌入到前一个阶段,即嵌入式联结(associative embedding)。
基本方法是在检测环节直接给出检测结果编号,表明它属于哪个物体,所得到的编号标签就代表了分组。论文研究detection and grouping紧密结合性,在单一阶段end-to-end实现detection and grouping。提出 associative embedding,说白了就是在每次检测过程中,用tag识别不同group,相同tag的detection分成相同的group。
OpenPose(CVPR_2017)
性能: MPII AP75.6%
paper:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
code:
https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
这篇文章提出一种PAF方法,能够有效对多人进行姿态估计,同时在保证精度的情况下,做到实时效果。文章提出的Part Affinity Fields(PAFs)是一个2D向量集合,每一个2D向量集合都会编码一个limb的位置和方向。这些fields和关节的置信图一起经过CNN进行联合学习和预测。
文章代码总共分为两条线:
第一条线:求所有的关键点(头、肩膀、手肘、手腕.....)
1)一共两个cnn,第一个cnn的输入是原图,输出是热图(每一个热图包含某一种关键点)。
2)第二个cnn输入是上一个cnn得到的所有热图和原图,输出还是热图。
循环直至收敛
第二条线:求所有关节区域
1)一共两个cnn,第一个cnn输入是原图,输出是热图(每一个热图包含某一种连接区域)
,其实他们是一整片区域,不过每个地方的概率不同。
2)第二个cnn输入是上一个cnn得到的所有热图和原图,输出还是热图。
循环直至收敛
根据前边两个阶段得到的两个热图,计算哪两个点连接比较好。这就要根据关节区域和点的位置来计算每个像素的小法向,生成一个法向图。
根据前边生成的法向图,第一条线中最后得到的各个点的连线,确定哪两个点的连线的概率最大,找到所有这样的线。找到一个线就可以开始用最小生成树算法来找下一条线,最终得到一个人的骨架,然后得到所有的骨架,如果有连接不完整的,那就残缺的存在就好了。
Articulated Tracking(CVPR_2017)
性能:MPII AP74.3%
paper:ArtTrack: Articulated Multi-person Tracking in the Wild
code:https://github.com/eldar/pose-tensorflow
这篇论文实现的是对视频中多人进行pose tracking,出发点是单帧人体姿态,但实际上这个方法更快,主要通过如下方面做到:
(1)通过简化和稀疏body-part关系图和利用最新方法,以更快推理
(2)将大量工作转移到前馈卷积神经网络,使得在很复杂的情况下也能检测和推理属于同一个人的身体关节
这篇论文旨在解决来自人与人或者处在图像边缘所发生的遮挡问题,需要不仅仅考虑单帧图像中关键点关联的几何信息,还有多种图像线索的组合以及对多人进行建模。为了充分利用可用的图像信息,学习了一种端到端的卷积神经网络来关联人体关节和推断特定人的模型。然后将这些person-to-person的关联相应合并到一个框架中,以共同推理在图像和时间范围内的身体关节分配。
DeeperCut
性能:MPII AP59.4%,WAF AP88.1%
paper:DeeperCut: A Deeper, Stronger, and FasterMulti-Person Pose Estimation Model
Deepercut是在deepcut的基础上,对其进行改进,改进的方式基于以下两个方面:
(1)使用最新提出的residual net进行body part的提取,效果更加准确,精度更高
(2)使用Image-Conditioned Pairwise Terms的方法,能够将众多候选区域的节点压缩到更少数量的节点。
DeepCut模型使用CNN提取body part candidates,每一个关节点作为图中的一个节点,所有这些关键点之间的两两连线组成一个dense graph,节点之间的关联性作为图中节点之间的权重。这时,可以将其看作一个组合优化问题,将属于同一个人的关节点归为一类,每个人作为一个单独的类。同时,另一条分支,需要对检测出来的节点进行标记,确定他们属于人体的哪一个部分。最后结合分类的人结合标记的部分构成最终的每个人的姿态估计。
主要实现细节如下:
- 对于多人姿态估计问题,可以转换为一个优化问题。优化问题需要解决三个问题:
a,body part candidate 的选择,即节点的选择
b,每个选择的节点的标记问题,即该节点属于身体的哪个部分,eg:胳膊,腿,手等
c,分类问题,即每个选择的节点属于哪一个人 - 通过图论节点的聚类问题,有效的使用了非极大值抑制
- 优化问题表示为integer linear program(ILP)问题,可以用数学方法得到有效的求解
HRNet-48(CVPR_2019)
性能:MPCOCO AP77%
paper:Deep High-Resolution Representation Learning for Human Pose Estimation
code:https://github.com/leoxiaobin/deep-high-resolution-net.pytorch
论文里的这个模型简称为 HRNet,也就是是高分辨率网络 (High-Resolution Net) 的意思。这个模型最大的特点就是在卷积中可以一直保持高分辨率特征,不和我们之前使用的一些其他模型从低特征转化为高特征,而是从始至终保持高分辨率特征。
该模型对比了HRNet和之前模型的关键点检测表现。结果大模型HRNet-W48和小模型HRNet-W32,都刷新了COCO纪录。其中,大模型在384 x 288的输入分辨率上,拿到了76.3的AP分。之后该模型又在COCO的test-dev2017测试集上进行了测试,结果显示不论是大模型和小模型,该模型同样刷新了COCO纪录。大模型的AP分达到了77.0。
这个名叫HRNet的神经网络,可以随时保持高分辨率表征的原因是其独特的并联结构。论文中讲到一个概念为交换单元 (Exchange Units) ,这个单元将不同的子网络进行融合:让每一个子网络,都可以从其他子网络获取特征信息。并且讲到一个概念为交换单元 (Exchange Units) ,这个单元将不同的子网络进行融合:让每一个子网络,都可以从其他子网络获取特征信息。总之这个模块就是不断地在各个不同尺度的网络之中获取和传递信息,从而使整个网络保持高分辨率特征。
CPN+(CVPR_2018)
性能:MPCOCO AP73.0%
paper:Cascaded Pyramid Network for Multi-Person Pose Estimation
code:https://github.com/chenyilun95/tf-cpn
该论文整体框架采用Top-down自上而下的检测策略。首先使用行人检测框架,先检测出行人候选框。然后使用本文的CPN网络对每一个检测出来的行人候选框进行人体关键点的回归,进而输出最终结果。
首先对于可以看见的easy 关键点直接预测得到,对于不可见的关键点,使用增大感受野来获得关键点位置,对于还未检测出的点,使用上下文context进行预测。
网络整体结构采用CPN(CascadedPyramid Network)结构,Cascaded指的是级联的意思,代表了网络级联了2个类似的模块(GolbalNet和RefineNet),Pyramid指的是类似于FPN的金字塔网络结构。
其中,GolbalNet负责网络所有关键点的检测,重点是对比较容易检测的眼睛,胳膊等部位的关键点预测效果较好,采用的损失函数为L2 loss。其中在每一个elem-sum操作之前,都对featuremap使用了1*1的卷积操作。
RefineNet指的是对GolbalNet预测的结果进行修正的网络。GolbalNet对身体部位的那些遮挡,看不见,或者有复杂背景的关键点预测误差较大,RefineNet则专门修正这些点。主要还是基于shortcut的思想。在该阶段的训练中,还使用了类似OHEM的online hard keypoints mining难例挖掘策略。
Pose Residual Network(ECCV_2018)
性能:MPCOCO AP69.7%
paper:MultiPoseNet: Fast Multi-Person PoseEstimation using Pose Residual Network
code:https://github.com/salihkaragoz/pose-residual-network-pytorch
论文提出的网络结构大概分成三部分:
1.首先第一部分是Backbone网络,用于提取图片在多尺度下的特征。
2.第二部分包括两个分开、独立的网络,其中一个用来检测图片中所有的人体关键点(keypoint subnet),另一部分用来图片中的行人检测。
3.第三部分即文章的核心部分,提出残差网络(RPN,Pose Residual Network),概括来说就是一个聚类算法,将第二部分检测到的所有人体关键点依行人检测结果进行聚类,得到每个人的关键点聚集。
Mask RCNN
paper:Mask R-CNN
code:https://github.com/facebookresearch/Detectron
Mask RCNN是一个非常流行的语义和实例分割架构。该模型可以同时预测图像中多个物体的候选框位置及分割其语义信息的 mask。该模型的基础架构很容易被扩展到人体姿态估计上来。
其基本架构首先使用 CNN 从图像中提取特征图。这些特征接着被用于一个区域候选网络(Regin Proposal Network, RPN)来为各个对象生成候选框。候选框会从 CNN 提取出的特征图中选取一个区域。由于候选框可能会有多种尺寸,网络接下来会采用一个层,称为 RoIAlign,用来减小特征图的尺寸,使它们具有相同的尺寸。现在,抽取出的特征被传给平行的 CNN 分支,用来输出候选框和分割 mask 的最终预测。
我们现在主要关注一下分割的分支。假设我们图像中的对象可以属于 K 个类别中的一个。分割分支输出 K 个尺寸为 m*m 的二值 mask,每个二值 mask 代表只属于该类别的所有对象。我们可以将每种特征点建模为一个类别,然后将姿态估计任务看作一个分割任务,从而提取图像中每个人的特征点。
与此同时,可以训练一个对象检测算法来确定每个人的位置。通过组合每个人的位置信息和他们的特征点集合,我们可以得到图像中每个人的人体骨架。
该方法和自顶向下方法比较类似,但不同的是,其人体检测步骤和关键点检测步骤是同时进行的。换句话说,人体检测步骤和关键点检测步骤是相互独立的。
04.评价指标
Percentage of Correct Parts - PCP
如果预测关节位置与真实关节位置之间的距离小于肢体长度的一半(通常表示为PCP@0.5)。它衡量肢体关节的检测率,PCP越高,模型效果越好。
Percentage of Correct Key-points - PCK
如果预测关节和真实关节位置之间距离小于一定阈值则被认为正确检测到。PCK@0.2表示两者之间的距离为肢体长度的0.2,有时候这个阈值也被设置为150mm。同样,该值越高表示模型性能越好。
Object Keypoint Similarity (OKS) based mAP
di为检测到的关键点和对应groundtruth 之间的欧氏距离,vi表示groundtruth的可见标志,s是obeject scale,ki为控制每个关键点的衰减常量。
OKS在object detection方向上与IoU作用相同,它由预测结点和groundtruth 之间的距离经由人体尺寸标准化所得。
AP50 (AP at OKS = 0.50) AP75 , AP (the mean of AP scores at 10 positions, OKS = 0.50, 0.55, . . . , 0.90, 0.95; APM for medium objects, APL for large objects, and AR (Average recall) at OKS = 0.50, 0.55, . . . , 0.90, 0.955.
05.常用数据集
1. Posetrack:https://posetrack.net/
- 500 video sequences
- 20K frames
- 150K body pose annotations
- 3 challenges
2. LSP:http://sam.johnson.io/research/lsp.html
- 样本数:2K
- 关节点个数:14
- 全身,单人
3. FLIC:https://bensapp.github.io/flic-dataset.html
- 样本数:2W
- 关节点个数:9
- 全身,单人
4. MPII:http://human-pose.mpi-inf.mpg.de/
- 样本数:25K
- 关节点个数:16
- 全身,单人/多人,40K people,410 human activities
5. MSCOCO:http://cocodataset.org/#download
- 样本数:>= 30W
- 关节点个数:18
- 全身,多人,keypoints on 10W people
6. AI Challenge:https://challenger.ai/competition/keypoint/subject
- 样本数:21W Training, 3W Validation, 3W Testing
- 关节点个数:14
- 全身,多人,38W people