论文地址:Simple Baselines for Human Pose Estimation and Tracking
代码地址:GitHub - leoxiaobin/pose.pytorch: Simple Baselines for Human Pose Estimation and Tracking
Simple Baselines,是2018年MSRA的工作,网络结构如下图所示。之所以叫这个名字,是因为这个网络真的很简单。该网络就是在ResNet的基础上接了一个head,这个head仅仅包含几个deconvolutional layer,用于提升ResNet输出的feature map的分辨率,我们提到过多次高分辨率是姿态估计任务的需要。这里的deconvolutional layer是一种不太严谨的说法,阅读源代码可知,deconvolutional layer实际上是将transpose convolution、BatchNorm、ReLU封装成了一个结构。所以关键之处在于transpose convolution,可以认为是convolution的逆过程。
从图中看可以发现Simple Baselines的网络结构有点类似Hourglass中的一个module,但可以发现:①该网络没有使用类似Hourglass中的skip connection;②该网络是single-stage,Hourglass是multi-stage的。但令人惊讶的是,该网络的效果却超过了Hourglass。我个人认为有两点原因,一是Simple Baselines以ResNet作为backbone,特征提取能力相比Hourglass更强。二是Hourglass中上采样使用的是简单的nearest neighbor upsampling,而这里使用的是deconvolutional layer,后者的效果更好(后面可以看到在MSRA的Higher-HRNet中依旧使用了这种结构)。
SBL网络结构
SBL(Simple Baseline) [7] 为人体姿态估计提供了一套基准框架。SBL 在主干网络后接逆卷积模块来预测热图,就是在ResNet后加上几层Deconvolution直接生成热力图。相比于其他模型,就是使用Deconvolution替换了上采样结构。将上采样和卷积参数以一种更简单的方式组合到反卷积层中,而不使用跳跃层连接。
Hourglass、CPN、SBL共同点是,采用三个上采样步骤和三个水平的非线性(来自最深处的特征)来获得高分辨率的特征图和heatmap
- 上图中a是Hourglass网络,b是CPN,c是本文的SimplePose,可以直观看出结构的复杂度对比
- 前两种结构需要构造金字塔特征结构,如FPN或从Resnet构建
- SimplePose则不需要构建金字塔特征结构,它是直接在Resnet后面设计反卷积模块并输出结果,是从deep和low分辨率特征生成热图的最简单方法
- 具体结构:首先:在Resnet的基础上,取最后残差模块输出特征层(命名C5)然后:后面接上三个反卷积模块(每个模块为:Deconv + batchnorm + relu,反卷积参数,256通道,4X4卷积核,stride为2,pad为1),最后:用1X1卷积层生成 k个关键点输出热力图。
- 均方误差(MSE)被用作预测热图和目标热图之间的损失
- 通过应用以第 k 个关节的GT位置为中心的2D高斯函数,生成 k 关节的目标热图 。
在这些模型中,可以看出如何生成高分辨率特征图是姿态估计的一个关键,SimplePose采用Deconv扩大特征图的分辨率,Hourglass,CPN中采用的是upsampling+skip方式;当然我们很难就这一个实例就判定那种方式好
姿态追踪问题描述
ICCV’17 PoseTrack Challenge[2]的获胜者[11]解决了这个多人位姿跟踪问题,首先使用Mask RCNN[12]在帧中估计人体位姿,然后使用贪婪二部图匹配算法逐帧进行在线跟踪。
这个贪婪匹配算法,简单来说就是,在视频第一帧中每个检测到的人给一个id,然后之后的每一帧检测到的人都和上一帧检测到的人通过某种度量方式(文中提到的是计算检测框的IOU)算一个相似度,将相似度大的(大于阈值)作为同一个id,并删去。重复以上步骤,直到没有与当前帧相似的实例,此时给剩下的实例分配一个新的id。
本文提出的方法保留了这一方法的主要流程,并且在此之上提出了两点改进:
一是除了检测网络之外,还使用光流法补充一些检测框,用以解决检测网络的漏检问题(比如图2©中最左边的人就没有被检测网络检测到)。
二是使用 Object Keypoint Similarity (OKS)代替检测框的IOU来计算相似度。这是因为当人的动作比较快时,用IOU可能并不合理。
OKS是关键点距离的一种度量方式,计算方式如下:
文中提出的新的相似度计算方式具体是使用光流法计算某一帧的关键点会出现在的另外一帧的位置,然后用这个计算出来的位置和这一帧检测出来的关键点之间计算OKS,以此作为两帧之间的不同人的相似度值。
Joint Propagation using Optical Flow
如果在视频中简单地使用单一图像级的检测器(如fast - rcnn [27], R-FCN[16]),由于视频帧引入了运动模糊和遮挡,可能会导致漏检和误检。如图2©所示,由于快速运动,探测器错过了左边的黑人。时间信息经常被用来产生更可靠的检测[36,35]。
我们建议使用以光流表示的时间信息,从附近的帧为处理帧生成行人框。
具体的方法是: 给定 帧处的一个实例 i ,有关键点集合 以及 和之间的光流场 ,我们可以估计出相应的关键点坐标集合 。具体的说,就是对于中的 joints 位置 (x,y),下一帧可能在 ( x + δ x , y + δ y ),其中 δ x 和 δ y 是在(x,y) 处的流场值( flow field values )。当我们计算出的边界,并对其进行扩展后得到的Box 作为 candidated box 。实验使用的扩充值是 15 % 。
当由于运动模糊或遮挡,导致行人检测器对当前帧产生了漏检后,我们可以使用从以前帧传播过来的 Boxes ,漏掉的人会被这些框检测到。如图2 (c ) 所示,对于图中左边的黑人,由于我们在图2(a)中有前一帧的跟踪结果,所以传播的box成功地包含了这个人。
Flow-based Pose Similarity
使用边界框IoU (Intersection-over-Union) 作为相似度度量 () 来连接实例可能出现问题,一是当实例移动得很快时,这些框不会重叠;二是在拥挤的场景中,离得近的框中实例不一定有联系。更细粒度的度量可以是姿态相似性 ( ) ,它使用对象关键点相似性(OKS)计算两个实例之间的身体关节距离。当不同帧时,同一个人的姿势可能会改变,此时姿势相似性也会产生问题。所以,我们建议使用基于流的姿态相似性度量。
给定 帧处的一个实例关键点 和 l 帧处的实例 ,基于流的姿态相似度度量表示为:
其中OKS表示两个人体姿态之间的 Object Keypoint Similarity (OKS) 计算。对于 实例,我们根据光流场计算帧时的对应,记为
由于与他人或物体的遮挡,行人经常会消失,然后再次出现。考虑连续两帧是不够的。因此,我们有考虑多帧的基于流的位姿相似性,记为 ,这意味着传播 来自多个之前帧。通过这种方式,我们甚至可以重新链接在中间帧中消失的实例。
Flow-based Pose Tracking Algorithm
首先解决姿态估计问题。对于当前处理帧,检测框由行人检测器和之前帧利用光流得到的框组成,并进行非极大抑制(NMS)操作。然后将剪裁和缩放的图片送入姿态估计网络进行姿态估计。
解决跟踪问题。我们将已经跟踪到的实例存储在一个双端队列(Deque) Q 中:
- 首先,我们解决了姿态估计问题。
- 对于视频中的处理帧,使用bbox非最大抑制(NMS)操作来统一来自人类探测器的box和使用optical flow从先前帧传播关节生成的box。由progagating joints产生的boxes作为检测器缺失检测的补充
- 然后通过我们提出的位姿估计网络,利用这些boxes对经过裁剪和调整大小的图像进行人体姿态估计
- 其次,解决了跟踪问题。我们将被跟踪的实例存储在具有固定长度LQ的双端队列(Deque)中,表示为
- 其中 表示在前一帧 中设置的被跟踪实例, Q的长度 表示执行匹配时考虑的前帧数量。
- Q可以用来捕捉先前的多帧链接关系,在视频的第一帧初始化。对于第 k 帧 ,我们计算未跟踪的身体关节 (id为none)与Q中先前实例集之间flow基于流的姿势相似性矩阵 。然后通过贪婪匹配和 为 中的每个bodyjoints实例 J分配id ,得到指定的实例集 。最后,我们通过添加第 k帧实例集合 来更新跟踪的实例Q。
参见