MoveNet 和 TensorFlow Lite 在边缘设备上的姿势估计和分类
2021 年 8 月 16 日

发布者 Khanh LeViet,TensorFlow 开发者倡导者和 Yu-hui Chen,软件工程师

MoveNet iOS 示例已发布。在 GitHub 上查看。

自从 MoveNet 在今年早些时候的 Google I/O 上发布以来,我们收到了很多积极的反馈和功能请求。今天,我们很高兴与大家分享几个更新。

  • MoveNet 的 TensorFlow Lite 版本现已在 TensorFlow Hub 上可用。这包括一些更新,以提高准确性并使其与硬件加速器兼容,包括 GPU 和通过 Android NN API 可用的其他加速器。
  • 我们发布了一个新的 AndroidRaspberry Pi 姿势估计示例,让您可以在移动设备和物联网设备上试用 MoveNet。(iOS 即将推出)
  • 我们还发布了一个 Colab 笔记本,教您如何使用 MoveNet 进行自定义姿势分类(例如,识别不同的瑜伽姿势)。您可以在前面提到的 Android、iOS 和 Raspberry Pi 应用程序上尝试姿势分类。

什么是姿势估计?

Gif of pose estimation using machine learning

姿势估计是一个机器学习任务,它通过估计特定身体部位(关键点)的空间位置,从图像或视频中估计一个人的姿势。MoveNet 是一种最先进的姿势估计模型,可以检测这些 17 个关键点。

  • 鼻子
  • 左眼和右眼
  • 左耳和右耳
  • 左肩和右肩
  • 左肘和右肘
  • 左腕和右腕
  • 左髋和右髋
  • 左膝和右膝
  • 左脚踝和右脚踝

我们发布了 MoveNet 的两个版本。

  • MoveNet.Lightning 比 Thunder 版本更小、更快,但准确性较低。它可以在现代智能手机上实时运行。
  • MoveNet.Thunder 是更准确的版本,但它也比 Lightning 更大、更慢。

MoveNet 模型在各种基准数据集上优于 Posenet(论文博客文章模型),我们之前的 TensorFlow Lite 姿势估计模型,(见下表中的评估/基准测试结果)。

这些 MoveNet 模型在 TensorFlow Lite FP16 和 INT8 量化格式中都可用,最大限度地提高了与硬件加速器的兼容性。

此版本的 MoveNet 可以识别输入图像中的单个姿势。如果图像中有多个人,模型以及裁剪算法将尽力集中在最靠近图像中心的一个人。我们还实现了一种智能裁剪算法来提高视频的检测准确率。简而言之,模型将放大在之前帧中检测到姿势的区域,以便模型可以看到更精细的细节并在当前帧中做出更好的预测。

如果您有兴趣深入了解 MoveNet 的实现细节,请查看一篇早期博客文章,包括其模型架构和训练它的数据集。

Android 和 Raspberry Pi 示例应用程序

我们发布了针对这些平台的新的姿势估计示例应用程序,以便您可以在选择的平台上快速试用不同的姿势估计模型(MoveNet Lightning、MoveNet Thunder、Posenet)。

  • Android 示例
  • iOS 示例
  • Raspberry Pi 示例

在 Android 和 iOS 示例中,您还可以选择加速器(GPU、NNAPI、CoreML)来运行姿势估计模型。

Screenshot of the Android sample app. The image is from Pixabay.

Android 示例应用程序的屏幕截图。图像来自 Pixabay

MoveNet 性能

我们优化了 MoveNet,使其在 TensorFlow Lite 支持的硬件加速器(包括 GPU 和通过 Android NN API 可用的加速器)上运行良好。此性能基准测试结果可以帮助您选择最适合您的用例的运行时配置。

模型

大小(MB)

mAP*

延迟(毫秒)**

Pixel 5 - 
CPU 4 线程

Pixel 5 - GPU

Raspberry Pi 4 - CPU 4 线程

MoveNet.Thunder(FP16 量化)

12.6MB

72.0

155毫秒

45毫秒

594毫秒

MoveNet.Thunder(INT8 量化)

7.1MB

68.9

100毫秒

52毫秒

251毫秒

MoveNet.Lightning(FP16 量化)

4.8MB

63.0

60毫秒

25毫秒

186毫秒

MoveNet.Lightning(INT8 量化)

2.9MB

57.4

52毫秒

28毫秒

95毫秒

PoseNet
(MobileNetV1 骨干网,FP32)

13.3MB

45.6

80毫秒

40毫秒

338毫秒

* mAP 是在 COCO 关键点数据集的子集上测量的,我们过滤并裁剪每个图像以仅包含一个人。

** 延迟是在持续负载下使用 Android 和 Raspberry Pi 示例应用程序和 TensorFlow 2.5 进行端到端测量的。

