论文精读 MediaPipe Hands

MediaPipe Hands:On-device Real-time Hand Tracking

MediaPipe手势:设备上的实时手势跟踪

论文地址:2006.10214.pdf (arxiv.org)

源码地址:GitHub - vidursatija/BlazePalm: PyTorch

 

目录

摘要

介绍

架构

BlazePalm Detector

Hand Landmark Model

Dataset and Annotation

Result

Implementation in MediaPipe

Application examples

结论

代码


1 摘要

我们提出了一种实时的设备手跟踪解决方案,该解决方案可以从AR/VR应用的单个RGB相机预测人类的手骨架。我们的管道由两个模型组成:

  • 1)手掌检测器,它为手掌提供一个边界框
  • 2)hand landmarks 模型,它预测手掌骨架

它是通过MediaPipe[12]实现的,这是一个用于构建跨平台ML解决方案的框架。所提出的模型和流水线结构证明了移动GPU上的实时推理速度和高预测质量。MediaPipe Hands的源代码为MediaPipe Studio (google.com).

[12] Camillo Lugaresi,Jiuqiang Tang,Hadon Nash,Chris Mc-Clanahan,Esha Uboweja,Michael Hays,Fan Zhang,Chuo-Ling Chang,Ming Guang Yong,Juhyun Lee,Wan-TehChang,Wei Hua,Manfred Georg,and Matthias Grundmann.Mediapipe:A framework for building perception pipelines.volume abs/1906.08172,2019.

图1:渲染的手跟踪结果

  • (左):用不同色调呈现相对深度的hand landmarks。圆圈越轻、越大,地标就越靠近相机。
  • (右):像素3上的实时多手跟踪。

2 介绍

手部跟踪是为AR/VR中的交互和通信提供自然方式的重要组成部分,也是行业中一个活跃的研究课题[2][15]。基于视觉的手部姿态估计已经研究了多年。以前的大部分工作需要专门的硬件,例如深度传感器[13][16][17][3][4]。其他解决方案不够轻,无法在商品移动设备上实时运行[5],因此仅限于配备强大处理器的平台。在本文中,我们提出了一种新的解决方案,该解决方案不需要任何额外的硬件,并在移动设备上实时执行。我们的主要贡献是:

  1. 一个高效的两阶段手部跟踪管道,可以在移动设备上实时跟踪多只手。
  2. 一种手部姿势估计模型,能够仅使用RGB输入预测2.5D手部姿势。
  3. 以及开源手跟踪管道,作为各种平台上的现成解决方案,包括Android、iOS、Web(Tensorflow.js)和台式电脑。

3 架构

我们的手部跟踪解决方案利用了一个ML管道,该管道由两个协同工作的模型组成:

  • 一种手掌检测器,对全输入图像进行操作,并通过定向的手边界框定位手掌。
  • 在手掌检测器提供的裁剪的手边界框上操作并返回高保真度2.5D界标的手界标模型。

将精确裁剪的手掌图像提供给手部地标模型大大减少了对数据分析(如旋转、平移和缩放)的需求,并使网络能够将其大部分容量用于地标定位的准确性。在实时跟踪场景中,我们从前一帧的地标预测中导出一个边界框,作为当前帧的输入,从而在每一帧上应用检测器。相反,检测器仅应用于第一帧或当手部预测指示手部丢失时。

3.1 BlazePalm Detector

为了检测手部的初始位置,我们使用了一个针对移动实时应用优化的单次检测模型,类似于BlazeFace[1],也可在MediaPipe[12]中获得。检测手部是一项非常复杂的任务:我们的模型必须在大尺度跨度(~20x)的各种手部尺寸上工作,并且能够检测被遮挡和自遮挡的手部。尽管人脸有高对比度的图案,例如眼睛和嘴巴周围,但手上没有这些特征,因此很难单独从视觉特征中可靠地检测到它们。

我们的解决方案使用不同的策略来解决上述挑战。

首先,我们训练手掌检测器而不是手检测器,因为估计手掌和拳头等刚性物体的边界框比检测有关节手指的手要简单得多。此外,由于手掌是较小的对象,非最大值抑制算法即使在双手自遮挡的情况下也能很好地工作,比如握手。此外,手掌可以只使用方形绑定框(SSD)进行建模,忽略其他纵横比,从而将锚的数量减少3~5倍。

