手势识别任务指南

借助 MediaPipe 手势识别程序任务,您可以实时识别手势,并提供识别出的手势结果以及检测到的手的特征点。您可以使用此任务识别用户的特定手势,并调用与这些手势对应的应用功能。

此任务使用机器学习 (ML) 模型对图片数据执行操作,并接受静态数据或连续流。该任务会输出图像坐标中的手部地标、世界坐标中的手部地标、惯用手(左手/右手)以及多手的手势类别。

试试吧!

开始使用

如需开始使用此任务,请按照适用于您的目标平台的其中一个实现指南进行操作。这些平台专用指南将引导您使用推荐的模型完成此任务的基本实现,并提供包含推荐配置选项的代码示例:

任务详情

本部分介绍此任务的功能、输入、输出和配置选项。

特性

  • 输入图片处理 - 处理包括图片旋转、调整大小、归一化和颜色空间转换。
  • 分数阈值 - 根据预测分数过滤结果。
  • 标签许可名单和拒绝名单 - 指定模型可识别的手势类别。
任务输入 任务输出
手势识别程序接受以下任一数据类型的输入:
  • 静态图片
  • 已解码的视频帧
  • 实时视频画面
手势识别程序输出以下结果:
  • 手势的类别
  • 检测到的手的惯用手
  • 图片坐标中检测到的手部的地标
  • 世界坐标中检测到的手部的地标

配置选项

此任务具有以下配置选项:

选项名称 说明 值范围 默认值
running_mode 设置任务的运行模式。有三种模式:

IMAGE:单张图片输入的模式。

VIDEO:视频的已解码帧的模式。

