OpenPose

摘要

  OpenPose是一个能够实时进行多人姿态识别的模型。其核心贡献在于提出了部位亲和场,该技术不仅编码了肢体支撑区域的位置信息,还编码了肢体的朝向信息,从而有助于连接亲和场两端的关键点以形成肢体。部位亲和场在OpenPose的前向神经网络训练和多人解析过程中发挥着重要作用。前向神经网络是一个具有两个分支、多个阶段的卷积神经网络,能够同时预测部位亲和场和置信图。在网络训练过程中,通过部位亲和场和置信图的真实值与预测值之间的损失监督,该网络能够更准确地预测部位亲和场和置信图。在多人解析过程中,OpenPose将原本K维、NP-Hard的匹配问题转化为每类肢体对应的两个关键点之间的二分最大权重匹配问题,并将任意两个关键点之间的部位亲和场值作为这两个关键点连接构成边的权重。尽管OpenPose在姿势识别方面表现出色,但它仍然面临一些问题,例如在复杂场景或姿态下检测精度会下降,以及计算复杂度较高。

Abstract

  OpenPose is a model capable of real-time multi-person pose recognition. Its core contribution lies in the introduction of the Part Affinity Field (PAF), which not only encodes the positional information of body support areas but also captures the orientation information of the limbs, thus aiding in the connection of keypoints at the two ends of the affinity field to form a body part. The Part Affinity Field plays a crucial role in both the forward neural network training and multi-person parsing processes of OpenPose. The forward neural network is a convolutional neural network with two branches and multiple stages that can simultaneously predict both the part affinity field and confidence maps. During network training, the network is supervised by the loss between the ground truth and predicted values of the part affinity field and confidence maps, which enables it to more accurately predict both the part affinity field and the confidence maps. In the multi-person parsing process, OpenPose transforms the originally K-dimensional, NP-Hard matching problem into a binary maximum weight matching problem between two keypoints of each body part, using the part affinity field values between any two keypoints as the weights of edges connecting those keypoints. Despite its outstanding performance in pose recognition, OpenPose still faces some challenges, such as decreased detection accuracy in complex scenes or poses and high computational complexity.

1. 引言

  推理图片中多个人的姿势是一个挑战,主要体现在以下几个方面:1. 每个图片包含未知数量的人,这些人可能出现在图片的任何位置并且这些人在图片中的尺寸也不一样。2. 人与人之间的交互比如接触、遮挡等都会引起复杂的空间干扰,从而导致部位难以联系到个体。3. 运行时的复杂度往往随着图片中人数的增长而增长,以致于难以进行实时推理。
  之前普遍的方法是运用一个人类检测器,然后对人类侦测器侦测到的结果进行单人姿态估计。这种自顶向下的方法利用现有的技术来进行担任单人姿态估计,但是在流程早期可能遇到一个问题,即在多个人极端靠近的情况下,人类侦测器可能失败,比如错误地将两个人的部分身体视为一个人,漏检部分人物。接着,后续的单人姿态估计会基于错误的人物分割结果,从而导致结果严重不准确。这种早期错误在整个流程中是无法纠正。此外,如果使用该流程进行多人姿态估计,还有一个致命的缺点——图片中人数越多,要进行的单人姿态估计也越多,导致极高的计算复杂度。
  与之相反,自底向上的方法为早期错误提供了健壮性,并且将运行时的复杂度与图像中人的数量解耦。但是之前自底向上的方法不直接使用来自其他身体部位和其他人的全局上下文线索,并且在最终的解析上需要代价昂贵的全局推理。

