人体姿态估计--OpenPose算法解析

目录

1、人体姿态简介
2、OpenPose论文方案解读
   2.1 文章亮点
   2.2 网络结构
   2.3 loss function
   2.4 计算heatmap(S_j^*(p))与vectormap(L_c^*(p))
   2.5 关节拼接与多人检测(Multi-Person Parsing using PAFs)
3、细节梳理
  3.1 COCO人体姿态数据集的格式
  3.2 为什么heatmap的channels是19,vectormap的channels是38?
  3.3 tf-openpose人体姿态估计标签生成--heatmap--vectormap
  3.4 改进
4、参考资料

1、人体姿态简介

  人体姿态估计是计算机视觉中一个很基础的问题。从名字的角度来看,可以理解为对“人体”的姿态(关键点,比如头,左手,右脚等)的位置估计。
  人体姿态估计可以分为两种思路,
(1)“top-down”,它指先检测人体区域,再检测区域内的人体关键点。

(2)“bottom-up”,它指先检测图片中所有的人体关键点,然后将这些关键点对应到不同的人物个体。这里需要提及一下,第一种方案因为需要对检测出的每个人体区域,分别做前向关键点检测,所以速度较慢,而OpenPose采用的则为第二种方案。

2、OpenPose论文方案解读

2.1 文章亮点

  已有"bottom-up"方法缺点:(1)未利用全局上下文先验信息,也即图片中其他人的身体关键点信息;(2)将关键点对应到不同的人物个体,算法复杂度太高。
  文章改进点:提出“Part Affinity Fields (PAFs)”,每个像素是2D的向量,用于表征位置和方向信息。基于检测出的关节点和关节联通区域,使用greedy inference算法,可以将这些关节点快速对应到不同人物个体。

2.2 网络结构


  整个的技术方案为“two-branch multi-stage CNN”,如图,其中一个分支用于预测打分图confidence maps(S),另外一个分支用于预测Par Affinity Fields(L),也对应着heatmap与vectormap。
其中
S=(S_1,S_2,...,S_j),表示heatmap,j表示要检测的关节数(可能加上background);
L=(L_1,L_2,...,L_C),表示vectormap,C表示要检测的关节对数。
  从图中还可以看出,网络的stage 1接收的输入是特征F,然后经过Branch 1Branch 2网络的处理后分别得到S_1L_1。从stage 2开始,阶段t网络的输入包括三部分: S_{t−1},L_{t−1}, F。每个阶段网络的输入为:
S^t=\rho^t(F,S^{t-1},L^{t-1}), \forall t\ge2 \\ L^t=\phi^t(F,S^{t-1},L^{t-1}), \forall t\ge2下图展示了CNN的两个分支计算的结果:
上图(b)中表示检测到的关节点,一个部位对应了一张feature map,请注意图中高亮像素;
上图(c)中表示检测到的一段躯干,同样的一个躯干对应一个feature map。

2.3 Loss function

  损失函数是保证网络能收敛的最重要的关键点,因此作者对两分支的损失函数均采用L2 loss。训练时,每个阶段都会产生loss,避免梯度消失;预测时只使用最后一层的输出。公式表示如下:
f_S^t=\sum_{j=1}^{J}\sum_{p}W(p)\cdot||S_j^t(p)-S_j^*(p)||_2^2 \\ f_L^t=\sum_{c=1}^{C}\sum_{p}W(p)\cdot||L_c^t(p)-L_c^*(p)||_2^2
其中,S_j^*(p)表示branch1 的label图,也称为heatmap;L_c^*(p)是branch2 的label图,也称为vectormap。另外,考虑到有些训练数据集只标注了图片中部分人物的关节点,因此对损失函数采用了空域加权操作,W表示二值化mask矩阵,当位置p的标签缺失时其值为0,否则值为1。显然,对于未被标记的人物关节点W(p)=0 ,而被标记的人物关节点和非关节点W(p)=1,所以未被标记的人物关节点不会影响模型的学习过程,整个CNN网络架构的优化目标函数如下,
f=\sum_{t=1}{T}(f_S^t+f_L^t)

2.4 计算heatmap(S_j^*(p))与vectormap(L_c^*(p))

  S_j^*(p)实际上就是使用2D高斯分布建模,求出一张图像上身体j部位的heatmap,记第k个人的第j个关节的heatmap为S_{j,k}^*(p)p和x_{j,k}表示位置信息,则有:
\begin{align} S_{j,k}^*(p)&=exp(-\frac{||p-x_{j,k}||_2^2}{\sigma^2}) \\ S_j^*(p)&=\mathop{max}\limits_{k} \ S_{j,k}^*(p) \end{align}
  L_c^*(p)表示了使用part affinity fields(PAF)建模骨骼区域,对于骨骼区域内的每一个像素,使用2D向量同时表征位置和方向信息,这里的方向指代当前骨骼对应的关节点对的连接方向,对应vectormap。以下图的骨骼区域为例

