OpenPose:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

OpenPose 是一个 down-up 的多人姿态检测模型,一次性输出所有人的关节点 heatmap 预测,为了区分同一个人的关节点,模型同时输出关键点之间的亲和力PAFs,最终通过求二部图,得到预测结果

什么是 OpenPose ?

  • OpenPose 是第一个用于多人2D 姿态检测的开源实时系统,包括身体,脚,手和面部关键点
  • OpenPose 是一个 down-up 的多人姿态检测模型,一次性输出所有人的关节点 heatmap 预测,为了区分同一个人的关节点,模型同时输出关键点之间的亲和力PAFs,最终通过求二部图,得到预测结果

OpenPose 的网络结构?

  • 1)a)该方法将整个图像作为 CNN 的输入,以共同预测(b)用于身体部位检测的heatmap和(c)用于部位关联的 PAF;(d)解析步骤对关联的身体部位候选者执行一组二部图匹配;(e)最终将它们组装成图像中所有人的完整姿势
  • 2)某一 stage 上的结构,其中 LtL^t 是 PAF 输出(w, h, 2),StS^t 是关键点打分 (w, h),其中 PAF 在每个位置使用 2D 向量编码该位置信息,每个阶段的预测及其对应的图像特征针对每个后续阶段进行级联。训练时对每个 stage 进行监督

    St=ρt(F,St1,Lt1),t2,(1)Lt=ϕt(F,St1,Lt1),t2,(2)\begin{array}{rcl}\mathbf{S}^t&=&\rho^t(\mathbf{F},\mathbf{S}^{t-1},\mathbf{L}^{t-1}),\forall t\geq2,\quad(1)\\ \mathbf{L}^t&=&\phi^t(\mathbf{F},\mathbf{S}^{t-1},\mathbf{L}^{t-1}),\forall t\geq2,\quad(2)\end{array}

  • 3)多 stage 情况下的 PAF 输出,可以看出早期阶段左右身体部位和四肢之间存在混淆,但通过后期的全局推断,估计值越来越精确

OpenPose 的 Confifidence Maps for Part Detection?

  • 理论上每个confidence map是对应groundtruth位置单个像素响应(为1),其他像素点位0;但在实际应用中,我们是用高斯函数生成对应groundtruth位置,周围像素响应(高斯响应)
  • 单人场景下,一个 GT heatmap 只有一个峰,多人场景下,一个 GT heatmap 包含每个人 k 对应可见点 j 都应该有峰值响应

    Sj,k(p)=exp(pxj,k22σ2),(6)\mathbf{S}_{j,k}^*(\mathbf{p})=\exp\left(-\dfrac{||\mathbf{p}-\mathbf{x}_{j,k}||_2^2}{\sigma^2}\right),\quad(6)

  • 当多个峰之间有重叠时,对于一个位置,设置其最大值为 GT 值,如上图两个最大峰有重叠的区域,那么该区域取最大值 (虚线)

    SJ(p)=maxSj,k(p)S_J^*\left(p\right)=maxS_{j,k}^*\left(p\right)

OpenPose 的2D 向量场集PAFs(part affinity vector field)解释?

  • PAFs 用来编码部位之间的关联程度,上图的如右肘关节和右腕关节
  • 生成 GT PAFs 的过程如右图,其中 xj1,kx_{j1,k}xj2,kx_{j2,k} 表示第 k 个人的 GT 关节点位置,P 是图片上的某点,下面展示如何求取该点的 GT 值:
  • 1)限制 P 点的范围:表示生成 PAFs 属于两个关节点形成的肢体之间,即满足以下公式,其中 v=(xj2,kxj1,k)/xj2,kxj1,k2v=\left(x_{j2,k}-x_{j1,k}\right)/||x_{j2,k}-x_{j1,k}||_2 表示肢体单位方向向量,vv_\perp 表示其的垂直向量,lc,k=xj2,kxj1,k2l_{c,k}=||x_{j2,k}-x_{j1,k}||_2 表示肢体长度,σl\sigma_l 是肢体宽度

    0v(pxj1,k)lc,kandv(pxj1,k)σl,0\leq\mathbf{v}\cdot(\mathbf{p}-\mathbf{x}_{j_1,k})\leq l_{c,k}\text{and}|\mathbf{v}_\bot\cdot(\mathbf{p}-\mathbf{x}_{j_1,k})|\leq\sigma_l,

  • 2)给 GT PAFs 赋值:对于哪些满足以上要求的点进行赋值,直接赋值单位向量即可,2 维平面的单位向量也是 2D 的,所以每个位置使用 2 个数编码方向

    Lc,k(p)={vif p on limbc,k0otherwise.L_{c,k}^*(\mathrm p)=\begin{cases}\mathrm v&\text{if p on limb}c,k\\ 0&\text{otherwise.}\end{cases}

  • 3)归一化:最终向量场 groundtruth 是平均图像中的所有个人,其中 nc(p)n_c(p) 表示非 0 点数的平均值

    Lc(p)=1nc(p)kLc,k(p),L_c^*(\mathbf{p})=\dfrac{1}{n_c(\mathbf{p})}\sum\limits_k\mathbf{L}_{c,k}^*(\mathbf{p}),

  • 预测使用 PAFs 时,理论上是两个关节点之间向量场上的线段积分,但是由于计算复杂,直接在两个关节点之间等距采样即可