LIVE_STREAM:输入数据(例如来自摄像头)的直播的模式。在此模式下,必须调用 resultListener 来设置监听器,以异步接收结果。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands GestureRecognizer 可检测出手的数量上限。 Any integer > 0 1
min_hand_detection_confidence 要在手掌检测模型中被视为成功的手部检测的最低置信度分数。 0.0 - 1.0 0.5
min_hand_presence_confidence 手部特征点检测模型中手部存在分数的最低置信度分数。在手势识别程序的视频模式和直播模式下,如果手部特征点模型的手部存在置信度分数低于此阈值,则会触发手掌检测模型。否则,将使用轻量级手部跟踪算法确定手部位置,以便进行后续地标检测。 0.0 - 1.0 0.5
min_tracking_confidence 手部跟踪被视为成功所需的最低置信度分数。这是当前帧和最后一帧中手之间的边界框 IoU 阈值。在手势识别程序的视频模式和流模式下,如果跟踪失败,手势识别程序会触发手部检测。否则,系统会跳过手部检测。 0.0 - 1.0 0.5
canned_gestures_classifier_options 用于配置预设手势分类器行为的选项。预设手势如下:["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • 显示名称语言区域:要用于通过 TFLite 模型元数据(如果有)指定的显示名称的语言区域。
  • 最大结果数:要返回的得分最高的分类结果的数量上限。如果小于 0,将返回所有可用的结果。
  • 得分阈值:如果得分低于该得分,则结果将被拒绝。如果设置为 0,将返回所有可用的结果。
  • 类别许可名单:类别名称的许可名单。如果为非空,则会过滤掉类别不在此集合中的分类结果。它与拒绝名单互斥。
  • 类别拒绝名单:类别名称的拒绝名单。如果为非空,则会过滤掉类别在此集合中的分类结果。此政策与许可名单相互排斥。
    • 显示名称语言区域:any string
    • 结果数上限:any integer
    • 分数阈值:0.0-1.0
    • 类别许可名单:vector of strings
    • 类别拒绝名单:vector of strings
    • 显示名称语言区域:"en"
    • 结果数上限:-1
    • 分数阈值:0
    • 类别许可名单:空
    • 类别拒绝名单:空
    custom_gestures_classifier_options 用于配置自定义手势分类器行为的选项。
  • 显示名称语言区域:要用于通过 TFLite 模型元数据(如果有)指定的显示名称的语言区域。
  • 最大结果数:要返回的得分最高的分类结果的数量上限。如果小于 0,将返回所有可用的结果。
  • 得分阈值:如果得分低于该得分,则结果将被拒绝。如果设置为 0,将返回所有可用的结果。
  • 类别许可名单:类别名称的许可名单。如果为非空,则会过滤掉类别不在此集合中的分类结果。它与拒绝名单互斥。
  • 类别拒绝名单:类别名称的拒绝名单。如果为非空,则会过滤掉类别在此集合中的分类结果。此政策与许可名单相互排斥。
    • 显示名称语言区域:any string
    • 结果数上限:any integer
    • 分数阈值:0.0-1.0
    • 类别许可名单:vector of strings
    • 类别拒绝名单:vector of strings
    • 显示名称语言区域:"en"
    • 结果数上限:-1
    • 分数阈值:0
    • 类别许可名单:空
    • 类别拒绝名单:空
    result_callback 设置结果监听器,以在手势识别器处于直播模式时异步接收分类结果。 只能在跑步模式设为“LIVE_STREAM”时使用 ResultListener N/A N/A

    模型

    手势识别程序使用的模型包中含有两个预封装的模型包:手部特征点模型包和手势分类模型包。地标模型会检测是否存在手部和手部几何图形,而手势识别模型则会根据手部几何图形来识别手势。

    模型名称 输入形状 量化类型 模型卡片 Versions
    HandGestureClassifier 192 x 192、224 x 224 浮点数 16 信息 最新动态

    此任务还支持使用 Model Maker 修改模型包。如需详细了解如何使用 Model Maker 针对此任务自定义模型,请参阅为手势识别程序自定义模型页面。

    手部特征点模型包

    手部特征点模型包可检测已检测到的手部区域内 21 个指节坐标的关键点定位。该模型基于大约 3 万张真实图像以及对各种背景施加的几个渲染合成手部模型进行了训练。请参阅以下 21 个地标的定义:

    手部特征点模型包包含手掌检测模型和手部特征点检测模型。手掌检测模型会定位整个输入图片中的手部区域,手部特征点检测模型会从手掌检测模型找出剪裁好的手部图片上的特征点。

    由于手掌检测模型要耗费很多时间,因此在视频模式或直播模式下,手势识别程序会使用当前帧中检测到的手部特征点定义的边界框来定位下一帧中的手部区域。这样可以缩短手势识别程序触发手掌检测模型的次数。仅当手部特征模型无法再识别所需的足够数量的手部位,或手部跟踪失败时,才会调用手掌检测模型来重新定位手部位置。

    手势分类模型软件包

    手势分类模型包可以识别以下常见的手势:

    0 - Unrecognized gesture, label: Unknown
    1 - Closed fist, label: Closed_Fist
    2 - Open palm, label: Open_Palm
    3 - Pointing up, label: Pointing_Up
    4 - Thumbs down, label: Thumb_Down
    5 - Thumbs up, label: Thumb_Up
    6 - Victory, label: Victory
    7 - Love, label: ILoveYou
    

    如果模型检测到手,但无法识别手势,则手势识别程序会返回“无”的结果。如果模型未检测到手,手势识别器将返回空值。

    手势分类模型包包含两步神经网络流水线,其中包含手势嵌入模型,后跟手势分类模型。如需了解详情,请参阅手势分类模型卡片

    手势嵌入模型将图片特征编码为特征向量,分类模型则是接受特征向量作为输入的轻量级手势分类器。提供的手势分类模型包包含预设手势分类器,可检测上面介绍的 7 种常见手势。您可以通过训练自己的自定义手势分类器,扩展模型包来识别更多手势。如需了解详情,请参阅下面的自定义模型部分。

    如果同时提供预设手势分类器和自定义手势分类器的手势识别程序,如果这两个分类器在各自类别中识别出同一手势,则会优先使用自定义手势。如果只有一个手势分类器能够识别该手势,手势识别程序会直接输出识别出的手势。

    任务基准

    以下是基于上述预训练模型的整个流水线的任务基准。延迟时间结果是 Pixel 6 使用 CPU / GPU 时的平均延迟时间。

    模型名称 CPU 延迟时间 GPU 延迟时间
    GestureRecognizer 16.76 毫秒 20.87 毫秒

    自定义模型

    如果要改进或更改此任务中提供的模型的功能,可以使用 Model Maker 修改现有模型。与 MediaPipe 搭配使用的自定义模型必须采用 .task 格式,即模型包文件。您应该考虑先使用 Model Maker 修改为此任务提供的模型,然后再构建您自己的模型。

    如需详细了解如何为此任务自定义模型,请参阅为手势识别程序自定义模型