其中,x_{j1,k}x_{j2,k}分别表示关节j_1j_2的位置坐标。k,c分别表示人物索引与关节对索引,则有:
L_{c,k}^*(p)=\begin{cases} v, \quad if \ p \ on\ limb\ c\ ,k \\\\ 0, \quad otherwise \end{cases}其中,v=\frac{(x_{j2,k}-x_{j1,k})}{||x_{j2,k}-x_{j1,k}||_2},表示位置j_1指向位置j_2的单位向量。
图中绿色虚线框内的区域以点集p表示,数学公式如下:
0 \leq v\cdot(p-x_{j1,k}) \leq l_{c,k} \quad and \quad |v\times (p-x_{j1,k})|\ \leq\sigma_l其中,l_{c,k}=||x_{j2,k}-x_{j1,k}||_2表示骨骼长度,\sigma_l表示骨骼的粗细,更多详细的信息可在后文中3.1中得到。

2.5 关节拼接与多人检测(Multi-Person Parsing using PAFs)

  经过上述过程,我们已经得到各个关节点的坐标图--heatmap,与关节对连接的vectormap,现在的问题就是如何合理地在推理阶段将各个关节连接成一段骨骼,并将它们组装成一个人?
  关节拼接:对于任意两个关节点位置d_{j1}d_{j2},通过计算PAFs的线性积分来表征骨骼点对的相关性,也即表征了骨骼点对的置信度,公式表示如下,E=\int_{u=0}^{u=1} L_c(p(u)) \cdot \frac{d_{j2}-d_{j1}}{||d_{j2}-d_{j1}||_2}\mathrm{d}u为了快速计算积分,一般采用均匀采样的方式近似这两个关节点间的相似度,p(u)=(1-u)d_{j1}+ud_{j2}   多人检测:由于图片中人数不确定,同时伴随遮挡、变形等问题,因此只使用上述计算关节对相似度,只能保证局部最优,因此作者利用greedy relaxation的思想生成全局较优的搭配。具体操作如下:
(1)已知不同关节点的heatmap,也就是不同人的某个关节点的点集;
(2)现在要将不同的点集进行唯一匹配,如:一群表示手肘的点集和手腕的点集,两点集中的点必须存在唯一匹配;
(3)关节点之间的相关性PAF已知,将关键点作为图的顶点,将关键点之间的相关性PAF看为图的边权,则将多人检测问题转化为二分图匹配问题,并用匈牙利算法求得相连关键点最优匹配。

二分匹配:二分图上进行匹配,一个点群中的点只与另一个点群中的点进行唯一匹配,即任意两条边没有公共顶点

3、细节梳理

3.1 COCO人体姿态数据集的格式

3.2 为什么heatmap的channels是19,vectormap的channels是38?

  由上图可知,COCO数据集总共有18个关键点,17个肢体骨架,但heatmap多了一个背景图,vectormap多了耳朵和肩膀的肢体,为什末要虚构这麽一个肢体呢,因为有时候人体是背对相机的,眼睛这个关键点是不可见的,为了更好的预测耳朵,引入这两个个肢体(也就是关节对:2-16和5-17)。所以总共有19个肢体,应为vectormap为矢量,预测时分为x,y两个分量,所以有19*2=38

3.3 tf-openpose人体姿态估计标签生成--heatmap--vectormap

  完全参考https://blog.csdn.net/m0_37477175/article/details/81236115,结合2.4节中vectormap(L_c^*(p))的计算公式与绿色虚线框内的区域以点集数学公式理解。
  关键是叉乘的几何意义是两个向量所组成的平行四边形的面积,所以|v\times (p-x_{j1,k})|\leq \sigma_l就表示与向量v平行距离为\sigma_l的区域,也就是骨骼宽度。

3.4 改进

后来论文作者对网络结构进行了改进,使得效果更好,速度更快,参考文献【11】。


4、参考资料

【1】Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
【2】人体姿态估计的过去、现在和未来
【3】论文解读-Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
【4】Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】
【5】知乎:openpose笔记
【6】openpose论文总结:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
【7】详细介绍匈牙利算法步骤
【8】Github 项目 - OpenPose 关键点输出格式
【9】openpose的细节处理
【10】tf-openpose人体姿态估计标签生成--heatmap--vectormap
【11】OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,540评论 1 302
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,539评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,005评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,159评论 0 180
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,946评论 1 258
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,864评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,468评论 2 273
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,218评论 0 167
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,070评论 6 234
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,574评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,353评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,683评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,270评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,168评论 2 214
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,591评论 3 210
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,638评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,035评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,590评论 2 232
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,685评论 2 233

推荐阅读更多精彩内容