【论文笔记-04】Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

【论文链接】https://arxiv.org/pdf/1611.08050.pdf

【Abstract】

本文提出一种有效的检测图像中多人二维姿态的方法。该方法使用一种非参数化表示方法(我们称之为局部关联场(Part Affinity Fields, FAF))来学习身体部位与图像中的个体间的关联关系。该结构对global context(全局上下文)进行编码,自下而上的解析。特点:多人、准确度高、实时。通过序列结构卷积神经网络的两个分支来联合学习:身体结构上的关键点位置、关键点之间的联系。该方法取得了2016年关键点检测挑战赛冠军,准确率与性能都远远超过了MPII基准。

【Introduction】

人体二维姿态估计,即定位人体解剖结构上的关键点的问题。该问题存在的难点主要包含以下三个方面:

  1. 输入图像中,人的数量、位置、尺度,均未知;
  2. 人与人之间的交互行为(接触、遮挡等)会干扰不同个体关键点的联系;
  3. 输入图像中,人数越多,运算需要时间开销越大,增加了实时检测的难度。

【Model】

本文的算法模型如下图所示:输入图像的大小为w\times h,如图(a)所示;作为输出,输出图像包含每个人的解剖关键点的二维位置,如图(e)所示;首先,一个前馈网络同时预测身体part location(关节点或者身体部位,如:肩膀、头、手腕等)一个二维的 confidence maps S集合,如图(b)所示;以及预测part affinities(肢体段,如:大臂,肩膀连接肘部但不包括肩膀和肘部)的一个二维 affinities fields L集合,如图(c)所示;集合S=(S_{1},S_{2},...,S_{J}),一共包括J个confidence map。每个part一个confidence map,这里的S_{j}\in \mathbb{R}^{w\times h},j \in \left \{ 1...J \right \}。集合L=(L_{1},L_{2},...,L_{C}),一共包含C的vector fileds,每个part一个肢体,这里的L_{c}\in \mathbb{R}^{w\times h\times 2},c\in \left \{ 1...C \right \},每一张图片定位在L_{c}处编码成一个二维向量。最后,confidence map和affinity fields 通过贪婪推理进行解析,如下图(d)所示,从而输出图像中所有人的2D关键点。

【Simultaneous Detection and Association】

本文的架构如下图所示:该网络包含两个分支,Branch 1 用于预测 confidence map,Branch 2 用于预测 affinity field;两个分支的网络结构完全相同;Branch 1 与Branch 2的Stage 1 共享输入F;Branch 1 与Branch 2的Stage t (t>=2) 的输入为(F,S^{t-1},L^{t-1}),将Branch 1 的Stage t-1的输出S^{t-1}与Branch 2 的Stage t-1的输出L^{t-1}F一起作为Stage t的输入;损失函数部分以及网络结构细节在后面以问题形式详细表达。

  • F是怎么来的,F的大小又是多少?

F是由VGG19网络的前10层 对输入图像进行特征提取的结果,下面我们先回顾一下VGG19的网络结构。VGG19的前10层结构为:

conv3-64 -> conv3-64 -> maxpool -> conv3-128 -> conv3-128 -> maxpool -> conv3-256 -> conv3-256 -> conv3-256 -> conv3-256 -> maxpool -> conv3-512 -> conv3-512 

VGG19的前10层的特征图大小为:

[-1, 224, 224, 3]   ------>input
[-1, 224, 224, 64]  ------>conv3-64
[-1, 224, 224, 64]  ------>conv3-64
[-1, 112, 112, 64]  ------>maxpool
[-1, 112, 112, 128] ------>conv3-128
[-1, 112, 112, 128] ------>conv3-128
[-1, 56, 56, 128]   ------>maxpool
[-1, 56, 56, 256]   ------>conv3-256
[-1, 56, 56, 256]   ------>conv3-256
[-1, 56, 56, 256]   ------>conv3-256
[-1, 56, 56, 256]   ------>conv3-256
[-1, 28, 28, 256]   ------>maxpool
[-1, 28, 28, 512]   ------>conv3-512
[-1, 28, 28, 512]   ------>conv3-512

OK,到这里,我们是不是已经知道F是怎么来的,以及F的大小呢!但是Paper这里进行降维处理,新增两个卷积操作:

