【极简笔记】OpenPose

【极简笔记】Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

论文地址:https://arxiv.org/abs/1611.08050

文章的核心是提出一种利用Part Affinity Fields(PAFs)的自下而上的人体姿态估计算法。研究自下而上算法(得到关键点位置再获得骨架)而不是自上而下算法(先检测人,再回归关键点),是因为后者运算时间会随着图像中人的个数而显著增加,而自下而上所需计算时间基本不变。
【极简笔记】OpenPose_第1张图片
PAFs是用来描述像素点在骨架中的走向,用L(p)表示;关键点的响应用S(p)表示。先看主体网络结构,网络采用VGG pre-train network作为骨架,有两个分支分别回归L(p)和S(p)。每一个stage算一次loss,之后把L和S以及原始输入concatenate,继续下一个stage的训练。随着迭代次数的增加,S能够一定程度上区分结构的左右。loss用的 L2 L 2 范数,S和L的ground-truth需要从标注的关键点生成,如果某个关键点在标注中有缺失则不计算该点。
【极简笔记】OpenPose_第2张图片
对于S,每一类关键点有一个channel,生成ground-truth的时候是按照多个高斯分布取max的方法来保留各个点的响应峰值。对于L 则复杂一点,先看准确定义,对于第k个person的第c个肢干上的PAFs:

Lc,k(p)={v0if p on limb c,kotherwise L c , k ∗ ( p ) = { v if p on limb c,k 0 otherwise

v=(xj2,kxj1,k)/||xj2,kxj1,k||2 v = ( x j 2 , k − x j 1 , k ) / | | x j 2 , k − x j 1 , k | | 2

xj,k x j , k 表示第k个person第j 个关键点的位置。而像素点p是否落在limb(肢干)则设了一个阈值范围
【极简笔记】OpenPose_第3张图片

0v(pxj1,k)lc,kand|v(pxj1,k)|σl 0 ≤ v ⋅ ( p − x j 1 , k ) ≤ l c , k and | v ⊥ ⋅ ( p − x j 1 , k ) | ≤ σ l

其中 lc,k l c , k σl σ l 分别表示limb长度和宽度。最后也会对所有person相同类别肢干进行平均,使得L的输出的channel与肢干种数相等:
Lc(p)=1nc(p)kLc,k(p) L c ∗ ( p ) = 1 n c ( p ) ∑ k L c , k ∗ ( p )

知道PAFs和关键点位置 dj d j 之后,需要评估这俩关键点的相关性。文章中就是算了一下这两个关键点连线上各像素点PAF向量与连线向量的点积的积分:
E=u=1u=0Lc(p(u))dj2dj1||dj2dj1||2du E = ∫ u = 0 u = 1 L c ( p ( u ) ) ⋅ d j 2 − d j 1 | | d j 2 − d j 1 | | 2 d u

p(u)=(1u)dj1+udj2 p ( u ) = ( 1 − u ) d j 1 + u d j 2

在得到关键节点以及边权之后,计算姿态骨架已经完全转化成了一个图问题。文中没有采用全局优化的方法,而是利用匈牙利算法对相邻节点进行了最优匹配(比如一堆左手腕节点和一堆左手肘节点,利用小臂的PAF计算边权,再进行最优匹配),最后获得整个的人形姿态骨架。

实验效果也非常好,主要是速度快。附带代码地址https://github.com/CMU-Perceptual-Computing-Lab/openpose
【极简笔记】OpenPose_第4张图片

你可能感兴趣的:(极简笔记)