1、OpenPose

OpenPose(OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields)首次提出一种自下而上描述关联分数的方法:Part Affinity Fields(PAF),PAF是一组对位置和肢体方向进行编码的2D矢量场,这些自下而上的检测和关联表示能够很好地编码全局上下文,以一小部分计算成本获得高质量的结果。

OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库

上图给出了OpenPose的整体流程:OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_02生成编码人体关键点部位的置信度图 OpenNLP 中文模型库 openpose模型介绍_Real_03OpenNLP 中文模型库 openpose模型介绍_Real_04生成编码各位置的肢体向量场 OpenNLP 中文模型库 openpose模型介绍_图像特征_05OpenNLP 中文模型库 openpose模型介绍_图像特征_06贪婪推理,解析 OpenNLP 中文模型库 openpose模型介绍_Real_03OpenNLP 中文模型库 openpose模型介绍_图像特征_05,输出每一个人的2D关键点。前向网络同时预测一组身体部位位置的2D置信度图 OpenNLP 中文模型库 openpose模型介绍_Real_03 和编码一组身体部分之间关联程度(亲和度)的2D矢量场 OpenNLP 中文模型库 openpose模型介绍_图像特征_05OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_11具有 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_12 个置信图,每个关键点部位一个。 OpenNLP 中文模型库 openpose模型介绍_图像特征_13具有 OpenNLP 中文模型库 openpose模型介绍_Real_14 个矢量场,每个肢体1个。

(1)网络结构


OpenNLP 中文模型库 openpose模型介绍_图像特征_15


上图给出的是最新版OpenPose的网络结构示意图,需要注意的是:原版OpenPose中 OpenNLP 中文模型库 openpose模型介绍_Real_03OpenNLP 中文模型库 openpose模型介绍_图像特征_05 的计算学习是交替进行的,也就是每一个stage都需要各自计算一次;后来作者发现,二者可以分开,先计算PAF(每个位置的2D矢量场,进行4次),然后计算PCM(每个位置的置信度图,进行2次)。最开始的输入 OpenNLP 中文模型库 openpose模型介绍_图像特征_18 是通过VGG-19的前10层提取的图像特征映射,OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_19 表示的是进行一个PAF预测的CNN网络,OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_20 表示的是进行一个PCM预测的CNN网络。用数学表达式来解释就是OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_21

(1)根据上图的示意,OpenNLP 中文模型库 openpose模型介绍_Real_22 的范围是 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_23,并不包括 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_24,原文中公式(2)(3)似乎有错,OpenNLP 中文模型库 openpose模型介绍_Real_22 也写成了OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_26
(2)着重要注意每一层网络的输入,OpenNLP 中文模型库 openpose模型介绍_Real_22 网络的每一层都需要将 OpenNLP 中文模型库 openpose模型介绍_Real_28

(2)损失函数
网络在每一层给出一个损失函数,具体的定义如下:
OpenNLP 中文模型库 openpose模型介绍_Real_29其中,OpenNLP 中文模型库 openpose模型介绍_Real_30 是一个二进制位,当p点所在位置没有标注时 OpenNLP 中文模型库 openpose模型介绍_图像特征_31,它的目的是避免在训练过程中惩罚真正积极的预测(指的是轻微遮挡的位置?);OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_32 表示网络在p点的预测值,OpenNLP 中文模型库 openpose模型介绍_图像特征_33 表示p点的真实值(也就是需要事先定义好的label,它来自于对图像的标注)。OpenNLP 中文模型库 openpose模型介绍_Real_34这里的 OpenNLP 中文模型库 openpose模型介绍_Real_35 表示的是第 OpenNLP 中文模型库 openpose模型介绍_Real_35 个人,因为每个人都拥有关键点 OpenNLP 中文模型库 openpose模型介绍_图像特征_37,该位置附近的置信度类似呈高斯分布;如果是多人的情况,OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_38 置信度图上将有多个类似高斯分布,它们之间会有交集,这时作者采取求并集、取最大值的方法来获取最终的 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_38OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_40 控制了真实关节点的控制范围,该参数值越大 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_41 就越大,预测准确性相对会减小。
OpenNLP 中文模型库 openpose模型介绍_Real_42上面的三个公式给出了从标注数据计算PAF-label的方法:如果点 OpenNLP 中文模型库 openpose模型介绍_图像特征_43 在第 OpenNLP 中文模型库 openpose模型介绍_Real_35 个人的肢体 OpenNLP 中文模型库 openpose模型介绍_图像特征_45 上,那么它的矢量方向就是 OpenNLP 中文模型库 openpose模型介绍_图像特征_46(这是一个由 OpenNLP 中文模型库 openpose模型介绍_图像特征_47 指向 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_48 的单位向量);如果有一点 OpenNLP 中文模型库 openpose模型介绍_图像特征_43 被多个人共享,那么就取均值,这跟上面的 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_38 的多人处理方法稍有区别。还有一个问题就是,如何判断 OpenNLP 中文模型库 openpose模型介绍_图像特征_43 是否位于肢体 OpenNLP 中文模型库 openpose模型介绍_图像特征_45 上呢?下式给出判断公式:OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_53现在我们有了每一点的置信度图 OpenNLP 中文模型库 openpose模型介绍_Real_03OpenNLP 中文模型库 openpose模型介绍_图像特征_55 矢量场图 OpenNLP 中文模型库 openpose模型介绍_图像特征_05,现在考虑如何通过这两个数据来获取最终的输出。