[-1, 28, 28, 256]

[-1, 28, 28, 128]

所以,最终F的大小是28 * 28, 输入的特征图数目为128;

 

  • Stage 1 中Branch 1 和 Branch 2的具体的网络结构是什么样子? 

Stage 1中Branch1 的结构为 :conv3-128 -> conv3-128 -> conv3-128 -> conv1-512 -> conv1-19,输出记为S^{1}=\rho ^{1}(F)

[-1, 28, 28, 128]  ----->F
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 512]  ----->conv1-512
[-1, 28, 28, 19]   ----->conv1-19

Stage 1中Branch2 的结构为 :conv3-128 -> conv3-128 -> conv3-128 -> conv1-512 -> conv1-34 ,输出记为L^{1}=\phi ^{1}(F)

[-1, 28, 28, 128]  ----->F
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 128]  ----->conv3-128
[-1, 28, 28, 512]  ----->conv1-512
[-1, 28, 28, 34]   ----->conv1-34  
  • Stage t (t>=2) 中Branch 1 和 Branch 2的具体的网络结构是什么样子? 

Stage t中Branch1 的结构为 :conv7-128 -> conv7-128 -> conv7-128 -> conv7-128 -> conv7-128 -> conv1-128 -> conv1-19,输出记为S^{t}=\rho ^{t}(F,S^{t-1},L^{t-1})

[-1, 28, 28, 128+19+34]  ----->F+L1+S1
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv1-128
[-1, 28, 28, 19]   ----->conv1-19

Stage t中Branch2 的结构为 :conv7-128 -> conv7-128 -> conv7-128 -> conv7-128 -> conv7-128 -> conv1-128 -> conv1-34,输出记为L^{t}=\phi ^{t}(F,S^{t-1},L^{t-1})

[-1, 28, 28, 128+19+34]  ----->F+L1+S1
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 128]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv7-128
[-1, 28, 28, 512]  ----->conv1-128
[-1, 28, 28, 34]   ----->conv1-34
  • 损失函数

根据上述的网络结构,我们可以知道在每个Stage结束后,branch 1 的输出为 [-1, 28, 28, 19],Branch 2 的输出为[-1, 28, 28, 34]。这篇paper是在每个Stage之后加入了两个损失函数,每一个Branch各有一个损失函数。在第t个Stage后,两个分支的损失函数分别如下:

f_{S}^{t}=\sum_{j=1}^{J}\sum_{p}W(p)\cdot \left \| S_{j}^{t}(p)-S_{j}^{*}(p) \right \|_{2}^{2}

f_{L}^{t}=\sum_{j=1}^{C}\sum_{p}W(p)\cdot \left \| L_{c}^{t}(p)-L_{c}^{*}(p) \right \|_{2}^{2}

其中,S_{j}^{*}是part confidence map的 groundtruth。L_{c}^{*}是part affinity vector field的groundtruth,W是一个二进制mask矩阵,当图像在位置p处缺少标注时候W(p)=0W的作用是避免惩罚在训练过程中的正确的积极预测。通过每一Stage之后的损失函数,达到中间监督的作用,能够定期补充梯度可以有效解决梯度消失的问题,整体的目标损失函数如下:

f=\sum_{t=1}^{T}\ (f_{S}^{t}+f_{L}^{t})

【Confidence Maps for Part Detection】

在上面我们已经分析整体的网络架构,以及每个Stage之后的损失函数。这一节我们主要讲解如何根据有标注的2D关键点生成groundtruth confidence maps S_{j}^{*}。每一confidence maps是对一个特定身体部位出现在每一个像素位置的可信度的2D表示。理论上,如果一个人出现在图像中,只要其相应的部位可见,那么在每一个confidence map中将会有一个峰值出现。如果有多个人出现图像中,那么对于没一个人k的每一个可见部位j都有一个相对应的峰值。

这里,我们首先为每一个个体k产生个体的confidence map S_{j,k}^{*},用x_{j,k} \in \mathbb{R}^{2}表示个体k的身体部位j的真实坐标位置。S_{j,k}^{*}中位置坐标P的像素值为:【其实就是一个二维高斯】

