使用 MediaPipe 实现设备端实时手部追踪

在各类技术领域和平台中,感知手部形状与运动轨迹的能力都是非常重要的,这有助于提高用户体验。这个能力既可以用来作为手语理解和手势控制的基础,也可以结合 增强现实 技术方便地在现实世界之上叠加数字内容与信息。虽然人类生来便拥有稳健的实时手部感知,但在计算机视觉领域,此任务却颇具挑战性,这是因为手经常会遮住自己或另一只手(例如手指 / 手掌间的遮挡以及握手),并且缺乏高对比度模式供计算机识别。

我们推出一种全新的手部感知方法(我们已在 6 月的 CVPR 2019 大会上预览了此方法),该方法基于 MediaPipe 框架而实现,这种开源的跨平台框架可用于构建流水线,进而处理不同模式(如视频和音频)的感知数据。

此方法利用机器学习 (ML) 推断出单帧内的 21 个 3D 手部关键点,从而提供手部与手指的高保真追踪轨迹。目前,最先进的方法主要依靠功能强大的桌面环境实现推理,而我们的方法却可在手机端实现实时性能,甚至是扩展到感知多个手部。我们希望将这种 手部感知功能 推向更多研究和开发社区,以便涌现出更多富有创意的用例,并推动产生新应用和新研究途径。

image

利用 MediaPipe 在手机端实现 3D 实时手部感知,我们的解决方案是利用机器学习计算视频帧内的 21 个 3D 手部关键点,本图中以灰度表示深度

用于手部追踪和手势识别的机器学习流水线

我们的手部追踪解决方案采用 ML 流水线,该流水线包含下列共同工作的模型:

  • 手掌检测模型(称为 “BlazePalm”),用于对整个图像进行操作并返回定向的手部边界框。
  • 手部关键部位模型,用于对手掌检测模型所定义的裁剪图像区域进行操作,并返回高保真度的 3D 手部关键点。
  • 手势识别器,用于将先前计算出的关键点结构分类为一组离散手势。

此架构类似于我们近期公布的 面部网格 ML 流水线 所用架构,以及其他用于 姿势估测 的架构。通过为手部关键部位模型提供精确裁剪的手掌图像,我们可以大幅降低对数据增强(例如旋转、平移和缩放)的需求,让网络将其大部分容量用于提升坐标预测精度。

image

手部感知流水线概览

BlazePalm:实时手部 / 手掌检测

为检测初始手部位置,我们采用一种称为 BlazePalm 的 单发检测模型,并针对移动端的实时使用情况对其进行了优化,优化方式与 BlazeFace(同样可在 MediaPipe 中 获取)类似。手部检测是一项颇为复杂的任务:我们的模型必须适应各种手部尺寸,因此相对于图像帧,它拥有更大的检测范围(约为其 20 倍),并能检测出被遮挡和自遮挡的手部。人脸具有高对比度(例如眼睛和嘴巴区域),但手部缺少这样的特征,因此我们很难仅凭视觉特征实现可靠的手部检测。相反,提供手臂、身体或人体特征等额外背景有助于提升手部定位的精度。

我们的解决方案使用不同策略来攻克上述挑战。首先,我们并未训练手部检测器,而是训练手掌检测器,原因是相较于检测具有关节和手指的手部,估算手掌和拳头等固定对象的边界框要简单得多。此外,由于手掌的尺寸较小,即使在双手自遮挡的情况(如握手)下,非极大值抑制算法 亦能表现出色。同时,我们使用方形边界框(即 ML 术语中的 锚点)来模拟手掌,并忽略其他高宽比,从而将锚点数降低 300% 至 500%。其次,即使是针对小尺寸对象,我们仍然利用编码 - 解码特征提取器来感知更大场景的背景(与 RetinaNet 方法类似)。最后,我们将训练过程中的 焦点损失 降至最低,从而支持因高缩放方差而产生的大量锚点。

利用上述技术,我们在手掌检测中取得 95.7% 的 平均精度。如果使用常规的交叉熵损失且不使用解码器,则得出的基线仅为 86.22%。

手部关键部位模型

在对整个图像进行手掌检测后,我们随后使用手部关键点模型,在检测到的手部区域内通过回归对 21 个 3D 手关节坐标执行精确的关键点定位,即直接预测坐标。该模型学习一致的内部手势表征,即使对部分可见和自遮挡的手部,也能表现出稳健性。