OpenNLP 中文模型库 openpose模型介绍_图像特征_57:0-17号关键点,所以有18个和图像同尺寸的置信度图,每一个图有多个峰值点,理想情况是一个峰值点对应一个人,到目前为止还做不到,因为单个人的该关键点可能存在多个候选点;
OpenNLP 中文模型库 openpose模型介绍_图像特征_58:一共有 OpenNLP 中文模型库 openpose模型介绍_Real_59 个肢体,所以就有 OpenNLP 中文模型库 openpose模型介绍_Real_59 个PAF图,每一个PAF图给出了每一点的矢量方向,这里就不再是像 OpenNLP 中文模型库 openpose模型介绍_图像特征_57

想一想:如果我们从所有的 OpenNLP 中文模型库 openpose模型介绍_Real_03 候选点中去寻找最优的关节点,那么是不是同一个人的同一个关节点的候选位置也会参与到肢体连接的判断中?这将会是一个K分图的最优解问题,作者并没有这样做。注意到 OpenNLP 中文模型库 openpose模型介绍_Real_03 中每一个置信度图其实是有顺序关系的,或者说可以人为给它们顺序:OpenNLP 中文模型库 openpose模型介绍_Real_64 是左膝关节,OpenNLP 中文模型库 openpose模型介绍_Real_65 是左脚踝,OpenNLP 中文模型库 openpose模型介绍_图像特征_66 是右膝关节,OpenNLP 中文模型库 openpose模型介绍_图像特征_67 是右脚踝,那么就只让 OpenNLP 中文模型库 openpose模型介绍_Real_64OpenNLP 中文模型库 openpose模型介绍_Real_65 去做匹配, OpenNLP 中文模型库 openpose模型介绍_图像特征_66OpenNLP 中文模型库 openpose模型介绍_图像特征_67 去做匹配, OpenNLP 中文模型库 openpose模型介绍_Real_64OpenNLP 中文模型库 openpose模型介绍_Real_73 等是不需要做匹配的,这样就把问题转换成一个二分图的最大匹配问题。现在有候选点的集合OpenNLP 中文模型库 openpose模型介绍_图像特征_74OpenNLP 中文模型库 openpose模型介绍_Real_75就代表每一个置信度图上的候选点,对于 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_76 我们并不知道它归属于哪一个人。假设现在需要找到以关节点 OpenNLP 中文模型库 openpose模型介绍_图像特征_77 作为端点的肢体连接,那就需要找到 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_78



OpenNLP 中文模型库 openpose模型介绍_图像特征_79


上图左边给出了一个带权匹配的示意,OpenNLP 中文模型库 openpose模型介绍_图像特征_80 就是每条边的权值,每条边归属于一个人;右边的公式第一个是计算最大匹配的方法,OpenNLP 中文模型库 openpose模型介绍_图像特征_81 表示候选点之间是否发生连接关系,例如 OpenNLP 中文模型库 openpose模型介绍_图像特征_82 就表示发生连接, OpenNLP 中文模型库 openpose模型介绍_Real_83 就表示不发生连接;下面两个公式是约束,意思就是:对于 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_78 中的任何一个点,它只会与对面的集合中的一个点发生连接,不会有一对多的情况发生。没有发生连接的候选点就表示被抛弃掉了,意味着它是不准的。这里权值 OpenNLP 中文模型库 openpose模型介绍_图像特征_85 的计算方式为OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_86作者采用线积分的方式来计算权值,OpenNLP 中文模型库 openpose模型介绍_图像特征_87 就对应了点 OpenNLP 中文模型库 openpose模型介绍_图像特征_88OpenNLP 中文模型库 openpose模型介绍_图像特征_89 是前面网络输出的,OpenNLP 中文模型库 openpose模型介绍_图像特征_90 表示两个端点之间的任意一点,OpenNLP 中文模型库 openpose模型介绍_图像特征_91 的范围是 OpenNLP 中文模型库 openpose模型介绍_Real_92。通过匈牙利算法就能够找到该肢体的最优候选端点,要找到所有肢体的最优端点,就用下式OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_93最终我们要的就是这个最大匹配 OpenNLP 中文模型库 openpose模型介绍_Real_94,因为每一个关节点最多连接两个其他点,所以找到的最大匹配肢体串起来就形成单个人的姿态估计。