OpenPose 的 Part Affifinity Fields for Part Association?

  • a 图模型输出的 6 个预测,如何将这 6 个预测按人分为 3 组呢?b、c 展示了两种编码预测点之间关系的方法
  • b 图预测两个节点之间的中间节点,由于其缺少方向,发现还是有可能分组错误 (绿线)
  • c 图预测两个节点之间的局部关联场(PAF),它将整个肢体区域作为支撑域,并同时编码位置和方向信息

OpenPose 的 Multi-Person Parsing using PAFs?

  • OpenPose 输出的 heatmap 分支得到全图的所有关节点预测,PAF 分支得到关节点之间的关系图,连接所有预测关节点,并使用 PAF 输出作为边权重,问题转为找出最大权重的图匹配。其中D 表示预测得到获选关节点,z 表示两个关节点之间的关系,通过 PAF 计算得到

    maxZcEc=maxZcmDj1nDj2Emnzj1j2mn,(12)\max\limits_{\mathcal Z_c}E_c=\max_{\mathcal Z_c}\sum_{m\in\mathcal D_{j_1}}\sum\limits_{n\in\mathcal D_{j_2}}E_{mn}\cdot z_{j_1j_2}^{mn},\quad(12)

  • OpenPose 使用两个简化图匹配问题,一是选用最少的边来或得一个人的骨架,而不是使用完整的图 ©;将匹配问题分解成一组二部匹配的子问题,独立地确定点的匹配 (d)

OpenPose 的损失函数?

  • 训练时,对多个 stage 进行监督,损失函数使用 MSE 计算。以下是某个 stage 的损失,其中 S、L 分别表示打分和 PAFs,w (p)表示二值 mask

    fSt=j=1JpW(p)Sjt(p)Sj(p)22,(3)fLt=c=1CpW(p)Lct(p)Lc(p)22,(4)\begin{array}{rcl}f_{\mathbf{S}}^{t}&=&\sum_{j=1}^{J}\sum_{\mathbf{p}}\mathbf{W}(\mathbf{p})\cdot\|\mathbf{S}_{j}^{t}(\mathbf{p})-\mathbf{S}_{j}^{*}(\mathbf{p})\|_{2}^{2},\quad(3)\\ \\ f_{\mathbf{L}}^{t}&=&\sum_{c=1}^{C}\sum_{\mathbf{p}}\mathbf{W}(\mathbf{p})\cdot\|\mathbf{L}_{c}^{t}(\mathbf{p})-\mathbf{L}_{c}^{*}(\mathbf{p})\|_{2}^{2},\quad(4)\end{array}

  • 对所有 stage 损失汇总,得到总损失

    f=t=1T(fSt+fLt).f=\sum\limits_{t=1}^T(f_\mathbb{S}^t+f_\mathbb{L}^t).

参考:

  1. 2D多人关键点:《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》_paf时间开销_Godswisdom的博客-CSDN博客
  2. OpenPose论文解读——Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(OpenPose学习笔记1) - 知乎
  3. 论文翻译 || openpose – Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields_magic_ll的博客-CSDN博客
  4. 论文学习笔记:OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields_wangyc1208的博客-CSDN博客
  5. [多图/秒懂]白话 OpenPose,最受欢迎的姿态估计网络 - 知乎