其次,我们使用类似于FPN[9]的编码器-解码器特征提取器来实现更大的场景上下文感知,即使对于小对象也是如此。

图2:手掌探测器模型架构 

最后,我们最大限度地减少了训练过程中的焦点损失(Focal loss for dense object detection),以支持由高尺度方差引起的大量锚。高级手掌探测器架构如图2所示。我们在表1中对我们的设计元素进行了消融研究。

3.2 Hand Landmark Model

在对整个图像进行手掌检测后,我们随后的 hand landmark 模型通过回归对检测到的手部区域内的21个2.5D坐标进行精确的陆地标记定位。该模型学习一致的手部内部姿势表示,即使对部分可见的手部和自遮挡也很稳健。该模型有三个输出(见图3):

图3:我们的手动地标模型的架构。该模型有三个输出,共享一个特征提取器。每个头部都由标记为相同颜色的相应数据集进行训练。详见第2.2节。

  • 由x、y和相对深度组成的21个手部标志。
  • 指示手在输入图像中存在的概率的手标志。
  • 利手性的二元分类,例如左手或右手。

对于21个地标,我们使用与[14]相同的拓扑结构。2D坐标是从真实世界的图像和合成数据集中学习的,如下所述,腕点的相对深度w.r.t.仅从合成图像中学习。为了从跟踪失败中恢复,我们开发了类似于[8]的模型的另一个输出,以降低所提供的作物中确实存在合理对准的手的事件概率。如果分数低于阈值,则检测器被触发以重新跟踪。手性是AR/VR中使用手进行有效交互的另一个重要属性。这对于每只手都与独特功能相关联的一些应用程序尤其有用。因此,我们开发了一个二进制分类头来预测输入手是左手还是右手。我们的设置针对实时移动GPU推理,但我们也设计了更轻和更重的模型版本,以解决移动设备上的CPU推理问题,这些移动设备分别缺乏适当的GPU支持和在桌面上运行的更高精度要求。

4 Dataset and Annotation

为了获得地面实况数据,我们创建了以下数据集来解决问题的不同方面:

  • 野外数据集:该数据集包含6K的各种图像,如地理多样性、各种照明条件和手部外观。这个数据集的局限性在于它不包含复杂的手关节。
  • 内部收集的手势数据集:该数据集包含10K张图像,涵盖了所有可能的手势的不同角度。这个数据集的局限性在于,它只收集了30个人,背景变化有限。野外数据集和内部数据集相互补充,以提高稳健性。
  • 合成数据集:为了更好地覆盖可能的手部姿势并为深度提供额外的监督,我们在各种背景下绘制了一个高质量的合成手部模型,并将其映射到相应的3D坐标。我们使用了一个商业3Dhand模型,该模型配有24块骨头,包括36个混合形状,可以控制手指和手掌的厚度。该模型还提供了5种不同肤色的纹理。我们创建了手部姿势转换的视频序列,并从视频中采样了10万个图像。我们用一个高动态范围的照明环境和三个不同的相机渲染了每个姿势。示例见图4。

对于手掌检测器,我们只在野外数据集中使用,这足以定位手,并且在外观上提供了最高的多样性。然而,所有数据集都用于训练hand landmark模型。我们用21个landmarks对真实世界的图像进行注释,并使用投影的地面实况3D关节来合成图像。对于手的存在,我们选择真实世界图像的子集作为正示例,并在该区域上采样,不包括注释的手区域作为负示例。对于利手性,我们用利手性对一组真实世界的图像进行注释,以提供这样的数据。

图4:我们的数据集示例。

  • (顶部):带注释的真实世界图像。
  • (底部):带有地面实况注释的渲染合成手图像。详见第3节。 

5 Result

对于手部里程碑模型,我们的实验表明,真实世界和合成数据集的组合提供了最佳结果。详见表2。我们只根据真实世界的图像进行评估。除了质量改进之外,使用大型合成数据集进行训练还可以减少帧间的视觉抖动。这一观察结果使我们相信,我们的真实世界数据集可以被放大以更好地泛化。

表1:手掌探测器的消融研究手掌探测器的设计元素(解码器和损失函数)。

 

表2:我们的模型从不同数据集训练的结果。