这里忽略了二分图匹配问题的介绍,以及匈牙利算法的具体内容,但是这两部分是最后“贪婪推理”的基础,需要理解。

(3)整体效果
OpenPose在速度、精度上都很优秀,不会因为人数增加而产生速度上的延迟,不依赖于人体的姿势;同时它并不仅仅针对人体关键点的检测,其他物体(例如汽车)也可以用同样的方式来实现关键点检测。



OpenNLP 中文模型库 openpose模型介绍_图像特征_95


2、CPN

CPN(Cascaded Pyramid Network for Multi-Person Pose Estimation,级联金字塔网络)是2017 COCO Keypoints Challenge的冠军(同年亚军是AlphaPose),由旷视完成。它的主要工作是人体关键点检测,也就是说它是建立在人体边框检测的基础之上的,原文的人体边框检测是由FPN(就是Mask RCNN中用到的那个)完成的。

OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_96


对于脸部特征来来说我们一般根据表观特征就能检测定位,但是对于膝盖、肘关节等位置,由于衣物的包裹它们是不容易仅仅靠外观表征去定位的。在遮挡、重叠、拥挤等情境下,这些难以被检测的关键点成为“hard-keypoints”,CPN的重点就是解决对于“hard-keypoints”的检测。CPN由两个环节构成:GlobalNet,RefineNet。(1)GlobalNet

GlobalNet基于ResNet,作者分别在ResNet-50、ResNet-101做了研究,这里以ResNet-50为例来说明。ResNet-50有四级特征输出:conv2_x,conv3_x,conv4_x,conv5_x,GlobalNet就是在这四级特征(简称为C2/C3/C4/C5)上做文章。

OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_97


浅层特征C2/C3 在定位上有着较高的空间分辨率,但是在识别上语义信息较少;由于卷积(和池化)的存在,深度特征层 C4/C5语义信息较多,但空间分辨率较低。因此GlobalNet引入 U 型结构,同时保留特征层的空间分辨率和语义信息。所谓的 U 型特征指的就是特征融合:GlobalNet将低层特征进行上采样,然后与上一层特征相加,实现不同尺度特征的融合。完了之后,再将融合的特征进行上采样,统一得到原始图像1/4大小的特征,进行该阶段的L2-loss计算。

GlobalNet对于简单点(人眼、耳)的识别是比较有效的,但是对于像left hip这样的位置则比较难识别(看上图右边)。这时就要将GlobalNet的四级特征送入RefineNet,进行再识别。

(2)RefineNet

RefineNet接受了GlobalNet传过来的所有特征,为提升信息传输的效率、保证信息完整性,RefineNet 在不同层之间传输信息,并通过上采样和连接把这些信息整合起来。同时RefineNet还加入了更多的bottleneck,在较小的空间尺度上可实现效率和性能的平衡。

需要注意的是:GlobalNet的L2-loss是将网络输出与所有label的groundtruth做计算,然后全部用于反向传播;但是在RefineNet中,计算loss后会将其从大到小排序,然后选择top-k进行反向传播,这就是为什么在上上图中有 OpenNLP 中文模型库 openpose模型介绍_Real_98

这里要关注一下GlobalNet、RefineNet中的几个关键位置:
(1)C2-C5的重要性:作者最后通过对比试验 OpenNLP 中文模型库 openpose模型介绍_Real_99 得出,完整使用C2-C5效果是最好的;
(2)bottleneck的重要性:可以看对比试验的 OpenNLP 中文模型库 openpose模型介绍_图像特征_100 的对比;
(3)OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_101 中top-k的k取值:OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_102 是最好的,也就是说一般会有8个比较难识别的点,这是 OpenNLP 中文模型库 openpose模型介绍_OpenNLP 中文模型库_103

(3)整体效果
CPN网络在Top-Bottom过程中扮演的是bottom的角色,也就是说它在一定程度上取决于top结果的好坏。CPN针对单人做姿态估计,单人所在区域不必太过精确,只需保证区域包含完整人体即可;在这种前提下,CPN的检测速度完全可以达到实时,且精度也很高(从肉眼上来看与OpenPose不相上下)。



OpenNLP 中文模型库 openpose模型介绍_Real_104


其弊端在于,在多人情况下需要先执行人体检测,密集环境下人体存在重叠,RCNN/FRN等网络虽然可以快速准确地得到人体矩形框,但矩形框内部存在较高频率的人体重叠,会影响CPN的检测效果;Mask RCNN能得到个体的掩码,将个体掩码区域作为CPN的输入可以降低重叠对CPN的影响,但是效果依然不太理想。