谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉
日期:2019-08-23 浏览量:755
能够对手的形状和运动轨迹进行感知是改善用户在不同的技术领域和平台上的体验的一个重要组成部分。例如,它可以实现手语理解和手势控制,还可以使数字内容和信息叠加在增强现实(AR,https://ai.googleblog.com/search/label/Augmented%20Reality)的物理世界之上。虽然对我们来说这个能力是天生的,但强大的实时手部感知是一项极具挑战性的计算机视觉任务,因为手往往会自我遮盖或相互遮挡(例如手指/手掌之间的遮蔽或者握手),而且手部之间也缺乏高对比度。
我们现在发布了一种新的手部感知方法,并且在 6 月的 CVPR 2019 大会上,我们已经对该方法开放了预览。在这个方法展示过程中,我们通过 MediaPipe——一个开放源码的跨平台框架,来构建了处理视频和音频等类型的不同模式感知数据的框架。
该方法通过机器学习(ML)从单个帧中推断出一只手的 21 个 3D 关键点,从而提供了高保真的手部和手指跟踪。目前最先进的方法主要依靠强大的桌面环境进行推理,而我们的方法可以在手机端实现这个实时性能,甚至还可以扩展到对多个手的同步跟踪。
我们希望通过提供该手部感知功能给广泛的研究和开发社区,能够有利于大家创造出更多全新的用例,同时激励更多新应用程序和新研究途径的出现。
图 1 通过 MediaPipe 在手机上进行实时 3D 手部感知。我们的解决方案是使用机器学习从一个视频帧计算手的 21 个三维关键点。图中深度通过颜色灰色程度表示。
用于手跟踪和手势识别的机器学习架构
我们的手部跟踪解决方案使用了一个机器学习架构,该架构由几个模型共同组成:
掌上检测器模型(称为 BlazePalm)。它对整个图像进行操作,并返回一个定向的手部边界框;手部标志模型。它在掌上探测器定义的裁剪图像区域上操作,并返回高保真的 3D 手部关键点;手势识别器,它将先前计算的关键点配置分类为一组离散的手势。这种架构类似于我们最近发布的 face mesh ML 模型(https://sites.google.com/view/perception-cv4arvr/facemesh),这个模型也被其他人用于的姿态估计中。将精确裁剪的手掌图像提供到手部标志模型中,可以大大减少更多数据(例如旋转、平移和缩放)的需求,从而使网络能够将其大部分性能用于协调预测精度。
图 2 手部感知模型整体架构
BlazePalm:实时手部/手掌检测
为了检测手的初始位置,我们使用了一个名为 BlazePalm 的单镜头检测器模型(https://arxiv.org/abs/1512.02325)。该模型可用于移动实时检测,其方式类似于 BlazeFace(https://arxiv.org/abs/1907.05047),这个模型也可以在 MediaPipe 中使用。
手部检测是一项非常复杂的任务:我们的模型必须要适应不同的手部尺寸,因此它具有相对于图像帧更大的范围 (~20x),并且它能够检测被遮挡以及自遮挡的手部状态。
人脸通常具有很高的对比度,例如在眼睛和嘴部区域都有明显的区别。但由于手部缺乏这样的特征,因此我们很难仅从其视觉特征中可靠地检测到这些特征。不过通过提供额外的信息,如手臂、身体或人的特征,倒是有助于精确的手定位。因此,我们的解决方案使用了不同的策略来解决上述挑战。
首先,我们训练了一个手掌检测器来代替手部探测器,因为推测例如手掌和拳头这样刚性物体的边界框比检测手指的关节要简单得多。此外,由于手掌是较小的物体,我们采用了非最大抑制算法(https://www.coursera.org/lecture/convolutional-neural-networks/non-max-suppression-dvrjH),该算法可以在即使双手自遮挡的情况(如握手)下,也能够达到很好的工作效果。
同时,手掌还可以使用方形边界框(在 ML 术语中的锚)来模拟,忽略其他高宽比,从而将锚的数量减少 3-5 倍。其次,我们将适用于更大场景上下文感知中的编码器—解码器特征提取器用于手部感知这样的小对象中(类似于 RetinaNet 办法,https://arxiv.org/abs/1612.03144)。最后,我们将训练期间的焦损降至最低,从而支持由于高度变化而产生的大量锚点。
利用上述技术,我们实现了对手掌的平均检测精度为 95.7%;而使用常规的交叉熵损失并且在没有解码器的情况下,检测精度基准仅为 86.22%。
手部标志模型
在对整个图像进行手掌检测后,我们随后的手部标志模型通过回归对检测到的手部区域内的 21 个 3D 手关节坐标进行精确的关键点定位,即直接对坐标进行预测。该模型将学习一致的内部手势表示,甚至对部分可见的手和自遮挡都表现出了鲁棒性。
为了获得实时数据,我们手工标注了 30K 张具有 21 个 3D 坐标的真实手势图像,如下图所示(如果存在对应的坐标,则从图像深度图中获取 Z 值)。为了更好地覆盖可能的手势,并提供对手势的几何形状的附加监督,我们还在不同的背景上渲染了一个高质量的合成手部模型,并将其映射到相应的三维坐标中。
图 3 第一行图片为对齐的手部通过实时标注传递到跟踪网络;第二行图片为使用实时标注渲染合成手部图像。
然而,单纯的合成数据很难推广到更广泛的领域。为了克服这个问题,我们使用了一个混合训练模式,下面的图显示了一个高级模型训练图。
图 4 手部跟踪网络的混合训练模式。裁剪的真实照片和渲染的合成图像用作输入,以预测 21 个 3D 关键点。
下图展示了根据训练数据的性质总结了回归的准确性。使用合成数据和真实数据都可以显著提高模型的性能。
图 5 使用合成数据和真实数据对模型性能的影响结果
手势识别器
在预测的手部骨架之上,我们应用一种简单的算法来推导手势。首先,每个手指的状态,例如弯曲或竖直,是由关节的累积角度决定的。于是,我们将一组手指状态映射到一组预定义的手势上。这种简单但有效的技术可以使我们在保证检测质量的情况下来估计基本的静态手势。现有的架构支持多种文化的手势计数,如美国、欧洲和中国,以及各种手势标志,包括「拇指向上」、紧握拳头、「OK」、「摇滚」和「蜘蛛侠」。
图 6 不同手势识别结果
通过 MediaPipe 实现
通过使用 MediaPipe,我们可以将该感知架构建模称模块化组件的有向图(https://en.wikipedia.org/wiki/Directed_graph),称为 Calculators(计算器)。Mediapipe 附带了一组可扩展的计算器,可用于解决各种设备和平台的模型推理、媒体处理算法以及数据转换等任务。而像裁剪、渲染和神经网络计算这样的单个计算器,可以独立在 GPU 上执行。例如,我们在大多数现代手机上采用 TFLite GPU 推理。
我们用于手部跟踪的 MediaPipe 架构图如下所示。该图由两个子图组成——一个用于手检测,另一个用于手部关键点(即标志性)计算。MediaPipe 提供的一个关键优化是只在必要时运行掌上检测器(因此该检测器的运行频率很低),从而节省了大量的计算时间。
我们通过从当前帧中计算所得的手部关键点来推断后续视频帧中的手部位置实现手部跟踪,从而无需在每个帧上运行掌上检测器。为了获得鲁棒性,手部跟踪器模型输出一个额外的标量,以获取一只手在输入裁剪中存在并合理对齐的置信度。只有当置信度低于一定的阈值时,才能将手部检测模型重新应用到整个帧中。
图 7 手部标志模型的输出(REJECT_HAND_FLAG)控制何时触发手部检测模型。这种行为是通过 MediaPipe 强大的同步构建块实现的,从而实现机器学习架构的高性能和最佳吞吐量。
该高效的机器学习解决方案可以实时运行,并且跨越各种不同的平台和形式因素。它所包含的复杂性要比上面的简化描述要复杂得多。为此,我们将在 MediaPipe 框架中开源上述手部跟踪与手势识别方法,并附带相关的端到端使用场景和源代码(https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md),这为研究人员和开发人员提供了一个完整的堆栈,基于我们的模型可以对新思想进行实验和原型设计。
未来方向
我们计划通过更强大和稳定的跟踪来扩展这项技术,扩大我们能够可靠检测的手势数量,并支持动态手势的及时展开。我们相信,发布这项技术可以激发广大研究和开发人员的新创意和应用。我们很期待看到你的创新!
*MediaPipe
MediaPipe 是一个跨平台框架,用于构建应用于机器学习流程中的多模态(例如,视频,音频,任何时间序列数据)框架。通过使用 MediaPipe,我们可以将感知流程构建为模块化组件的图形,包括:推理模型(例如,TensorFlow,TFLite)和媒体处理功能。
MediaPipe 开源地址:https://github.com/google/mediapipe/
原文链接:https://ai.googleblog.com/2019/08/on-device-real-time-hand-tracking-with.html手势识别开源地址:https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md