BlazePose: On-device Real-time Body Pose tracking,2020
文章目录
Abstract
- 单人人体姿态估计,很多设计和选择,都是重点在于轻量且方便部署在移动端。
- 单人输出 33 个人体关键点,适合移动端实时估计,可以在手语识别、健身跟踪等场景使用。
- 同时使用 heatmap 和 regression 实现关键点定位,但训练时只用 heatmap 不用 regression,而预测时会砍掉 heatmap 只用 regression。
- 能够和 BlazeFace 和 BlazePalm 整合使用。
- 整体来讲,本文工程特性更明显,很多细节和理论并没有说太详细。
Introduction
很多场景中都需要人体姿态估计,这一任务的难点在于灵活性太高。目前很多方法都是为关键点生成对应的 heatmap 然后再进行坐标微调。heatmap 的方法可以很容易适应多人场景,但是如果将 heatmap 的方法用于单人姿态估计,很难部署在移动端实时检测和估计。本文则针对部署在移动端这一需求,在不明显降低准确度的情况下,加速模型。
相比 heatmap 方法而言,regression 方法需要的计算较少且适应性更广,但是它预测关键点的平均坐标,难以处理一些潜在的模糊性。Hourglass 的工作使用很少的参数预测关键点,并且有显著的性能提升。我们在 Hourglass 工作基础上进行了扩展,使用一个 encoder-decoder 网络为所有的关键点预测 heatmap,然后追加一个 encoder 直接对所有的关键点进行坐标回归。而关键在于,在本文的方法中,heatmap 分支在 inference 时可以直接砍掉,所以更加轻量适合部署在移动端。
Model Architecture and Pipeline Design
Inference pipeline
在预测过程中,我们使用一个 detector-tracker 策略,这个方法在很多任务比如手部关键点检测以及人脸关键点检测的实时处理中都表现得很好。本文的 pipeline 中,使用了一个轻量的 body pose detector 再跟一个 pose tracker。tracker 预测关键点的坐标、当前帧有无人出现,以及当前帧优化过的 RoI。当 tracker 发现当前帧无人体出现时,将会在下一帧运行 detector。如此,循环,如下图 1。
从图 1 中可以看出,会先进行 detector,然后进行 tracker(逐帧),当 tracker 在新的帧中跟踪不到人体时,会再在新的帧中重新进行 detector。也就是说,整个 pose tracker 的过程是 tracking 的,处理相邻的靠后的帧时,会依赖前面帧的信息。
Person detector
很多物体检测任务中在最后的后处理经常使用 NMS 来去除冗余的结果,但是在人体姿态估计任务中,NMS 表现得没有那么好。这主要是因为人体姿态估计任务中,各个关键点之间灵活度较高,会有很多的动作或重叠,很多结果都满足 IoU 条件,而 NMS 算法主要依赖 IoU 进行计算和处理。
为了克服这个问题,本文转向检测人体中相对固定的部分比如人脸和躯干等。作者发现,在很多时候模型给出的关于人体躯干的最强响应信号都在人脸,因为人脸的特征明显、变化较少。所以为了构建轻量的人体检测器,我们假定在整个任务中,人脸一定会出现(也就是人体姿态估计任务,依赖于人脸信息)。在这种前提下,我们使用一个人脸检测器来作为先驱,然后再进行人体姿态估计。在给定人脸这个额外信息之后,我们就可以进一步得到以下信息。当寻找到人体中心(两臀中点)后,以中心为原点,以中心与人脸之间的距离为半径,那么所有关键点都会在这个范围内,这样相当于可以去除一部分冗余信息,一定程度上也能减少错误。这部分内容如图 2 所示。
Topology
本文采用 BlazeFace、BlazePalm 和 COCO 的超集,使用 33 个关键点,如图 3。但是相比于 Openpose 和 Kinect,我们仅适用面部、手部以及脚部少量的关键点来估计后续模型 RoI 旋转、尺寸以及位置。
Dataset
和其他大多数已有的人体估计方法也就是使用 heatmap 来检测关键点相比,本文的策略是 tracking,所以就需要一个初始的姿态对齐 pose alignment。我们严格地限制使用的数据,数据中要么人体全部在图像中,要么至少肩膀和臀部能够明确地标注出来。为了保证模型能够适应较大的遮挡,比如只有上半身,本文使用了一定的数据扩增。本文使用 60K 的单人或者较少的人数图像,姿态都比较常见,还有 25K 的图像只有单人在做一些锻炼。所有数据都是人工标注的。
Neural network architecture
本文中的模型预测 33 个人体关键点,使用第一阶段进行人体对齐建议 person alignment proposal。我们结合地使用 heatmap、offset 以及 regression,如图 4 所示。
因为论文中细节没有说的那么多,所以这里可以细致地分析一下这个结构。
- 中间上面是输入图片,然后逐步向下,是个 bottom-up 的过程,每个 scale 都有向左和向右的横向链接;
- 左边从下到上,是个 top-down 的过程,和中间部分有横向链接 skip connections,这都和 Hourglass 一样,最上面是 “Hourglass” 部分输出的 heatmap,这个 heatmap 仅仅用来应用 loss 监督训练 “Hourglass” 部分生成中间的 embedding 特征,在预测以及 regression 部分都不参与;
- 右边从上到下整个是 regression encoder 网络,这部分不参与训练 “Hourglass” 部分,仅仅用来“后处理”。它每层有对应的输入,其中最上面的第一层输入来自两部分,分别是 bottom-up 以及 top-down 的同级分辨率特征(heatmap 没有参与过来,也就是砍掉了),最后输出 33 个关键点信息。
我们仅在训练的时候使用 heatmap 和 offset,在预测的时候就会去除这些步骤。这样做的结果就是,我们既可以使用 heatmap 来监督训练轻量的 embedding,这个 embedding 随后就送入 regression encoder 网络进行处理。
整个网络的一部分来自于 Hourglass 工作的启发,但是我们堆叠了一个小的 encoder-decoder 基于 heatmap 的网络,然后跟了一个 regression encoder 网络。
我们也频繁地在各个尺度使用 skip connections 以在高低分辨率特征之间达到平衡。但是,regression encoder 部分的梯度不会回传到 heatmap 训练的特征,也就是说 regression encoder 这个步骤,不参与模型的训练,仅仅作为一个“后处理”来对待。作者发现这样能够提升(我觉得更准确应该是保持)heatmap 的预测准确度,而且能够显著提升坐标回归的精度。
Alignment and occlusions augmentation
在本文的方案当中,那个相对的 pose 前驱是一个很重要的部分,也就是一开始通过检测人脸来协助定位人体。在训练的数据准备和扩增方面,我们故意地限制角度、尺度和平移的程度。这样能够降低模型的 capability(能力得到限制、参数也不多、不会过拟合、运行也较快)。
基于前面的 detection 步骤、或者是前一帧的关键点,我们将人体对齐,使得臀部中心点落在输入方图的中心。我们对臀部中心与肩膀中心的连线角度,旋转图片使得这一连线竖直也就是平行于 y 轴。然后图片的尺度也经过调整,使得人体关键点落在一个方形的 BoundingBox 中(就像前面的图 2)。在此基础上,我们再应用 10% 的 scale 和 shift augmentation。
为了模拟较大的遮挡,我们随机裁剪含有人体的长方形图片并且在周边填充随机的颜色。此外,还针对每个关键点应用一个是否可见的分类器,来表征某个关键点是否被遮挡以及其位置预测是否不准确。这些操作能够保证人体追踪效果稳定,即使对于明显遮挡的情况(比如只有上半身在图像中)。
Experiments
我们训练了两个模型:BlazePose Full 和 BlazePose Lite。Full 在瑜伽健身等场景优于 OpenPose,且快 25 ~ 75 倍。