为获取实况数据,我们手动标注了约 3 万张包含 21 个 3D 坐标的真实图像,如下图所示(如果存在对应的坐标,则从图像深度图中提取 Z 值)。为涵盖更多可能出现的手势并对手部几何性质提供更多监督,我们还在各种背景下渲染出手部的优质合成模型,并将其映射为相应的 3D 坐标。

image

上图:传递给追踪网络的手部对齐裁剪图(包含实况标注)
下图:手部的渲染合成图像(包含实况标注)

然而,纯合成的数据很难适用于自然场景。为解决此问题,我们采用了混合训练架构。下图展示高级模型训练图。

image

用于手部追踪网络的混合训练架构。裁剪的真实照片与渲染的合成图像均用作预测 21 个 3D 关键点的输入

下表根据训练数据的性质对回归精度进行了总结。若混用合成数据和真实数据,则可以显著提升性能。

image

手势识别

预测出手部骨架后,我们使用一种简单算法来推导手势。首先,关节的弯曲角度决定每根手指的状态(弯曲或伸直)。随后,我们将这组手指状态映射为一组预定义的手势。利用这种直接而有效的方法,我们可以估算出基本的静态手势,同时保证检测质量。现有流水线支持计算多种文化背景(如美国、欧洲和中国)下的手势,以及各种手势标志,包括 “非常棒”、握拳、“好的”、“摇滚” 和 “蜘蛛侠”。

image image

通过 MediaPipe 完成实现

借助 MediaPipe,我们可以将这种感知流水线构建为模块化组件的 有向图,而这些模块化组件也称为 “计算单元”(Calculator)。MediaPipe 附带一组可扩展的计算单元,可用于解决 各种设备和平台 上的模型推理、媒体处理算法和数据转换等任务。而诸如裁剪、渲染和神经网络计算等单个计算单元可基于 GPU 独立运行。例如,我们在大多数现代手机上使用 TFLite GPU 推理

用于手部追踪的 MediaPipe 架构如下图所示。该图包含两个子图:一个用于手部检测,另一个用于手部关键点(即关键部位)计算。MediaPipe 提供一项重要优化,即手掌检测器仅在必要时(极少数情况)才运行,从而大幅减少计算时间。我们通过从当前帧中计算得出的手部关键点,推断后续视频帧中的手部位置,从而实现优化,无需在每帧上运行手掌检测器。为获得稳健性,手部追踪器模型会额外输出一个标量,用于捕获手存在且与输入裁剪图相应对齐的置信度。只有当置信度低于特定阈值时,手部检测模型才会重新应用于整个帧。

手部关键部位模型的输出 (REJECT_HAND_FLAG) 控制手部检测模型的触发时间。得益于 MediaPipe 强大的同步构建块,我们可以实现此行为,进而使 ML 流水线获得高性能和最佳吞吐量

高效的 ML 解决方案可跨不同平台和设备实时运行,并且其复杂度远胜于上方的概述图。为此,我们将对 MediaPipe 框架中的上述手部追踪和手势识别流水线进行开源,并附带相关的端到端 使用场景和源代码。如此一来,研究人员和开发者便可拥有完整的资料,并基于我们的模型对各种新奇想法进行实验和原型设计。

未来研究方向

我们计划使用更稳健的追踪扩展此项技术,扩大能可靠检测出的手势数量,并支持动态手势的及时展开。我们相信,发布这项技术能够推动广大研究人员和开发者社区成员提出新的创意和应用。期待见证您的成果!

image

致谢

感谢 Valentin Bazarevsky 和 Fan Zhang ,特别感谢与我们共同研究此技术的团队成员:Andrey Vakunov、Andrei Tkachenka、Yury Kartynnik、Artsiom Ablavatski、Ivan Grishchenko、Kanstantsin Sokal、Mogan Shieh、Ming Guang Yong、Anastasia Tkach、Jonathan Taylor、Sean Fanello、Sofien Bouaziz、Juhyun Lee、Chris McClanahan、Jiuqiang Tang、Esha Uboweja、Hadon Nash、Camillo Lugaresi、Michael Hays、Chuo-Ling Chang、Matsvei Zhdanovich 和 Matthias Grundmann。

原文:On-Device, Real-Time Hand Tracking with MediaPipe
中文:谷歌开发者公众号