表3:手动地标模型性能特征

我们的目标是在移动设备上实现实时性能。我们对不同尺寸的模型进行了实验,发现“完整”模型(见表3)在质量和速度之间提供了良好的权衡。增加模型容量只会在质量上带来微小的改进,但速度会显著降低(详见表3)。我们使用TensorFlow Lite GPU后端进行设备上推理[6]。

6 Implementation in MediaPipe

使用MediaPipe[12],我们的手跟踪管道可以构建为模块化组件的有向图,称为计算器。Mediapipe提供了一组可扩展的计算器,用于解决各种设备和平台上的模型推理、媒体处理和数据转换等任务。裁剪、渲染和神经网络计算等单独的计算器被进一步优化,以利用GPU加速。例如,我们在大多数现代手机上使用TFLite GPU推理。

图5:当触发手部检测模型时,hand landmark 模型输出控制。这种行为是通过MediaPipes强大的同步构建块实现的,从而实现ML管道的高性能和最佳吞吐量。 

我们的手部跟踪MediaPipe图如图5所示。该图由两个子图组成,一个子图用于手部检测,另一子图用于landmark计算。MediaPipe提供的一个关键优化是,手掌可以根据需要检测运行(很少),从而节省大量计算。我们通过从前一帧中计算的手部着陆标记推导当前视频帧中的手部位置来实现这一点,从而无需在每一帧上应用手掌检测器。为了鲁棒性,手跟踪器模型还输出一个额外的标量,该标量捕获手在输入裁剪中存在并合理对齐的置信度只有当置信度低于某个阈值时,手部检测模型才重新应用于下一帧。

7 Application examples

图6:实时手势识别的屏幕截图。手势的语义呈现在图像的顶部。 

图7:基于我们预测的手部骨骼的实时AR效果示例。 

我们的手跟踪解决方案可以很容易地用于许多应用,如手势识别和AR效果。在预测的手骨架之上,我们使用一个简单的算法来计算手势,见图6。首先,每个手指的状态,例如弯曲或笔直,是通过关节的累积角度来确定的。然后,我们将一组手指状态映射到一组预定义的手势。这种简单而有效的技术使我们能够以合理的质量估计基本的静态手势。除了静态手势识别之外,还可以使用一系列地标来预测动态手势。另一个应用程序是在骨骼顶部应用AR效果。基于手的AR效果目前很受欢迎。在图7中,我们展示了一个霓虹灯风格的手骨架的AR渲染示例。

8 结论

在本文中,我们提出了MediaPipe Hands,这是一种端到端的手部跟踪解决方案,可在多个平台上实现实时性能。我们的管道在没有任何专门硬件的情况下预测2.5D地标,因此可以轻松地部署到商品设备上。我们开源了该管道,以鼓励研究人员和工程师利用我们的管道构建手势控制和创造性的AR/VR应用程序。

代码

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
        static_image_mode=False,
        max_num_hands=2,
        min_detection_confidence=0.75,
        min_tracking_confidence=0.75)