2. 框架

  OpenPose的运行流程如下:OpenPose将尺寸为 w × h w\times h w×h的彩色图片作为输入,将这张图片送入一个前向神经网络,产生一系列关于身体部位位置的二维置信图的集合 S = { S 1 , S 2 , ⋯   , S J } S=\{S_1, S_2, \cdots, S_J\} S={S1,S2,,SJ}( S j ∈ R w × h , j ∈ { 1 , 2 ⋯   , J } S_j\in \mathbb{R}^{w\times h}, j\in\{1,2\cdots, J\} SjRw×h,j{1,2,J} J J J是部位的个数)和一系列关于部位亲和的二维向量场的集合 L = { L 1 , L 2 , ⋯   , L C } L=\{L_1, L_2, \cdots, L_C\} L={L1,L2,,LC}( L c ∈ R w × h × 2 , c ∈ { 1 , 2 , ⋯   , C } L_c\in \mathbb{R}^{w\times h \times 2}, c\in \{1, 2, \cdots, C\} LcRw×h×2,c{1,2,,C} C C C是肢体的个数,肢体指的是两个部位之间的连线),该二维向量场编码了部位之间的关联程度;通过贪心推理来解析置信图和亲和场,以输出图像中所有人的二维关键点并连接指定关键点来形成肢体。
在这里插入图片描述

2.1 前向神经网络

  这个两分支、多阶段的前向神经网络同时预测置信图和部位亲和场。输入的图片首先经过VGG19的前10层(第3个最大池化层前的10个层)得到一系列特征图 F F F;假设每个阶段 t ∈ { 1 , 2 , ⋯   , T } t\in\{1, 2, \cdots, T\} t{1,2,,T},则 ρ t \rho^t ρt代表 t t t时刻时分支一的卷积神经网络, ψ t \psi^t ψt代表 t t t时刻时分支二的卷积神经网络,那么t时刻时的 S t S^t St L t L^t Lt的公式如下:
S t = { ρ 1 ( F ) , t = 1 ρ t ( F , S t − 1 , L t − 1 ) , t ≥ 2 L t = { ψ 1 ( F ) , t = 1 ψ ( F , S t − 1 , L t − 1 ) , t ≥ 2 F = c a t ( F , S t , L t ) ( 三者在颜色通道上拼接 ) \begin{aligned} &S^t=\left\{\begin{aligned}\quad \quad \rho^1(F)\quad \quad,&t=1\\\rho^t(F,S^{t-1},L^{t-1}),&t\ge 2\end{aligned}\right.\\ &L^t=\left\{\begin{aligned}\quad \quad \psi^1(F)\quad \quad,&t=1\\\psi(F,S^{t-1},L^{t-1}),&t\ge2\end{aligned}\right.\\ &F=cat(F,S^t,L^t)(三者在颜色通道上拼接) \end{aligned} St={ρ1(F),ρt(F,St1,Lt1),t=1t2Lt={ψ1(F),ψ(F,St1,Lt1),t=1t2F=cat(F,St,Lt)(三者在颜色通道上拼接)
在这里插入图片描述
  为了引导网络在第一个分支中迭代预测身体部位的置信图,在第二个分支中预测部位亲和场,因此在每个阶段末尾引入了中间的监督损失, t t t时刻时两个分支内监督损失的公式如下:
f S t = ∑ j = 1 J ∑ p W ( p ) ∥ S j t ( p ) − S j ∗ ( p ) ∥ 2 2 f L t = ∑ c = 1 C ∑ p W ( p ) ∥ L c t ( p ) − L c ∗ ( p ) ∥ 2 2 . \begin{aligned} &f_S^t=\sum_{j=1}^J\sum_{p}W(p)\|S_j^t(p)-S_j^*(p)\|_2^2\\ &f_L^t=\sum_{c=1}^C\sum_{p}W(p)\|L_c^t(p)-L_c^*(p)\|_2^2. \end{aligned} fSt=j=1JpW(p)Sjt(p)Sj(p)22fLt=c=1CpW(p)Lct(p)Lc(p)22.
其中 S j ∗ S_j^* Sj是真实的部位置信图, L c ∗ L_c^* Lc是真实的部位亲和场, W W W是一个二进制掩码,当图像位置 p p p处的注释缺失时为0,否则为1。这个掩码避免对缺失标注部分的惩罚,从而确保网络在训练过程中能够专注于有标注的部分,提高训练的准确性和鲁棒性。整个网络的损失函数如下:
f = ∑ t = 1 T ( f S t + f L t ) . f=\sum_{t=1}^T(f_S^t+f_L^t). f=t=1T(fSt+fLt).

2.2 置信图

  为了在训练过程中计算 f S f_S fS,需要计算从注释的二维关键点上计算真实的置信图 S ∗ S^* S。每个置信图都是特定身体部位出现在每个像素位置的置信度的二维表示图。如果图像中出现单个人,则在对应部位可见的情况下每个置信图中都应存在单个峰;如果图像中存在多个人,则对于每个人 k k k,应该存在对应于每个可见部位 j j j的峰值。
  首先要计算每个人 k k k对应部位 j j j的单人置信图 S j , k ∗ S_{j,k}^* Sj,k。假设 x j , k ∈ R 2 x_{j,k}\in \mathbb{R}^2 xj,kR2是图像中人类 k k k对应身体部位 j j j的真实位置,在 S j , k ∗ S_{j,k}^* Sj,k中位置 p ∈ R 2 p\in \mathbb{R}^2 pR2处的值计算公式如下:
S j , k ∗ ( p ) = exp ⁡ ( − ∥ p − x j , k ∥ 2 2 σ 2 ) . S_{j,k}^*(p)=\exp(-\displaystyle\frac{\|p-x_{j,k}\|_2^2}{\sigma^2}). Sj,k(p)=exp(σ2pxj,k22).
其中 σ \sigma σ控制峰值的传播。对于多人场景,多人置信图的计算公式如下:
S j ∗ ( p ) = max ⁡ k S j , k ∗ ( p ) . S_j^*(p)=\max\limits_kS_{j,k}^*(p). Sj(p)=kmaxSj,k(p).
取最大值操作只是在置信图中保留了最高置信度的位置,而不会改变其他关键点的检测结果,如下图所示。
在这里插入图片描述
  在预测阶段,OpenPose预测置信图,并且通过非最大值抑制来获得身体部位的候选关键点。

2.3 部位亲和场

  通过置信图可以求出身体部位的候选关键点,那么如何在不知道人数的情况下将这些候选关键点组成肢体,并最终形成一个人的全身姿势呢?如下图中(a)所示有2种关键点,这6个关键点如何进行连接以构成肢体?
  一种可能的方法是检测肢体上每对部位之间的中点,并检查这个中点是否属于身体部位,如果属于,则这个中点对应的两个关键点应进行连接以形成肢体。但是当人们拥挤在一起时,这些中点可能会属于身体部位,从而进行了错误的肢体连接,如下图(b)中的绿色线段所示。导致这种错误的原因如下:1. 这种方法只编码了每个肢体的位置,而没有编码每个肢体的朝向。2. 这种方法将肢体的支撑区域减少到单个点。
  为了解决上面出现的问题,论文提出了部位亲和场,它编码了肢体支撑区域的位置和朝向信息,如下图©所示。对于属于特定肢体区域的每个像素,部位亲和场编码了肢体的一个部位到剩下另一个部位的方向。并且每种肢体都有相应的亲和场来连接它关联的两个身体部位。
在这里插入图片描述
  下面从图片中给出的单个肢体来介绍部位亲和场。假设 x j 1 , k x_{j_1, k} xj1,k x j 2 , k x_{j_2,k} xj2,k是图片人类 k k k对应肢体 c c c的两个身体部位 j 1 j_1 j1 j 2 j_2 j2。如果一个点 p p p在这个肢体上,该点处的亲和场值 L c , k ∗ ( p ) L_{c,k}^*(p) Lc,k(p)是一个从 j 1 j_1 j1指向 j 2 j_2 j2的单元向量;如果 p p p是不在肢体上的任意点,则该点处的亲和场值为零向量。在位置 p p p处的亲和场值计算公式如下:
L c , k ∗ = { v , 如果 p 在人类 k 的肢体 c 上 0 , 其他 . L_{c,k}^*=\left\{\begin{aligned}v, &如果p在人类k的肢体c上\\0, &其他.\end{aligned}\right. Lc,k={v,0,如果p在人类k的肢体c其他.
其中 v = x j 2 , k − x j 1 , k ∥ x j 2 , k − x j 1 , k ∥ v=\displaystyle\frac{x_{j_2,k}-x_{j_1,k}}{\|x_{j_2,k}-x_{j_1,k}\|} v=xj2,kxj1,kxj2,kxj1,k,在肢体上的点 p p p满足如下约束条件: 0 ≤ v ⋅ ( p − x j 1 , k ) ≤ l c , k 和 ∣ v ⊥ ⋅ ( p − x j 1 , k ) ∣ ≤ σ l 0\le v·(p-x_{j_1,k})\le l_{c,k}和|v_{\perp}·(p-x_{j_1,k})|\le \sigma_l 0v(pxj1,k)lc,kv(pxj1,k)σl l c , k l_{c,k} lc,k是肢体长度 ∥ x j 2 , k − x j 1 , k ∥ 2 \|x_{j_2,k}-x_{j_1,k}\|_2 xj2,kxj1,k2 σ l \sigma_l σl是肢体宽度, v ⊥ v_{\perp} v是垂直于 v v v的一个向量。
在这里插入图片描述
  对于多人场景,多人部位亲和场的计算公式如下:
L c ∗ ( p ) = 1 n c ( p ) ∑ k L c , k ∗ ( p ) . L_c^*(p)=\frac{1}{n_c(p)}\sum_{k}L_{c,k}^*(p). Lc(p)=nc(p)1kLc,k(p).
其中 n c ( p ) n_c(p) nc(p)是在位置 p p p处所有 L c , k ∗ ( p ) L_{c,k}^*(p) Lc,k(p)中非零向量的个数。
  在预测阶段,通过沿着连接候选部位的线段计算对应部位亲和场的积分来测量候选部位之间的关联,假设两个候选部位 d j 1 d_{j_1} dj1 d j 2 d_{j_2} dj2,公式如下:
E = ∫ u = 0 u = 1 L c ( p ( u ) ) ⋅ d j 2 − d j 1 ∥ d j 2 − d j 1 ∥ 2 d u . E=\displaystyle\int_{u=0}^{u=1}L_c(p(u))·\frac{d_{j_2}-d_{j_1}}{\|d_{j_2}-d_{j_1}\|_2}du. E=u=0u=1Lc(p(u))dj2dj12dj2dj1du.
其中 p ( u ) = ( 1 − u ) d j 1 + u d j 2 p(u)=(1-u)d_{j_1}+ud_{j_2} p(u)=(1u)dj1+udj2。在实践中,通过采样求和均匀间隔的 u u u值来近似积分。

2.4 多人解析

  上面提出的部位亲和场只是测量了两个候选部位之间的联系分数,并没有给出解决多个候选部位之间如何连接以形成肢体的问题。这些候选部位定义了一系列可能的肢体,通过上面部位亲和场的积分公式可能得到每个候选肢体的得分。在这些候选肢体中找到最佳解析的问题对应于已知为NP-Hard的K维匹配问题,如下图(c)所示。
在这里插入图片描述
  假设 D J = { d j m : f o r j ∈ { 1 , 2 , ⋯   , J } , m ∈ { 1 , 2 , ⋯   , N j } D_J=\{d_j^m : for j\in \{1, 2, \cdots, J\}, m\in \{1,2, \cdots, N_j\} DJ={djm:forj{1,2,,J},m{1,2,,Nj},其中 N j N_j Nj是部位 j j j的候选数量, d j m ∈ R 2 d_j^m\in \mathbb{R}^2 djmR2是部位 j j j的第 m m m个候选关键点的位置,目标是要将这些候选部位与来自同一个人的其他部位进行联系。定义 z j 1 j 2 m n ∈ { 0 , 1 } z_{j_1j_2}^{mn}\in\{0, 1\} zj1j2mn{0,1}判断两个候选部位 d j 1 m d_{j_1}^m dj1m d j 2 n d_{j_2}^n dj2n是否应进行连接以构成肢体,上述目标可以转换为从一系列可能的连接中找到最优安排 Z = { z j 1 j 2 m n : f o r   j 1 , j 2 ∈ { 1 , 2 , ⋯   , J } , m ∈ { 1 , 2 , ⋯   , N j 1 } , n ∈ { 1 , 2 , ⋯   , N j 2 } } Z=\{z_{j_1j_2}^{mn} : for \ j_1, j_2 \in \{1, 2, \cdots, J\}, m\in \{1, 2, \cdots, N_{j_1}\}, n\in\{1, 2, \cdots, N_{j_2}\}\} Z={zj1j2mn:for j1,j2{1,2,,J},m{1,2,,Nj1},n{1,2,,Nj2}}
  如果考虑一对对应于第 c c c种肢体的部位 j 1 j_1 j1 j 2 j_2 j2,那么找到最佳关联的问题就简化为最大权重二分图匹配问题。在这个图匹配问题中,图的节点是候选部位集合 D j 1 D_{j_1} Dj1 D j 2 D_{j_2} Dj2,而边是这两个候选部位集合之间所有可能的连接,并且边的权重由上面部位亲和场的积分公式给出。二分图中的匹配是以没有两条边共享一个节点的方式选择的边的集合,因此目标转换为对于所有需要进行肢体连接的两个候选关键点构成的二分图找到一个匹配中边权重最大的匹配。
  该问题可以由以下约束解出:
max ⁡ Z c E c = max ⁡ Z c ∑ m ∈ D j 1 ∑ n ∈ D j 2 E m n z j 1 j 2 m n s . t . ∀ m ∈ D j 1 , ∑ n ∈ D j 2 z j 1 j 2 m n ≤ 1    ∀ n ∈ D j 2 , ∑ m ∈ D j 1 z j 1 j 2 m n ≤ 1. \begin{aligned} &\max\limits_{Z_c}E_c=\max\limits_{Z_c}\sum_{m\in D_{j_1}}\sum_{n\in D_{j_2}}E_{mn}z_{j_1j_2}^{mn}\\ &s.t. \quad \forall m\in D_{j_1}, \sum_{n\in D_{j_2}}z_{j_1j_2}^{mn}\le1\\ &\quad \quad \ \ \forall n\in D_{j_2},\sum_{m\in D_{j_1}}z_{j_1j_2}^{mn}\le 1. \end{aligned} ZcmaxEc=ZcmaxmDj1nDj2Emnzj1j2mns.t.mDj1,nDj2zj1j2mn1  nDj2,mDj1zj1j2mn1.
其中 E c E_c Ec是肢体 c c c所有匹配的权重总和, Z c Z_c Zc Z Z Z关于肢体 c c c的子集, E m n E_{mn} Emn是由上面部位亲和场积分公式计算出的关于部位 d j 1 m d_{j_1}^m dj1m d j 2 n d_{j_2}^n dj2n的部位亲和场值,两个约束确保没有两条边共享一个节点。可以使用Hungarian算法来获得这个匹配的结果。
  对于寻找多人的整个姿势来说,决定 Z Z Z是一个K维的匹配问题,并且是NP-Hard的,因此论文添加了两个非约束条件:1. 选择最小数量的边来获得人类姿势的生成树骨架,而不是使用完整的图,如上图中(c)所示。2. 将匹配问题进一步分解为一系列匹配的子问题,并独立确定相邻树节点中的匹配,如上图中(d)所示。在这两个非约束条件的帮助下,这个优化问题可以转换为如下问题:
max ⁡ Z E = ∑ c = 1 C max ⁡ Z c E c max ⁡ Z c E c = max ⁡ Z c ∑ m ∈ D j 1 ∑ n ∈ D j 2 E m n z j 1 j 2 m n s . t . ∀ m ∈ D j 1 , ∑ n ∈ D j 2 z j 1 j 2 m n ≤ 1    ∀ n ∈ D j 2 , ∑ m ∈ D j 1 z j 1 j 2 m n ≤ 1. \begin{aligned} &\max\limits_ZE=\sum_{c=1}^C\max\limits_{Z_c}E_c\\ &\max\limits_{Z_c}E_c=\max\limits_{Z_c}\sum_{m\in D_{j_1}}\sum_{n\in D_{j_2}}E_{mn}z_{j_1j_2}^{mn}\\ &s.t. \quad \forall m\in D_{j_1}, \sum_{n\in D_{j_2}}z_{j_1j_2}^{mn}\le1\\ &\quad \quad \ \ \forall n\in D_{j_2},\sum_{m\in D_{j_1}}z_{j_1j_2}^{mn}\le 1. \end{aligned} ZmaxE=c=1CZcmaxEcZcmaxEc=ZcmaxmDj1nDj2Emnzj1j2mns.t.mDj1,nDj2zj1j2mn1  nDj2,mDj1zj1j2mn1.

3. 创新点和不足

3.1 创新点

  OpenPose可以实时地检测图像中的多个人体姿态,而无需事先确定每个人的身份或位置;OpenPose采用Bottom-up的方法,即先检测图像中所有的肢体关键点,然后再进行组装。这种方法虽然对肢体关节的再组装有一定难度,但整体效率较高,处理时间不会随着图像中人体数量的增加而显著增加;通过PAFs算法和CNN架构的结合,OpenPose能够准确地预测出人体各部位的位置和连接关系。

3.2 不足

  OpenPose的检测精度可能会因人体姿态的不同而有所变化。在一些复杂的姿态下,检测精度可能会下降;OpenPose对于复杂场景的适应性不如AlphaPose,如人体遮挡、光照变化等情况下,估计精度会有所下降;OpenPose需要较高的计算能力和显存,对于一些低端设备来说,可能无法运行。

参考

Zhe Cao, Tomas Simon, Shih-En Wei, and et al. Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields.
代码来源:https://github.com/donnyyou/torchcv

总结

  OpenPose的运行流程如下:OpenPose将尺寸为 w × h w\times h w×h的彩色图片作为输入,将这张图片送入一个前向神经网络,产生一系列关于身体部位位置的二维置信图的集合 S = { S 1 , S 2 , ⋯   , S J } S=\{S_1, S_2, \cdots, S_J\} S={S1,S2,,SJ}( S j ∈ R w × h , j ∈ { 1 , 2 ⋯   , J } S_j\in \mathbb{R}^{w\times h}, j\in\{1,2\cdots, J\} SjRw×h,j{1,2,J} J J J是部位的个数)和一系列关于部位亲和的二维向量场的集合 L = { L 1 , L 2 , ⋯   , L C } L=\{L_1, L_2, \cdots, L_C\} L={L1,L2,,LC}( L c ∈ R w × h × 2 , c ∈ { 1 , 2 , ⋯   , C } L_c\in \mathbb{R}^{w\times h \times 2}, c\in \{1, 2, \cdots, C\} LcRw×h×2,c{1,2,,C} C C C是肢体的个数,肢体指的是两个部位之间的连线),该二维向量场编码了部位之间的关联程度;通过贪心推理来解析置信图和亲和场,以输出图像中所有人的二维关键点并连接指定关键点来形成肢体。尽管OpenPose在姿态识别上效果不错,但它仍然面临以下的缺点:在复杂场景或者姿态的情况下检测精度会下降以及计算复杂度高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值