3D手势姿态跟踪算法:手机端实时检测,多个手势同时捕捉

就在不久前,Google 人工智能实验室宣布,他们在「实时手部跟踪」方面取得了新的进展,并将这项新技术运用在了 MediaPipe 中,这也是 AI 计算机视觉任务的一大突破。这一技术不光可以在手机上实现实时捕捉性能,甚至可以同时对多个手的动作进行跟踪。目前,Google 已经将该项目开源,并且发布了相关博客介绍了这项技术,雷锋网 AI 开发者将其内容整理编译如下。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

概述

能够对手的形状和运动轨迹进行感知是改善用户在不同的技术领域和平台上的体验的一个重要组成部分。例如,它可以实现手语理解和手势控制,还可以使数字内容和信息叠加在增强现实(AR,https://ai.googleblog.com/search/label/Augmented%20Reality  )的物理世界之上。虽然对我们来说这个能力是天生的,但强大的实时手部感知是一项极具挑战性的计算机视觉任务,因为手往往会自我遮盖或相互遮挡(例如手指/手掌之间的遮蔽或者握手),而且手部之间也缺乏高对比度。

我们现在发布了一种新的手部感知方法,并且在 6 月的 CVPR 2019 大会上,我们已经对该方法开放了预览。在这个方法展示过程中,我们通过 MediaPipe——一个开放源码的跨平台框架,来构建了处理视频和音频等类型的不同模式感知数据的框架。

该方法通过机器学习(ML)从单个帧中推断出一只手的 21 个 3D 关键点,从而提供了高保真的手部和手指跟踪。目前最先进的方法主要依靠强大的桌面环境进行推理,而我们的方法可以在手机端实现这个实时性能,甚至还可以扩展到对多个手的同步跟踪。

我们希望通过提供该手部感知功能给广泛的研究和开发社区,能够有利于大家创造出更多全新的用例,同时激励更多新应用程序和新研究途径的出现。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 1 通过 MediaPipe 在手机上进行实时 3D 手部感知。我们的解决方案是使用机器学习从一个视频帧计算手的 21 个三维关键点。图中深度通过颜色灰色程度表示。

用于手跟踪和手势识别的机器学习架构

我们的手部跟踪解决方案使用了一个机器学习架构,该架构由几个模型共同组成:

  • 掌上检测器模型(称为 BlazePalm)。它对整个图像进行操作,并返回一个定向的手部边界框;

  • 手部标志模型。它在掌上探测器定义的裁剪图像区域上操作,并返回高保真的 3D 手部关键点;

  • 手势识别器,它将先前计算的关键点配置分类为一组离散的手势。

这种架构类似于我们最近发布的 face mesh ML 模型(https://sites.google.com/view/perception-cv4arvr/facemesh),这个模型也被其他人用于的姿态估计中。将精确裁剪的手掌图像提供到手部标志模型中,可以大大减少更多数据(例如旋转、平移和缩放)的需求,从而使网络能够将其大部分性能用于协调预测精度。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 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 值)。为了更好地覆盖可能的手势,并提供对手势的几何形状的附加监督,我们还在不同的背景上渲染了一个高质量的合成手部模型,并将其映射到相应的三维坐标中。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 3 第一行图片为对齐的手部通过实时标注传递到跟踪网络;第二行图片为使用实时标注渲染合成手部图像。

然而,单纯的合成数据很难推广到更广泛的领域。为了克服这个问题,我们使用了一个混合训练模式,下面的图显示了一个高级模型训练图。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 4 手部跟踪网络的混合训练模式。裁剪的真实照片和渲染的合成图像用作输入,以预测 21 个 3D 关键点。

下图展示了根据训练数据的性质总结了回归的准确性。使用合成数据和真实数据都可以显著提高模型的性能。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 5 使用合成数据和真实数据对模型性能的影响结果

手势识别器

在预测的手部骨架之上,我们应用一种简单的算法来推导手势。首先,每个手指的状态,例如弯曲或竖直,是由关节的累积角度决定的。于是,我们将一组手指状态映射到一组预定义的手势上。这种简单但有效的技术可以使我们在保证检测质量的情况下来估计基本的静态手势。现有的架构支持多种文化的手势计数,如美国、欧洲和中国,以及各种手势标志,包括「拇指向上」、紧握拳头、「OK」、「摇滚」和「蜘蛛侠」。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 6 不同手势识别结果

通过 MediaPipe 实现 

通过使用 MediaPipe,我们可以将该感知架构建模称模块化组件的有向图(https://en.wikipedia.org/wiki/Directed_graph),称为 Calculators(计算器)。Mediapipe 附带了一组可扩展的计算器,可用于解决各种设备和平台的模型推理、媒体处理算法以及数据转换等任务。而像裁剪、渲染和神经网络计算这样的单个计算器,可以独立在 GPU 上执行。例如,我们在大多数现代手机上采用 TFLite GPU 推理。

我们用于手部跟踪的 MediaPipe 架构图如下所示。该图由两个子图组成——一个用于手检测,另一个用于手部关键点(即标志性)计算。MediaPipe 提供的一个关键优化是只在必要时运行掌上检测器(因此该检测器的运行频率很低),从而节省了大量的计算时间。

我们通过从当前帧中计算所得的手部关键点来推断后续视频帧中的手部位置实现手部跟踪,从而无需在每个帧上运行掌上检测器。为了获得鲁棒性,手部跟踪器模型输出一个额外的标量,以获取一只手在输入裁剪中存在并合理对齐的置信度。只有当置信度低于一定的阈值时,才能将手部检测模型重新应用到整个帧中。

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

图 7 手部标志模型的输出(REJECT_HAND_FLAG)控制何时触发手部检测模型。这种行为是通过 MediaPipe 强大的同步构建块实现的,从而实现机器学习架构的高性能和最佳吞吐量。

该高效的机器学习解决方案可以实时运行,并且跨越各种不同的平台和形式因素。它所包含的复杂性要比上面的简化描述要复杂得多。为此,我们将在 MediaPipe 框架中开源上述手部跟踪与手势识别方法,并附带相关的端到端使用场景和源代码(https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md),这为研究人员和开发人员提供了一个完整的堆栈,基于我们的模型可以对新思想进行实验和原型设计。

未来方向 

我们计划通过更强大和稳定的跟踪来扩展这项技术,扩大我们能够可靠检测的手势数量,并支持动态手势的及时展开。我们相信,发布这项技术可以激发广大研究和开发人员的新创意和应用。我们很期待看到你的创新!

谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

*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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows服务的快速搭建与调试(C#图解)

目录 一、什么是Windows 服务? 二、创建Windows 服务与安装/卸载批处理。 三、调试Windows 服务。 正文 一、什么是Windows 服务? 答:Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自…

使用 JMeter 进行API接口压力测试

使用 JMeter 进行API接口压力测试 一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率;预估系统的承载能力,使我们能根据其做出一些应对措施…

ser,ver

friend_conservation_bgfriend_conversation_bg.png, [self.bgButtonsetBackgroundImage:[[UIImageimageNamed:"conversation_bg.png"] stretchableImageWithLeftCapWidth:10topCapHeight:30] forState:UIControlStateNormal]; xy方向 找 两根线 来 拉伸,…

linux 删除node进程,关于node.js:杀死Linux中的节点进程

尝试使用节点server.js运行节点服务器时,我收到侦听EADDRINUSE ::: 4002的错误。 我通过以下命令在端口4002上监听进程:sudo lsof -i:4002。 之后,我尝试使用kill -9终止进程。 问题是当我在终止进程后再次运行sudo lsof -i&#…

MS SQL查询库、表、列数据结构信息汇总

前言 一般情况我们下,我们是知道数据库的表、列信息的(因为数据库是我们手动设计),但特殊情况下,如果你只能拿到数据库连接信息,也就是知道的一个数据库名的情况下,你要怎么得到它下面的所有表…

linux 程序占内存,linux下,一个运行中的程序,究竟占用了多少内存

1. 在linux下,查看一个运行中的程序, 占用了多少内存, 通常的命令有php(1). ps aux:html其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存。linuxRSS列 表示, 程序占用了多少物理内存。ios虚拟内存能够不用…

C#常用代码汇总

1、字符串首字母转为大写。 System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase("字符串"); 2、winform选取文件及文件夹。 // 选取文件OpenFileDialog openFileDialog new OpenFileDialog();openFileDialog.Filter "文本文件|*.*|C#文件…

如何搭建一个完整的Vue3.0 + ts 的项目

如何搭建一个完整的Vue3.0 ts 的项目 相信9月18日尤大大的关于Vue3.0的发表演讲大家一定有所关注,现在Vue3.0 也已经进入RC阶段(最终产品的候选版本,如果没有问题则可发布成为正式版本)。所以Vue3.0的学习是我们必然的趋势,今天&…

C#下2\10\16进制互转代码总汇

1、十进制转换其他:Convert.ToString(十进制数字, 2|8|16进制模式) //十进制转二进制Convert.ToString(69, 2);//十进制转八进制Convert.ToString(69, 8);//十进制转十六进制Convert.ToString(69, 16); 2、其他进制转换十进制:Convert.ToInt32(待转换数…

手机客户端和服务器端通信

2019独角兽企业重金招聘Python工程师标准>>> 手机客户端与服务器端的通信,不同于浏览器与服务器端的通信。浏览器和服务器端的通信依靠session去维持一个会话, 当这一切搬到手机上仿佛一切都失效了。 1.在上一家公司的时候公司同事曾经问过我…

linux下boot文件是什么文件,Boot.ini是什么文件?Boot.ini文件在哪里

Boot.ini 文件是系统启动引导程序文件,装多系统或者重装系统的时候会用到它。因此,由于系统启动而造成的问题也不在少数,那Boot.ini是什么文件呢?Boot.ini文件在哪里?下面就跟小编一起去了解一下吧!步骤如下…

Kubeflow使用Kubernetes进行机器学习GPU分布式训练

Kubeflow使用Kubernetes进行机器学习 Kubeflow是Google推出的基于kubernetes环境下的机器学习组件,通过Kubeflow可以实现对TFJob等资源类型定义,可以像部署应用一样完成在TFJob分布式训练模型的过程。最初的设计是将Kubernetes和Tensorflow结合实现对Te…

Net操作配置文件(Web.config|App.config)通用类

一、Net操作web.config通用类(代码如下): using System;using System.Configuration;using System.Web;using System.Web.Configuration;/// ConfigurationOperator 的摘要说明public class ConfigurationOperator : IDisposable{private Con…

hibernate 程序运行时的错误,及解决办法(不定期更新)

这个错误是因为&#xff1a;没有配置hibernate.cfg.xml中的最后一项 <mapping resource"org/hibernate/first/model/Student.hbm.xml"/>这个错误是因为&#xff1a;在配置hibernate缓存的时候出的错&#xff0c;我就把我这个缓存代码删除掉了。代码如下<pro…

嵌入式linux设计师,make在linux——《嵌入式linux设计与应用》

程序模块的内部关系决定了源程序编译和链接的顺序。通过建立makefile可以描述模块间的 相互依赖关系。make命令从中读取这些信息&#xff0c;然后根据这些信息对程序进行管理和维护。在makefile 里主要提供的是有关目的文件与依靠文件之间的关系&#xff0c;还指明了用什么命令…

kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤

kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤 Kubeflow使用场景 希望训练tensorflow模型且可以使用模型接口发布应用服务在k8s环境中(eg.local,prem,cloud) 希望使用Jupyter notebooks来调试代码&#xff0c;多用户的notebook server 在训练的Job中&#xff0c;需要对…

T-Sql备份还原数据库

代码如下&#xff1a; -- 备份数据库BACKUP DATABASE 数据库名称 TO DISK 物理存储位置 WITH FORMAT,CHECKSUM -- 还原数据库alter database 数据库名称 set offline with rollback immediate -- 设置数据库脱机RESTORE FILELISTONLY From disk 待还原文件地址 --查询待…

PHP拦截器的使用(转)

PHP有如下几个拦截器&#xff1a; 1、__get($property)功能&#xff1a;访问未定义的属性是被调用2、__set($property, $value)功能&#xff1a;给未定义的属性设置值时被调用3、__isset($property)功能&#xff1a;对未定义的属性调用isset()时被调用4、__unset($property)功能…

linux线程负载,linux 排查cpu负载过高异常(转载)

问&#xff1a;如何定位是哪个服务进程导致CPU过载&#xff0c;哪个线程导致CPU过载&#xff0c;哪段代码导致CPU过载&#xff1f;步骤一、找到最耗CPU的进程工具&#xff1a;top方法&#xff1a;执行top -c &#xff0c;显示进程运行信息列表键入P (大写p)&#xff0c;进程按照…

Net操作Excel(终极方法NPOI)

前言 Asp.net/C#操作Excel已经是老生长谈的事情了&#xff0c;可下面我说的这个NPOI操作Excel&#xff0c;应该是最好的方案了&#xff0c;没有之一&#xff0c;使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件&#xff0c;支持的文件格式包括xl…