Summary——CrowdPose: Efficient Crowded Scenes Pose Estimation and A New Benchmark

本文采用多人姿态估计中的两步框架:检测人体——估计单人姿态

思路很直接,检测照片上所有人,把他们都框出来,每个人体检测框结果叫human proposal,然后分别在检测框里找到关节点,连接关节点。

但是实际操作会遇到很多问题。

主要问题是,算法对第一步依赖强烈,即,依赖于人体检测结果。如果人体检测不理想,单人姿态估计也会受到影响。

那么检测的human proposal会出现什么问题呢?比如说,人体检测本身不准确,一个完全的人,检测框里只有上半身,这是检测误差问题,该问题还表现在,拥挤的人物图片上,human proposal很难只包括一个人,检测框难免还会有别人的胳膊腿,比如说像下图这样子,看着都乱:

这时检测出来的胳膊腿关节点分配给谁?

在单人关节检测,往常的方法就是用一个SPPE(single person pose estimation)网络,大部分文章也是对这个单人姿态估计做一些修改。比如上交的RMPE,感兴趣的可以看这里,Summary——RMPE: Regional Multi-Person Pose Estimation。他们就是对SPPE做了改进,改成了SSTN,在单人姿态估计网络中加入了对称变换:

针对检测框误差问题,把检测框做了裁剪,把多出来的胳膊腿剪掉不就完了?就像下面这样,把左边的检测框多的人剪掉,(其实这里做的是坐标变换,可以放大缩小的,但是针对拥挤人群图片姑且看做是裁剪好了)剪成右图的样子,减少他人关节的影响:


但是不管怎么剪,你也不可能贴着人物轮廓剪,尤其是人群更拥挤的情况,很多照片,有人头挡着别人的胳膊肘,有人腿踢别人的波棱盖,剪是剪不清楚的。该问题在RMPE那里没有得到很好的答案,留给了本文来解决。

 

而另一个大问题是检测框冗余问题,常用算法是NMS。在人体检测的时候,同一个人,可以有多个human proposal,而每个human proposal都检测一个骨骼(关节点连线,就叫骨骼好了),那么一个人就会检测出来好几个骨骼。

NMS就是用来解决这个问题的,它通过一系列迭代,消除冗余的检测框,这样一个人就只有一个骨骼了,完美؏؏☝ᖗ乛◡乛ᖘ☝؏؏,对这个算法不了解的可以看Summary——RMPE: Regional Multi-Person Pose Estimation RMPE仍沿用这一算法,只是稍作修改,使得参数不再是人工设定,而是学习出来的了。

 

而本文则完全摈弃了上述算法,使用了别的的思路,下面看看他是怎么做的。

首先输入一张多人物图片,进入第一阶段,检测出图片上所有人物,用检测框框起来。

带着得到的检测框进入第二阶段:单人关节点检测,仍然是对SPPE(single person pose estimation)网络做修改,改为joint-candidate SPPE。

将第i个human proposal的区域R_{i}输入进SPPE网络,得到相应的热图P_{i}

在区域R_{i}上检测出的关节点要么是第i个人的,要么不是第i个人的,分别将它们命名为目标关节点(target joints)和干扰关节点(interference joints),为joints-candidate SPPE网络的建立损失函数:

Loss_{i}=\frac{1}{K}\sum_{k=1}^{K}MSE[P_{i}^{k},T_{i}^{k}+\mu C_{i}^{k}]

这个网络应该是个分类网络,就是要把human proposal内的所有关节点,分成target joints和interference joints。

由于检测框冗余,以及把干扰关节点也检测出来了,候选关节点的数量远大于实际关节点。

接下来,我们把关节点分组,如果两个关节点都在对方的control domain中,就将他们分为一组,这算是把距离近的关节点按照如下标准聚类了:

于是我们有两个集合,关节节点集合和人节点集合

为了作人—关节图,我们在关节节点和人节点之间作连线。如果一个关节节点v_{j}^{k}包含了人节点h_{i}的候选关节,就将它们连接起来,得到边e_{i,j}^{k},该边的权重w_{i,j}^{k}即是该候选关节点的响应分数。所有边组成的集合为\varepsilon =\left \{ e_{i,j}^{k} :\forall i,j,k\right \},这时候人—关节图可表达为

传统的二步框架中,在第二步的时候,将每个检测框内关节点分别连接,这会造成一些问题。传统采用的NMS算法本质上是贪婪算法,是基于个体的算法,效率更低。尽管一些改进的NMS算法利用了pose信息,但他们仍然是基于实例的,仍然会在连接关节点的时候出错,比如遗漏关节点,组装错误等等。

本文在全局上连接关节点,上述准备工作都做好以后,我们要做的就只是解这个人—关节图,最大化总体边权重。

目标函数如下:

看看作者说的是什么意思:首先,d_{i,j}^{(k)}的取值只能是0和1,它表示是否保留对应的连线w_{i,j}^{(k)} 。故(5)限定第i个人的第k个body part连线最多一条,而(6)限定第k个body part的第j个关节最多给一个人,两个条件一起,说明每个person node只能有一个第k个body part与之相连。

你可能会好奇,一个body part检测出的关节点不止一个,那么一个body part上就多个关节点和person node的建立连线,这怎么解决?

我们之前关节点分组的工作就显得很有意义了,给定一个图的匹配结果,如果d_{i,j}^{(k)}为1,则关节点v_{i,j}^{(k)}的权重中心就分配给第i个human proposal,作为他的第k个关节。在这里权重中心意味着同一组候选关节点v_{i,j}^{(k)}的线性组合,而组合的权重则是关节点的热图响应分数。

由于一组关节点只有一个权重中心,所以,只要是第k个body part的某个关节点分配给某个person node,它的权重中心点就被分配给这个person node了,则整组点都分配给了该person node。

接下来,将目标函数写作:

正如(10)所述,人—关节图的全局分配问题被分解,变成了k个子图来求解,每个k子图包括的所有person node和第k个body part的关节点。对于每一个子图,都用改进的匈牙利算法就得到最优解,我们就能得到最终结果(是否为全局最优解?)。

由于关节点被分组,关节点基本都能找到对应的person node,没分配到关节的node就是多余的human proposal对应的node,就会被剔除,检测框冗余问题自然而然地解决了。

另外这里再提一句,本文自己建立了一个数据集CrowdPose Dataset。从前做拥挤人群姿态估计的时候,用的数据集基本是:MSCOCO,MPII 和 AI Challenger。但它们不是针对拥挤人群的,里面大部分图片只有一个人。

于是本文提出了拥挤指数(Crowd Index)来衡量一张图片的拥挤程度。

对图片上的每个human proposal,将属于此人的关节数除以不属于此人的关节数,然后把整张图片上的所有结果求平均,即为拥挤指数。

来看看我们习惯用的那些数据集的拥挤指数是多少:

而本文在制作数据集的时候,也没有一味地要数据集都是高Crowd Index,而是平均分布,这样训练出来的模型可以适应各种各样的场景。但是文章没有把模型放在不同的数据集上训练作对比,如果有的话应该也挺有意思。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值