以下是一些关于如何选择使用哪种模型和加速器的提示。

  • 选择 Lightning 或 Thunder。首先,您应该查看 Lightning 版本的准确性是否足以满足您的用例。
    • 如果 Lightning INT8 模型的准确性足够好,那么就选择它,因为它是在阵容中最小的、最快的模型。更快的模型也意味着更少的电池消耗。
    • 如果您的用例要求高准确性,请使用 Thunder FP16 模型。
  • 选择加速器。加速器性能在不同制造商的 Android 设备之间差异很大。
    • CPU 是最安全、最简单的选择,因为您可以确信它将在几乎所有可以运行 TensorFlow Lite 的 Android 设备上运行。但是,它通常比在加速器上运行模型更慢,并且消耗更多电量。所有 MoveNet 模型都可以在 CPU 上运行良好,因此您应该根据您的准确性需求选择模型。
    • GPU 是最广泛可用的加速器,可以提供相当可观的性能提升。如果您想利用 GPU,请选择 FP16 量化模型。
    • Android NNAPI 是一种在 Android 设备上访问其他 ML 加速器的便捷方法。如果您已经将 CPU 或 GPU 用于其他工作负载,并且您的用户的设备运行 Android 10 或更高版本,那么您可以选择一个适合您准确性需求的模型,并让 NNAPI 选择它认为最适合您的模型的路径。
    • 如果您是物联网开发者,您可能希望使用 Coral 来提高推理速度。在此处查看 Coral 的基准测试数据 此处
  • 通过无线方式部署模型,而不是将其捆绑在应用程序二进制文件中。由于 Android 生态系统的多样性,没有一个模型是针对所有用户都是最优的。对于使用低端设备的用户来说,Lightning INT8 模型可能是最优的,因为它速度最快,并且消耗的电池最少。但是,对于使用高端设备的用户来说,您可能希望使用 Thunder FP16 模型来提供更好的性能。如果您希望根据用户设备更改模型,请考虑使用免费的 Firebase ML 来托管您的模型,而不是将您打算使用的所有模型都捆绑到您的应用程序中。您可以编写一个逻辑,在用户开始使用需要 TFLite 模型的应用程序中的功能时,为每个用户的设备下载最优模型。

姿势分类

虽然姿势估计模型告诉您姿势关键点的位置,但在许多健身应用程序中,您可能希望更进一步,对姿势进行分类,例如,它是瑜伽女神姿势还是平板支撑姿势,以便向您的用户提供相关信息。

为了使姿势分类更容易实现,我们还发布了一个 Colab 笔记本,教你如何使用 MoveNet 和 TensorFlow Lite 从自定义姿势数据集训练自定义姿势分类模型。这意味着,如果你想识别瑜伽姿势,你只需要收集你想要识别的姿势的图像,对它们进行标注,然后按照教程训练并部署一个瑜伽姿势分类器到你的应用程序中。

姿势分类器包含两个阶段

  1. 使用 MoveNet 从输入图像中检测关键点。
  2. 使用一个小的 TensorFlow Lite 模型从检测到的关键点对姿势进行分类。
An example of pose classification using MoveNet. The input image is from Pixabay.

使用 MoveNet 进行姿势分类的示例。输入图像来自 Pixabay

为了训练一个自定义姿势分类器,你需要准备姿势图像并将它们放入以下文件夹结构中。每个子文件夹名称是你想要识别的类别的名称。然后你可以运行 笔记本 来训练一个自定义姿势分类器并将其转换为 TensorFlow Lite 格式。

yoga_poses
|__ downdog
    |______ 00000128.jpg
    |______ 00000181.bmp
    |______ ...
|__ goddess
    |______ 00000243.jpg
    |______ 00000306.jpg
    |______ ...
...

姿势分类 TensorFlow Lite 模型非常小,只有大约 30KB。它获取 MoveNet 输出的特征点,对姿势坐标进行归一化,并将其馈送到几个全连接层。模型输出是一个概率列表,表示姿势是每个已知姿势类型的概率。

Overview of the pose classification TensorFlow Lite model
姿势分类 TensorFlow Lite 模型概述。

你可以在我们刚刚发布的任何姿势估计示例应用程序中尝试你的姿势分类模型,例如适用于 AndroidRaspberry Pi 的应用程序。

下一步

我们的目标是提供姿势估计和动作识别的核心引擎,以便开发人员可以在其基础上构建创意应用程序。以下是我们正在积极开发的一些方向

  • 一个改进版本的 MoveNet,它可以在一次前向传播中检测多个姿势。
  • 基于多帧上检测到的姿势的动作识别。

如果你有任何反馈或建议,请通过 [email protected]TensorFlow 论坛 告知我们!

致谢

我们要感谢 MoveNet 的其他贡献者:Ronny VotelArd OerlemansFrancois Belletti,以及 TensorFlow Lite 的相关人员:Tian LinLu Wang

下一篇文章
Pose estimation and classification on edge devices with MoveNet and TensorFlow Lite

发布者:Khanh LeViet,TensorFlow 开发者倡导者和 Yu-hui Chen,软件工程师MoveNet iOS 示例已发布。在 GitHub 上查看。自 MoveNet 在今年早些时候的 Google I/O 大会上发布以来,我们收到了很多积极的反馈和功能请求。今天,我们很高兴与大家分享一些更新:MoveNet 的 TensorFlow Lite 版本现在已在 上提供。