cap = cv2.VideoCapture(0)
while True:
    ret,frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    frame= cv2.flip(frame, 1)
    results = hands.process(frame)
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

    if results.multi_hand_landmarks:
      for hand_landmarks in results.multi_hand_landmarks:
        print('hand_landmarks:', hand_landmarks)
        mp_drawing.draw_landmarks(
            frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
    cv2.imshow('MediaPipe Hands', frame)
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()

>>> 如有疑问,欢迎评论区一起探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java实现的轻量级私有云平台,让企业拥有自己的云平台

一、开源项目简介 KVM Cloud 是一款基于Java实现的轻量级私有云平台,旨在帮助中小企业快速实现计算、存储、网络等资源的管理,让企业拥有自己的云平台。 二、开源协议 使用Apache-2.0开源协议 三、界面展示 四、功能概述 KVM Cloud 是一款基于Java实…

Cesium和Three.js的初步认识

一、Threejs和Cesium的对比 相同点: 都是基于WebGL技术开发的Javascript库,用于在浏览器中创建和显示动画3D计算机图形。 不同点: Threejs:受众面比较广,是封装了webgl的一些底层用法,让初学者更容易上…

Istio学习笔记- 服务网格

Istio 服务网格 参考:Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥…

DNS域名解析服务

1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址,通过IP 地址实现不同计算机之间的相互通信,每台联网计算机都需要通过I 地址来互相联系和分别,但由于P 地址是由一串容易混淆的数字串构成,人们很难记忆所有计算机的…

labview实现仪器的控制visa

*IDN? 是识别大多数仪器的查询指令。仪器会回应一个用于描述仪器的识别字符串。如果仪器不接受该指令,请在仪器手册中查询仪器能识别的指令列表。 如下图所示: 程序如下:

【汇编】计算机的组成

文章目录 前言一、计算机的基本组成1.1 中央处理器(CPU)1.2 内存指令和数据存储的位置计算机中的存储单元计算机中的总线地址总线数据总线控制总线 1.3 输入设备和输出设备1.4 存储设备 二、计算机工作原理三、计算机的层次结构总结 前言 计算机是现代社…

容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql 2. 如何容器化部署nacos 为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址,所有的localhost都应该调整为你自己的服务器地址。 为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址&#x…

Centos上删除文件及目录的命令积累

01-如果我想删除Centos上当前目录下的文件 test06-2023-11-14-01.sql 该怎么操作? 答:如果你想删除CentOS上当前目录下的文件 test06-2023-11-14-01.sql,可以使用 rm 命令。以下是删除文件的基本语法: rm test06-2023-11-14-01.s…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断: if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

BGP路由控制实验

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、IP地址配置 2、As 200 内部配置OSPF 3、建立BGP邻居关系 4、宣告网段,在BGP中传递网段 5、通过修改MED 使 R1 到达 192.168.2.0/24 网段的路由经过 R3 6、通过修改Preferred-value 属性,使 R4 …

6.6二叉树的最大深度(LC104-E)、N叉树的最大深度(LC559-E)

二叉树的最大深度: 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二叉树的最大深度二叉树的高度 算法: 这道题既可以求深度,也可以直接求高度。不过高度和深度用的遍历方式不同。 二叉树写代码之前要确定遍历顺序…

从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)

🎏:你只管努力,剩下的交给时间 🏠 :小破站 从零开始,掌握Nacos 前言:前提:建表语句第一: 单节点搭建:第二: 集群搭建:第三&#xff1a…

BUUCTF 来首歌吧 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 密文: 下载附件,解压得到一个.wav音频文件。 解题思路: 1、得到一个音频文件,放到Audacity看看。看到有两条音轨,放大上面的那条音轨,看到这…

Shiro快速入门之三

一、前言 接Shiro快速入门之二,上篇侧重于介绍认证,这篇介绍一下Shiro的授权,先初始化5张表的数据。 注:创建三条权限记录,一个admin角色分配查询和添加用户权限,一个账户qingcai18036授予管理员角色。 二…

python数据结构与算法-04_队列

队列和栈 前面讲了线性和链式结构,如果你顺利掌握了,下边的队列和栈就小菜一碟了。因为我们会用前两章讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似,队列是先进先出结构(FIFO, first in first out), 栈是…

android studio开发flutter应用,使用mumu模拟器调试软件

安装好mumu模拟器,先打开网易mumu模拟器的开发者模拟。系统应用 > 设置 > 关于手机 > 版本号 多点击几次调出开发者模式: 然后在android studio中刷新设备列表,就能看到新设备了: 如何确定这个设备就是你的mumu模拟器呢…

2012年11月10日 Go生态洞察:Go语言三周年回顾

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

预览PDF并显示当前页数

这里写目录标题 步骤实例实例效果图 步骤 1.安装依赖 npm install --save vue-pdf2.在需要的页面&#xff0c;引入插件 import pdf from vue-pdf3.使用 单页pdf可以直接使用 <pdf :src"获取到的pdf地址"></pdf>多页pdf通过循环实现 html标签部分 &l…

电子零部件工厂的WMS系统:业务特点、产品特点与优势

一、电子零部件工厂的业务特点 电子零部件工厂的业务涉及各种电子元器件的生产、组装和配送。其业务特点包括&#xff1a; 高度复杂性&#xff1a;电子零部件工厂的生产流程涉及多种原材料、半成品和成品&#xff0c;每种产品都有不同的规格、属性及存储要求。 严格的质量控…