OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation
paper: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
link: OpenPose paper
code: https://github.com/CMU-Perceptual-Computing-Lab/openpose
人体姿态估计知识点补充
人体姿态的研究是从openpose开始的,需要补充一点姿态估计的相关知识点:
- AI识别人的五个状态: 图像中是否有人,人在哪里,人是谁,人处于什么状态,人在做什么;
- 姿态估计: 通过将人体肢体关节联系起来进行人体姿态估计,通过姿态估计可以判断人的状态和行为;
摘要
- 本文提出一种实时检测多人2D姿态的方法;
- 采用非参数表征方法 Part Affinity Fields(PAFs 部分亲和度向量场),去学习将身体部位和对应个体关联;
- 提出组合检测器可以减少推理时间,推出OpenPose,多人2D姿态检测开源实时系统,包括身体,脚部,手部和面部关键点的检测;
引言
- 常用的姿态估计的方法:行人检测 + 担任姿态估计(自上而下的方法),缺点:姿态估计受到行人检测的影响,运行时间和人数成比例;
- 自下而上的方法在前期的鲁棒性更稳健,还可能将运行时复杂性和图像中的人数进行分离;
- 本文提出多人姿态估计方法:通过PAFs来表征第一个自下而上的特征表示,PAFs是2D适量场用于编码肢体在图像域的位置和方向;
- 本文证明同时计算自下而上的检测和关联编码,能够为后续的解析过程提供足够的全局上下文,同时做到小部分计算成本和高质量结果;
本文方法
- 图2是本文方法整体的pipeline:
- 输入 w × h w \times h w×h图像a,为每一个人产生2D关键点定位e;
- 实现CNN预测一组身体部位的2D置信图b S S S,和一组2D PAFs L L L对部位之间的联系进行编码图c;
- 集合 S = ( S 1 , S 2 , … , S J ) \mathbf{S}=\left(\mathbf{S}_{1}, \mathbf{S}_{2}, \ldots, \mathbf{S}_{J}\right) S=(S1,S2,…,SJ)有 J J J个置信图,每个部分一置信图,其中 S j ∈ R w × h , j ∈ { 1 … J } \mathbf{S}_{j} \in \mathbb{R}^{w \times h}, j \in\{1 \ldots J\} Sj∈Rw×h,j∈{1…J};
- 集合 L = ( L 1 , L 2 , … , L C ) \mathbf{L}=\left(\mathbf{L}_{1}, \mathbf{L}_{2}, \dots, \mathbf{L}_{C}\right) L=(L1,L2,…,LC)有 C C C个矢量场,每个肢体一矢量场,其中 L c ∈ R w × h × 2 , c ∈ { 1 … C } \mathbf{L}_{c} \in \mathbb{R}^{w \times h \times 2}, c \in\{1 \ldots C\} Lc∈Rw×h×2,c∈{1…C}
- 图像位置 L C L_{C} LC是一个编码后的2D vector如图一所示(目前到这里对网络的输出信息理解还是不清晰…看之后的详细理解了),最后通过贪心推理解析置信图和PAF输出所有人的2D关键点;
- 总结一下整体流程: a输入图像,b预测关键点置信度&c关键点亲和度向量,关键点解析,人体骨骼搭建(连接关键点)
Simultaneous Detection and Association
- 从上图3可知,网络的backbone F F F为VGG19的前10层,然后再将网络分为两个分支米色部分和蓝色部分,分别预测每个点的关键点置信度和亲和度向量,每个分支都是一个迭代预测架构;
- 首先由VGG19生成一组特征 F F F,作为每个分支第一阶段的输入;
- 第一阶段网络产生一组检测置信度图 S 1 = ρ 1 ( F ) \mathbf{S}^{1}=\rho^{1}(\mathbf{F}) S1=ρ1(F),和一组亲和度向量 L 1 = ϕ 1 ( F ) \mathbf{L}^{1}=\phi^{1}(\mathbf{F}) L1=ϕ1(F), 其中 ρ 1 \rho^{1} ρ1和 ϕ 1 \phi^{1} ϕ1第一阶段inference的CNN结构,之后的每一个阶段的输入都来自前一个阶段的预测结果和原始图像特征 F F F,用以产生更精确的预测结果;
- ρ t \rho^{t} ρt和 ϕ t \phi^{t} ϕt代表第t阶段的CNN结构: 其输出为 S t = ρ t ( F , S t − 1 , L t − 1 ) , ∀ t ≥ 2 \mathbf{S}^{t}=\rho^{t}\left(\mathbf{F}, \mathbf{S}^{t-1}, \mathbf{L}^{t-1}\right), \forall t \geq 2 St=ρt(F,St−1,Lt−1),∀t≥2和 L t = ϕ t ( F , S t − 1 , L t − 1 ) , ∀ t ≥ 2 \mathbf{L}^{t}=\phi^{t}\left(\mathbf{F}, \mathbf{S}^{t-1}, \mathbf{L}^{t-1}\right), \forall t \geq 2 Lt=ϕt(F,St−1,Lt−1),∀t≥2
- 上图4可以看出前期身体左右部分和四肢之间会比较混乱,但是通过后期各stage的迭代推理后,预测结果越来越精确;
- 每个阶段 t t t对应两个损失函数 f S t = ∑ i = 1 J ∑ P W ( p ) ⋅ ∥ S j t ( p ) − S j ∗ ( p ) ∥ 2 2 f_{\mathrm{S}}^{t}=\sum_{i=1}^{J} \sum_{\mathrm{P}} \mathbf{W}(\mathbf{p}) \cdot\left\|\mathbf{S}_{j}^{t}(\mathbf{p})-\mathbf{S}_{j}^{*}(\mathbf{p})\right\|_{2}^{2} fSt=∑i=1J∑PW(p)⋅∥∥Sjt(p)−Sj∗(p)∥∥22和 f L t = ∑ c = 1 C ∑ p W ( p ) ⋅ ∥ L c t ( p ) − L c ∗ ( p ) ∥ 2 2 f_{\mathrm{L}}^{t}=\sum_{c=1}^{C} \sum_{\mathbf{p}} \mathbf{W}(\mathbf{p}) \cdot\left\|\mathbf{L}_{c}^{t}(\mathbf{p})-\mathbf{L}_{c}^{*}(\mathbf{p})\right\|_{2}^{2} fLt=∑c=1C∑pW(p)⋅∥Lct(p)−Lc∗(p)∥22代表预测值和GT值的L2损失,其中 S j ∗ \mathbf{S}_{j}^{*} Sj∗代表真实的置信图, L c ∗ \mathbf{L}_{c}^{*} Lc∗代表真实的身体关节联系向量,损失函数整体为 f = ∑ t = 1 T ( f S t + f L t ) f=\sum_{t=1}^{T}\left(f_{\mathrm{S}}^{t}+f_{\mathrm{L}}^{t}\right) f=∑t=1T(fSt+fLt), j j j代表关键点, c c c代表肢体,一个肢体对应两个关键点
Confidence Maps for Part Detection
- 为了在训练阶段评估 f S f_{S} fS,根据标注了2D的关键点的图生成GT置信图,每一个置信图表示身体的一个特定的部位在图像上某点发生的可能性,如果图像只有一个人每个置信图理论上只有一个峰值当图像中有多人时,对应每一个人 k k k都对应一个可见的身体部位 j j j的峰值;
- 首先对每一个人 k k k生成个人的所有置信图 S j , k ∗ \mathbf{S}_{j, k}^{*} Sj,k∗, x j , k ∈ R 2 \mathbf{x}_{j, k} \in \mathbb{R}^{2} xj,k∈R2代表第 k k k个人身体部位j对应的GT位置,在 p p p点的值被定义为 S j , k ∗ ( p ) = exp ( − ∥ p − x j , k ∥ 2 2 σ 2 ) \mathbf{S}_{j, k}^{*}(\mathbf{p})=\exp \left(-\frac{\left\|\mathbf{p}-\mathbf{x}_{j, k}\right\|_{2}^{2}}{\sigma^{2}}\right) Sj,k∗(p)=exp(−σ2∥p−xj,k∥22),其中 σ \sigma σ用于控制峰值的范围;
- 网络在位置 P P P的预测值对应的GT值计算是如上图所示是取最大值 S j ∗ ( p ) = max k S j , k ∗ ( p ) \mathbf{S}_{j}^{*}(\mathbf{p})=\max _{k} \mathbf{S}_{j, k}^{*}(\mathbf{p}) Sj∗(p)=maxkSj,k∗(p),NMS思想,在预测阶段网络通过NMS获得最终的置信度;
Part Affinity Fields for Part Association
- 这小节解决了一个很重要的问题,在学习姿态估计论文之前可能会想到,人体的关键点检测出来后该怎么样建立彼此之间正确的联系呢,尤其是在多人姿态估计的时候,上图5a是关键点之间可能存在的关系,图b代表检测每对身体部分之前的肢体中间点但是缺点是只编码了点的位置信息缺少方向信息,同时它将肢体的支撑区域缩小到了一个点;
- 本文提出PAFs部分亲和场同时保持肢体区域之间的位置信息和方向信息,图c代表PAF是身体每个肢体的2D向量,图1d所示对于属于特定肢体的像素,2D向量编码了从肢体一个部分指向另一个部分的方向,每种类型的肢体都有连接其两个关联部位对应的亲和场;
- 通过一个简单的例子来分析这部分的内容, x j 1 , k and x j 2 , k \mathbf{x}_{j_{1}, k} \text { and } \mathbf{x}_{j 2}, k xj1,k and xj2,k分别代表 k k k的肢体 c c c两个对应的身体部位 j 1 a n d j 2 j_{1} and j_{2} j1andj2的GT位置,如果点 p p p落在了肢体 c c c上, L c , k ∗ ( p ) \mathbf{L}_{c, k}^{*}(\mathbf{p}) Lc,k∗(p)的值为 j 1 j_{1} j1指向 j 2 j_{2} j2的单位向量,不在这个肢体上的点值为0;
- 为了在训练阶段评估 f L f_{L} fL,定义PAF在点 p p p的GT值为: L c , k ∗ ( p ) = { v if p on limb c , k 0 otherwise \mathbf{L}_{c, k}^{*}(\mathbf{p})=\left\{\begin{array}{ll}{\mathbf{v}} & {\text { if } \mathbf{p} \text { on limb } c, k} \\ {\mathbf{0}} & {\text { otherwise }}\end{array}\right. Lc,k∗(p)={v0 if p on limb c,k otherwise ,其中 v = ( x j 2 , k − x j 1 , k ) / ∥ x j 2 , k − x j 1 , k ∥ 2 \mathbf{v}=\left(\mathbf{x}_{j_{2}, k}-\mathbf{x}_{j_{1}, k}\right) /\left\|\mathbf{x}_{j_{2}, k}-\mathbf{x}_{j_{1}, k}\right\|_{2} v=(xj2,k−xj1,k)/∥xj2,k−xj1,k∥2代表肢体方向的单位向量;
- 在 0 ≤ v ⋅ ( p − x j 1 , k ) ≤ l c , k and ∣ v ⊥ ⋅ ( p − x j 1 , k ) ∣ ≤ σ l 0 \leq \mathbf{v} \cdot\left(\mathbf{p}-\mathbf{x}_{j_{1}, k}\right) \leq l_{c, k} \text { and }\left|\mathbf{v}_{\perp} \cdot\left(\mathbf{p}-\mathbf{x}_{j_{1}, k}\right)\right| \leq \sigma_{l} 0≤v⋅(p−xj1,k)≤lc,k and ∣v⊥⋅(p−xj1,k)∣≤σl范围内的点 p p p被定义为在肢体 c c c上,其中 σ l \sigma_{l} σl代表肢体的宽度, l c , k = ∥ x j 2 , k − x j 1 , k ∥ 2 l_{c, k}=\left\|\mathbf{x}_{j_{2}, k}-\mathbf{x}_{j_{1}, k}\right\|_{2} lc,k=∥xj2,k−xj1,k∥2代表肢体的长度;
- 点 p p p的部分亲和力场GT值为所有人在此点上PAF平均值: L c ∗ ( p ) = 1 n c ( p ) ∑ k L c , k ∗ ( p ) \mathbf{L}_{c}^{*}(\mathbf{p})=\frac{1}{n_{c}(\mathbf{p})} \sum_{k} \mathbf{L}_{c, k}^{*}(\mathbf{p}) Lc∗(p)=nc(p)1∑kLc,k∗(p),其中 n c ( p ) n_{c}(p) nc(p)代表非零向量的个数;
- 在预测阶段,对于两个候选的部位点 d j 1 d_{j1} dj1和 d j 2 d_{j2} dj2,我们沿着线段采样预测得到的PAF L c L_{c} Lc,以测量两个部分之间的关联置信度, 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=\int_{u=0}^{u=1} \mathbf{L}_{c}(\mathbf{p}(u)) \cdot \frac{\mathbf{d}_{j_{2}}-\mathbf{d}_{j_{1}}}{\left\|\mathbf{d}_{j_{2}}-\mathbf{d}_{j_{1}}\right\|_{2}} du E=∫u=0u=1Lc(p(u))⋅∥dj2−dj1∥2dj2−dj1du,其中 p ( u ) p(u) p(u)代表两个身体部位之间的位置: p ( u ) = ( 1 − u ) d j 1 + u d j 2 \mathbf{p}(u)=(1-u) \mathbf{d}_{j_{1}}+u \mathbf{d}_{j_{2}} p(u)=(1−u)dj1+udj2,实际预测时对u区间进行均匀间隔采样求和来求解近似的积分值;
Multi-Person Parsing using PAFs
- 对预测的置信度图进行nms操作后可以得到一组离散的候选身体部位,对于每一个部位存在多个候选,因为图像上有多个人或者存在FP的情况,从这些候选部位可以定义一个很大的可能肢体集合,通过上面的积分公式计算每一个候选肢体的分数;
- 本文提出greedy relaxation方法来产生高质量的匹配:
- 首先根据预测置信图的得到离散的候选部位: D J = { d j m : j ∈ { 1 … J } , m ∈ { 1 … N j } } \mathcal{D}_{\mathcal{J}}=\left\{\mathbf{d}_{j}^{m} : j \in\{1 \ldots J\}, m \in\left\{1 \ldots N_{j}\right\}\right\} DJ={djm:j∈{1…J},m∈{1…Nj}},其中 d j m d_{j}^{m} djm代表第 j j j类身体部位的第 m m m个关键点的位置;
- 我们的匹配目标是要求候选部位和同一个人的其他候选部位建立连接,定义变量 z j 1 j 2 m n ∈ { 0 , 1 } z_{j_{1} j_{2}}^{m n} \in\{0,1\} zj1j2mn∈{0,1}用来表示两个候选部位 d j 1 m and d j 2 n \mathbf{d}_{j_{1}}^{m} \text { and } \mathbf{d}_{j_{2}}^{n} dj1m and dj2n之间是否有连接,所有候选部位的连线集合为 Z = { z j 1 j 2 m n : for j 1 , j 2 ∈ { 1 … J } , m ∈ { 1 … N j 1 } , n ∈ { 1 … N j 2 } } \mathcal{Z}=\left\{z_{j_{1} j_{2}}^{m n} : \text { for } j_{1}, j_{2} \in\{1 \ldots J\}, m \in\left\{1 \ldots N_{j_{1}}\right\}, n \in\left\{1 \ldots N_{j_{2}}\right\}\right\} Z={zj1j2mn: for j1,j2∈{1…J},m∈{1…Nj1},n∈{1…Nj2}}
- 单独考虑肢体 c c c所有对应的两个身体部位 j 1 j_{1} j1和 j 2 j_{2} j2,目的是找到总亲和值最高的图匹配方式,定义总亲和值为: 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 \max _{\mathcal{Z}_{c}} E_{c}=\max _{\mathcal{Z}_{c}} \sum_{m \in \mathcal{D}_{j_{1}}} \sum_{n \in \mathcal{D}_{j_{2}}} E_{m n} \cdot z_{j_{1} j_{2}}^{m n} maxZcEc=maxZc∑m∈Dj1∑n∈Dj2Emn⋅zj1j2mn,其中 ∀ 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{array}{c}{\forall m \in \mathcal{D}_{j_{1}}, \sum_{n \in \mathcal{D}_{j_{2}}} z_{j_{1} j_{2}}^{m n} \leq 1} \\ {\forall n \in \mathcal{D}_{j_{2}}, \sum_{m \in \mathcal{D}_{j_{1}}} z_{j_{1} j_{2}}^{m n} \leq 1}\end{array} ∀m∈Dj1,∑n∈Dj2zj1j2mn≤1∀n∈Dj2,∑m∈Dj1zj1j2mn≤1, E m n E_{mn} Emn代表 d j 1 m d_{j1}^{m} dj1m和 d j 2 n d_{j2}^{n} dj2n之间的亲和度,注意:同类型的两个肢体没有公共点,匈牙利算法寻找最优匹配
- 当考虑到多人的全身姿态估计时,就是一个 K K K分图匹配问题,可以简化优化为 max Z E = ∑ c = 1 C max Z c E c \max _{\mathcal{Z}} E=\sum_{c=1}^{C} \max _{\mathcal{Z}_{c}} E_{c} maxZE=∑c=1CmaxZcEc,人体各肢体独立优化配对,然后将享有相同身体部分的链接组装成人体的全身姿态;
实验结果
- openpose的实验结果就不在此进行分析,感兴趣的同学可以去论文里面看看,这里列一下COCO关键点检测的结果
总结
- 姿态估计的意义:让机器能够理解图像中人的行为,让机器具有感知个人的行为的能力;
- 本文为解决2D图像中多人的姿态估计问题,提出一个非参数的通过编码人体四肢的位置和方向的关键点连接方法并设计了一个可以同时学习身体部位位置和联系的架构,并用高效率高质量的方法产生人体姿态检测的结果,最重要的是随着图像中人数的增加依然能保持算法的优势;