2020人体姿态估计综述(Part3:2D Bottom

编程入门 行业动态 更新时间:2024-10-10 04:24:26

2020人体<a href=https://www.elefans.com/category/jswz/34/1764340.html style=姿态估计综述(Part3:2D Bottom"/>

2020人体姿态估计综述(Part3:2D Bottom

承接之前的博文:
A 2020 Human Pose Estimation Review (Part1:2D Single Person)
A 2020 Human Pose Estimation Review (Part2:2D Top-Down Multi-Person Pose Estimation)

目录
1 Human Pose Estimation
2 2D Single-Person Pose Estimation
3 2D Top-Down Multi-Person Pose Estimation

4 2D Bottom-Up Multi-Person Pose Estimation
  4.1 Bottom-Up
  4.2 OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields, CVPR2017
  4.3 Associative embedding End-to-end learning for joint detection and grouping, NIPS2017
  4.4 PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up Part-Based Geometric   Embedding Model, ECCV2018
  4.5 Object as Points, Arxiv2019
  4.6 Higher HRNet, CVPR2020
  4.7 Single-Stage Multi-Person Pose Machines, ICCV2019
  4.8 2D Bottom-Up Multi-Person Pose Estimation小结

5 3D Human Pose Estimation from Image
6 3D Human Pose Estimation from Video

4 2D Bottom-Up Multi-Person Pose Estimation

4.1 Bottom-Up

Bottom-Up的思路就是,先检测出图像中所有的关节点,然后对这些关节点分组,以此构成每个人体的完整姿态结果。Bottom-Up的方法相比较于Top-Down的方法,不容易受到图片中人数的影响,性能上,虽然还比不过Top-Down的方法,但差距已经没有之前那么大了。

4.2 OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields, CVPR2017

卡耐基梅隆大学的工作,整个网络分为两个部分,一部分是CNN,用于特征提取,另一部分是Part Affinity Fields(PAF),就翻译成关节亲和向量场吧,PAF用于把躯干limb和两端part快速匹配。

整个结构蛮清晰的,这是一个multi-stage的网络,每个stage的上分支预测heatmap,下分支预测PAF,然后两个分支的结果concat到一起作为下一个stage的输入。F是原始图像经过VGG的前十层处理后得到的特征图,最后一个stage的输出再过一个prasing模块,得到最终的姿态估计结果。
上分支就是置信图的预测,不再赘述了,主要说说PAF分支。PAF的输出为C个w×h×2的向量场图片,C代表了不同肢体,例如手臂、腿,注意不是关节点而是肢体,每个肢体有两张w×h的图,这是因为一个肢体有两个端,例如手臂对应了手和手肘。这里面涉及的东西还蛮细的,第一遍看的时候要仔仔细细看,下面借助论文里的图来说明。

这里贴一篇链接,里面数学公式打的比较好看,方便理解。我这里偷懒了,没有严格按照数学形式来写一些量。首先是gt的构建,假如P在这个肢体上,那么P点对应的L_(c,k)^* §=v,c代表哪个肢体,k代表哪个人,P是这个像素点坐标,v代表从j1指向j2的单位向量,不在肢体上时,P点的L值为0。这里作者设置了一个阈值,来判断P到底算不算是在肢体上。这个公式怎么理解呢,前一项就是算j1->p的向量在v上的投影长度是否小于肢体真实长度,后一项算的是p在v的垂直方向投影长度是不是小于阈值,阈值自己设置,所以PAF其实是一个矩形形状的向量场。

由于一个点p可能处在多个肢体的向量场里,所以最终的PAF平均了所有个体在这个点的PAF。

由此我们明白了PAF向量场究竟是个什么东西,有了每个点的L,我们还需要再走一个步骤才能知道肢体具体是哪里到哪里,我们有两个候选部位dj1和dj2,在他们的连线上取样,去计算他们对于L的积分,找到最大的E,那么这时候就能根据两个dj来确定肢体的具体位置了。

终于把PAF讲完了,第一遍看的时候真的要仔仔细细看好了下标,不然很容易就理解错了。下面讲最后的MultiPerson Parsing using PAFs。定义一个Z_j1j2^mn∈{0,1},表示j1关节点置信图中的点m与j2关节点置信图中的点n连接起来构成一个肢体的可能性,越接近1表示越有可能,这里的E就是借助PAF用上面那个积分算出来的,遍历所有搭配,选择最大积分的搭配组合来确定这个肢体在哪。然后用一样的方法,分别找出所有肢体部位的位置。这里求出最优的Z是一个内容比较多的数学问题,这里涉及到二分图匹配等知识,我更关心的是整个的组合思想,所以在这里以描述核心概念为主,对数学问题不多细讲。现在我们找到了所有肢体在哪,只要再去找两个连在一起的肢体,就能确定关节点在哪里了。最后的性能上,作者在对有19个个人的视频进行测试,达到了8.8fps的结果,精度指标没有太多关注意义了,毕竟是比较早的文章。现在也有很多对于DeepPose的改进,把性能提升了很多,整个文章,PAF的思想是最精华的部分。

4.3 Associative embedding End-to-end learning for joint detection and grouping, NIPS2017

这篇文章的思路也是挺有趣的,相当于让网络直接预测每个关节点属于谁。作者认为许多计算机是觉得问题都可以被视为joint detection and grouping这两个子问题,这种思想是这篇文章的精华所在。
网络整体结构为Hourglass,作者也用了和Toward fast and accurate human pose estimation via soft-gated skip connections中一样的方法,每次下采样后,要增加通道数,把Hourglass中每次下采样后的通道数增加到256,386,512,768,另外,对于单独的层,不使用residual module,而是用3×3卷积层来替代。

我们来看一下作者具体是怎么Bottom-Up的,作者让每个stage的输出是heatmap+tag map,tag map的值代表了这个图上的每个像素点属于哪一个人,这里的值并不是0,1,2,3这样子,而可能是1,5,9,12这样,最后组合的时候,只要把tag数值最接近的一堆关节点分配到一起就可以构成一个人的完整姿态了。具体方法是这样的:

x代表第n个人k关节点gt的像素位置,经过函数h后,得到一个值,对这个人的所有K个关节点求h和,然后除以关节点总数K,可以得到一个参照量hn,然后去优化h函数,使得同一个组内的不同关节点的tag值越来越接近,不同组之间的tag值差别越来越大。Loss如下,作者在这里用的关节点位置都是gt,没有用预测得到的结果,目的应该是为了让网络着眼于分组性能,而不是关注那些预测不准确的点。最后预测的时候,只要取关节点heatmap上响应最大的作为关节点位置,然后去根据这个点的tag值分组即可,因为预测的tag是一张map,每个点都有对应的tag值。

4.4 PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up Part-Based Geometric Embedding Model, ECCV2018

这篇文章在google前面的Towards accurate multi-person pose estimation in the wild的工作上继续,使用heatmap+offset的方式来预测关节点位置。整个网络分为两个模块,姿态预测模块以及实例分割模块。先看姿态预测模块,第一个分支是预测各个关节点的heatmap,这里的heatmap的gt不同于其他高斯核生成的heatmap gt,而是用一个半径为32像素的圆来生成的,圆内像素点的值均为1,圆外的为1,就把这个分支转化为一个分类任务了。

第二个short-range offsets分支,预测的是关节点半径内的点,到关节点位置的信息(x,y),训练时,这里使用L1 LOSS,并将误差除以圆的半径来归一化,使其与分之一的损失相匹配。之后,通过Hough Voting将这两个分支的结果融合成Hough分数图。

Pk代表第一个分支heatmap上该点的值,0或1,B为双线性插值核,Sk为第二个分支的输出结果(x,y),最终会得到K张分数图,作者论文里的图,应该是把K张图的结果都呈现在一张图上了。
第三个分支Mid-range offsets,预测的是图上每个点连接到最近的相关关节点的offset,例如这个点在手肘处,那么应该是预测其到肩膀的offset。为了构成双向图,作者预测了2(K-1)张图。对于距离远的情况,直接预测点到点的offset不太准确,因此作者使用曲线救国方法,用这个点到其对应关节点的offset,和其对应关节点到相连关节点的offset向量相加来计算最终结果,实现refine。这个过程作者进行两遍,对这个点和对应关节点的中点进行双线性插值的采样,然后将误差沿着SO和MO两个分支反向传播,然后再计算需要的点的offset。
在组合阶段,作者提出了快速贪婪解码,首先创建K个关键点的序列,按照Hough分数降序排序,对于得分低于阈值的,不会进入队列。取得分最高的点作为开始,比较其和比它得分低的点,如果距离小于阈值,就把得分低的剔除掉,如果遇到了大于阈值的,就新开始一轮。最后可以筛选出不同人的关节点。然后再沿着mid-range offset的方向贪婪的根据人体动力学模型把对应关节点组合起来,构成完整的人体姿态。
最后两个分支是用于实例分割的,这里不做讨论。

4.5 Object as Points, Arxiv2019

CenterNet中也提到了姿态估计,以COCO数据集为例,先用CenterNet预测出17类关节点相对于他们所属的人体的中心位置的offsets,这里用L1 LOSS来做监督。为了进一步refine和group,还需要预测K个关节点的heatmap,这里使用focal loss和centernet中提到的偏移量损失来做监督。
在组合的时候,先求出所有关节点的位置,然后进行关节点之间的匹配,这里作者写的太简略了。我说明一下,这个匹配也是根据人体动力学关系来做的,手去匹配手肘,具体方法是,有了手可以得到这个手对应的人体中心点位置和bbox,在这个bbox里面去找手肘在哪,然后选择距离手最近的手肘位置,最后依次匹配所有关节点,构成完整的人体姿态。这种方式其实有点半top-down的味道在里面,毕竟它也用到了bbox,同时它的整个性能是没有那么好的,作为2019年发布的文章,在COCO上只有65左右的mAP,所以总体上说,这个论文的思想可以去借鉴去思考,但性能上,如果追求精度而不是速度的话,可以不考虑。

4.6 Higher HRNet, CVPR2020

MSRA牛啤,把bottom-up的mAP刷到了70.5%,一句话概括,Higher HRNet = HRNet + Associative Embedding。
HigherHRNet的思路是首先使用HRNet生成feature map(最高分辨率分支),然后接一个类似Simple Baselines中的deconvolution层,生成一个更高分辨率的feature map。显然,更高分辨率的feature map有助于更加精确地定位small person的关键点(实践证明接一层deconv. module足够)。在训练时,使用multi-resolution supervision,即对原图1/4和1/2大小的两个feature map同时进行监督,这样做是为了在训练时就使网络获得处理scale variation的能力,1/4的feature map主要处理大一些的人,1/2的feature map主要处理小一些的人,而不是在推理时依赖multiscale evaluation处理scale variation的问题。在推理时,使用multi-resolution heatmap aggregation,即将不同分辨率的heatmap取平均用于最后的预测,也是为了处理scale variation。
在组合关节点的阶段,用的是associative embedding中的tag map方法,这里不再赘述了,可以直接往上面翻到AE论文的叙述。

4.7 Single-Stage Multi-Person Pose Machines, ICCV2019

现有的多人人体姿态估计方法,不管是TD还是BU,往往都需要两步走,这篇论文提出了single-stage的方法,论文提出了Single-stage multi-person Pose Machine (SPM),来简化和提高多人姿态估计的性能。这篇文章有很多思想和centernet是共性的。
先看网络的整体结构,作者使用Associative Embedding中的Hourglass作为骨架网络,预测两个东西。一个是root joints的置信图,相当于预测每个人的中心在哪。

另一个预测的是关节点偏移量的图,这里我搞了好久,终于弄明白了这个图的意思,这里对每个root节点周围半径为r的圆内的每个点进行K张图的预测,预测的是这个点出发到各个关节点的offset除以一个归一化量,这样取root图中local max的点作为root,就可以算出其各个关节点的位置,所以这是一个single-stage的网络。但是,有些关节点与root会比较远,直接预测offset不太准,作者进行了改进:作者把关节点分为几个层次,root joint为第一层,脖子点、两个肩膀点、两个臀部点为第二层,头部点、手肘点、膝盖点为第三层,手腕点、脚踝点为第四层,然后在回归offset的时候,第一层回归点到第二层的offset,第二层回归到第三层的offset,以此类推,这样回归的offset都是short的,比较准确,网络学习起来也更容易。在COCO上的mAP为66.9%,不高不低吧,很多细节还能改进,这篇文章root+offset的single-stage的思想是值得去思考的。

4.8 2D Bottom-Up Multi-Person Pose Estimation小结

相比较于TD的思路,BU的最大优势在于速度上,但是很明显的,BU的精度要比TD少了大概10%mAP。现在主流的方法我总结如下,一个是类似于Associative Embedding,预测每个关节点属于哪个人,这种group的方式比较直接;另一个是Openpose的,我不管这是谁的关节点,我只要合理组合,就能最终形成每个人的姿态;还有一个是centernet这种,预测关节点相对于root的offset,借助root来进行group,当然还有其他的思路。
我个人认为,这些组合方式没有太多的好坏之分,都十分合理,我个人觉得BU思路的缺陷在于,不能像TD那样很强有力的让模型自己去学习人体的关节点位置分布,同时BU方法要处理的图片太过于复杂了,现在的网络理解性能还不够。TD的方法先把图中每个人单独检测出来,然后经常缩放到统一尺度,之后进行关节点位置预测,这个过程中,网络会隐式地学到关节点位置分布,同时,采用更大的感受野信息,可以获取更多关节点之间的信息,这有助于定位遮挡等困难关节点。而BU的方法在这方面是欠缺的,更多的是先用有着模板匹配味儿的方法检测各个关节点位置,再去组合。虽然多尺度以及不同感受野也能提升对困难关节点的检测性能,但毕竟BU方法是直接在原图上进行理解,不像TD方法中,单个人体姿态再怎么复杂,网络的理解能力还是很强的。BU的方法受限制于要检测的对象太过于复杂,网络很难有效的理解一些重叠的姿态等等,我觉得Higher HRNet是我很喜欢的一篇文章,他的出发点是我所认为的有更多探索意义的地方,也许构建更复杂,尺度更多的网络,可以进一步提升性能,同时我也希望有新的思路可以出现。

更多推荐

2020人体姿态估计综述(Part3:2D Bottom

本文发布于:2024-03-08 11:51:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720790.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:姿态   人体   Bottom

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!