S_{j,k}^{*}=\left ( -\frac{\left \| p-x_{j,k} \right \|_{2}^{2}}{\sigma^2} \right ) 

其中,\sigma控制峰值的传播。groundtruth confidence map 是通过一个最大化操作将各个confidence map聚合在一起:

S_{j}^{*}(p)=\underset{k}{max}S_{j,k}^{*}(p)

这里采用最大化操作,主要是为了保证近峰值处的精确度,如下图所示:

【Part Affinity Fields for Part Association】

给定一个集合的身体部位检测结果(如下图中的红色和蓝色),如何在不知道图像中人数的情况下去整合这检测出来6个关键点从而构成各个人的身体的肢体?首先我们一个confidence measure用于衡量这一对关键点是否属于同一个个体,如下图所示,最左边的人的红色关键点,与其他三个蓝色关键点均存在连接(灰色连接线,我们可以理解为人的肢体段,比如:红色是胳膊肘,蓝色是手,那么连接线自然就是手臂。),那么这三个候选肢体段到底哪一段才是最左边的这个人的。一种可能的解决方案是通过检测一个额外的在肢体上每对部位的中点,并且检查其在候选部位之间的入射角。如下图(b)所示,由于人之间相互之间拥挤在一块,造成引入中点也没法解决错误的关键点之间的联系,图b中就是错误的连接。这些错误的原因是:只编码位置信息,没有方向信息;将一个区域只用一个点去表示;

为了解决这些问题,这篇paper提出一种新的特征表达方式——part affinity fields,既可以保存肢体支持域位置新也可以保留方向信息 ,对于每一个肢体部位的联系是一个2D向量域。

 

考虑下图所示简单肢体情况,X_{j_{1},k} 和 X_{j_{2},k} 表示图像中第k个人肢体段c的关键点j_{1}j_{2}的坐标信息,如果一个点p位于肢体段c上,则L_{c,k}^{*}是一个单位向量,方向为从j_{1}指向j_{2},对于其他店,向量的值为0;

下面我们详细分析在损失函数中,是如何计算f_{L}的,对于图像中某一点p,定义其part affinity vector field如下:

L_{c,k}^{*}=\left\{\begin{matrix} v&if p on limb c,k \\ 0&otherwise. \end{matrix}\right.

其中,v=(x_{j_{2},k} - x_{j_{1},k})/\left \| x_{j_{2},k} - x_{j_{1},k} \right \|_{2} 是一个单位向量,在肢体上的p满足以下约束:

0\leq v\cdot (p-x_{j_{1},k}) \leqslant l_{c,k}      

\left | v_{\perp} \cdot (p-x_{j_{1},k}) \right |\leq \sigma_{l}

其中,\sigma_{l}为肢体的宽度,这里的度量单位是像素,l_{c,k}=\left \| x_{j_{2},k} - x_{j_{1}, k} \right \|_{2}l_{c,k}为肢体段的长度,v_{\perp}v互为垂直向量;

那么,groundtruth part affinity field 是平均了所有图像中个体的affinity field,定义如下:

L_{c}^{*}(p)=\frac{1}{n_{c}(p)}\sum_{k} L_{c,k}^{k}(p)

其中,n_{c}(p)表示所有k个人在p点非0向量的个数。

整个测试期间,我们通过计算对应PAF的沿着坐标的线段的线积分来衡量候选部位检测间联系。也就是,我们测量了预测PAF和通过联系检测的身体部位构成的候选肢体间的一致性。特别的,对于两个候选部位d_{j_{1}}d_{j_{2}},我们从预测部位关联域中采样,L_{c}沿着线段去衡量它们之间的联系的置信度:

E=\int_{u=0}^{u=1}L_{c}(p(u))\cdot \frac{d_{j_{2}}-d_{j_{1}}}{ \left \| d_{j_{2}}-d_{j_{1}} \right \|_{2}}du

其中,p(u)是在两个身体部位d_{j_{1}}d_{j_{2}}间插入的位置:

p(u)=(1-u)d_{j_{1}}+ud_{j_{2}}

实际上,我们通过和求和等间距的u的值来近似积分。

【Multi-Person Parsing using PAFs】 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值