这篇文章是2017年发表在CVPR上,作者开源了代码openpose,openpose代码完整,在推动人体识别,起到了巨大的作用。

简介

人体姿态估计是理解视频图像的一个核心问题,一种比较简单的方法是two-step的框架,首先检测出图像中的人,然后解决人体姿态估计的问题。这种方法的问题在于,算法执行时间与图片中的人数呈正比,同时若第一步未检出行人,将会出现比较严重的漏检。

这篇文章提出一种bottom-up approach,这种方法检测出人体的部分,然后parsing成人体姿态的结果。这种方法执行时间与人数无关。

architecture 网络框架

image-20200205200758114

  • 首先通过baseline10层的VGG-19网络,生成feature map
  • 将feature map 分为两路,通过多层的CNN生成:
    • a set of Part Confidence Maps 身体部位的置信度
    • a set of Part Affinity Fields (PAFs) 部位亲和场
  • Part Confidence Maps: a set of 2D confidence maps S for body part locations. Each joint location has a map.也就是说,每一个节点都对应了一张map,如果有25个节点的时候,就会有25张map。
  • Part Affinity Fields (PAFs): a set of 2D vector fields L which encodes the degree of association between parts. 生成parts之间的单位向量场。
  • Finally, the Confidence Maps and Part Affinity Fields are processed by a greedy algorithm to obtain the poses for each person in the image 联合置信图以及亲合场得出图像中每一个人的pose

confidence maps

置信图指的是一张2D表示的置信度图,可以定位到图像中关节点的像素上。

令$J$作为人体的的关节点总数,confidence map如下:
$$
\text { the set } S=\left(S_{1}, S_{2}, \ldots, S_{J}\right) \text { where } S_{j} \in R^{w \times h}, j \in 1 \ldots J
$$
总的来说,每一张map都对应一个节点,并且与输入的图片有着相同的size。

Part Affinity Fields(PAFs)

PAF指的是流向量场,流向量场用来编码第一部分成对的关节点对,例如nose,neck,elbow等等:
$$
\text { the set } L=\left(L_{1}, L_{2}, \ldots, L_{C}\right) \text { where } L_{c} \in R^{w \times h \times 2}, c \in 1 \ldots C
$$
如果一个点在他的body part上(腿),那么这个点的值是一个2D单位向量,从起点joint指向终点的joint。

image-20200206214339000

如上所述,整个流程分成两个步骤,第一个阶段生成PAF流向量场,第二个向量生成关节点密度场。

Multi-Person Parsing using PAFs

从图像中找出人体姿态的步骤如下:

  • Step 1: Find all joints locations using the confidence maps.
  • Step 2: Find which joints go together to form limbs (body parts) using the part affinity fields and joints in step 1.
  • Step 3: Associate limbs that belong to the same person and get the final list of human poses.

如何生成人体limb

  • 首先将生成的PAFs放大到输入的尺寸,
  • 对于每一个limb类型,例如对wrist_elbow:
    • 从深度图中拿到所有的wrist和elbow的关节点的位置
    • 对每一个起点peak和终点peak:
      • 用终点减去起点,然后归一化之后得到单位方向向量
      • 每一对起点和终点之间的点,计算他们的PAFs的值
      • 通过这中间所有点的PAFs值得平均值,计算当前limb connection的score
      • 添加一个score来惩罚long distance:min(0.5*paf_height/limb_dist - 1,0)
      • 添加当前的limb连接到limb connecton candidate中
    • 对limb connection candidate进行排序
    • 对于每一个候选连接,如果source和destination未被选中,则添加这个connection到最终的list当中

pytorch implementaton

giithub链接:https:/github.com/tensorboy/pytorch_Realtime_Multi-Person_Pose_Estimation

preference