使用 MediaPipe BlazePose GHUM 和 TensorFlow.js 进行 3D 姿势检测
2021 年 8 月 30 日

发布者 Ivan GrishchenkoValentin BazarevskyEduard Gabriel BazavanNa LiJason Mayes,谷歌

姿势检测是了解视频和图像中人体的关键步骤。 我们现有的模型 一直支持 2D 姿势估计,你们中的许多人可能已经尝试过。

今天,我们在 TF.js 姿势检测 API 中发布了我们的第一个 3D 模型。3D 姿势估计为健身、医疗、动作捕捉等应用带来了新的设计机会 - 在这些领域中,我们看到了 TensorFlow.js 社区越来越多的兴趣。一个很好的例子是 在浏览器中使用 3D 动作捕捉来驱动角色动画

3D motion capture with BlazePose GHUM

BlazePose GHUM 的 3D 动作捕捉,由 Richard Yee 制作

(经许可使用,实时演示可访问 3d.kalidoface.com)

此社区演示使用由 MediaPipe 和 TensorFlow.js 提供支持的多个模型(即 FaceMesh、BlazePose 和 HandPose)。更棒的是,不需要安装应用程序,您只需访问一个网页即可享受体验。因此,让我们深入了解并查看此新模型的实际操作!

BlazePose live demo
尝试实时演示!

安装

姿势检测 API 为 BlazePose GHUM 提供两种运行时,即 MediaPipe 运行时和 TensorFlow.js 运行时。

要安装 API 和运行时库,您可以使用 html 文件中的 <script> 标签或使用 NPM。

通过脚本标签

<script src="https://cdn.jsdelivr.net.cn/npm/@tensorflow-models/pose-detection"></script>
<!-- Include below scripts if you want to use TF.js runtime. -->
<script src="https://cdn.jsdelivr.net.cn/npm/@tensorflow/tfjs-core"></script>
<script src="https://cdn.jsdelivr.net.cn/npm/@tensorflow/tfjs-converter"></script>
<script src="https://cdn.jsdelivr.net.cn/npm/@tensorflow/tfjs-backend-webgl"></script>

<!-- Optional: Include below scripts if you want to use MediaPipe runtime. -->
<script src="https://cdn.jsdelivr.net.cn/npm/@mediapipe/pose"></script>

通过 NPM

yarn add @tensorflow-models/pose-detection

# Run below commands if you want to use TF.js runtime.
yarn add @tensorflow/tfjs-core @tensorflow/tfjs-converter
yarn add @tensorflow/tfjs-backend-webgl

# Run below commands if you want to use MediaPipe runtime.
yarn add @mediapipe/pose

要在您的 JS 代码中引用 API,这取决于您如何安装库。

如果通过脚本标签安装,则可以通过全局命名空间 poseDetection 引用库。

如果通过 NPM 安装,则需要首先导入库

import * as poseDetection from '@tensorflow-models/pose-detection';
// Uncomment the line below if you want to use TF.js runtime.
// import '@tensorflow/tfjs-backend-webgl';
// Uncomment the line below if you want to use MediaPipe runtime.
// import '@mediapipe/pose';

自己尝试!

首先,您需要创建一个检测器

const model = poseDetection.SupportedModels.BlazePose;
const detectorConfig = {
  runtime: 'mediapipe', // or 'tfjs'
  modelType: 'full'
};
detector = await poseDetection.createDetector(model, detectorConfig);

选择适合您的应用程序需求的 modelType,您可以从以下三个选项中进行选择:litefullheavy。从 liteheavy,精度会提高,而推理速度会降低。请尝试我们的 实时演示 来比较不同的配置。

拥有检测器后,您可以传入视频流来检测姿势

const video = document.getElementById('video');
const poses = await detector.estimatePoses(video);

如何使用输出?poses 代表图像帧中检测到的 pose 预测的数组。对于每个 pose,它包含 keypointskeypoints3Dkeypoints 与我们之前发布的 2D 模型相同,它是一个包含 33 个关键点对象的数组,每个对象都有以像素为单位的 x、y。

keypoints3D 是一个额外的数组,包含 33 个关键点对象,每个对象都有 x、y、z。x、y、z 采用米为单位。人体被建模为处于 2m x 2m x 2m 的立方空间中。每个轴的范围从 -1 到 1(因此总共 2m 的增量)。此 3D 空间的原点是髋关节中心 (0, 0, 0)。从原点开始,z 如果朝向摄像头移动则为正,如果远离摄像头移动则为负。请查看下面的输出片段以获取示例

[
  {
    score: 0.8,
    keypoints: [
      {x: 230, y: 220, score: 0.9, name: "nose"},
      {x: 212, y: 190, score: 0.8, name: "left_eye"},
      ...
    ],
    keypoints3D: [
      {x: 0.5, y: 0.9, z: 0.06 score: 0.9, name: "nose"},
      ...
    ]
  }
]

您可以参考我们的 ReadMe 了解有关 API 的更多详细信息。

当您开始使用 BlazePose GHUM 进行玩耍和开发时,我们希望您能 提供反馈贡献。如果您使用此模型制作了一些东西,请在社交媒体上使用 #MadeWithTFJS 标签,以便我们找到您的作品,我们很想看看您创作了什么。

模型深入分析

构建姿势模型的 3D 部分的关键挑战是获取逼真的、现实世界中的 3D 数据。与可以通过人工标注获取的 2D 数据相比,准确的人工 3D 标注成为一项极具挑战的任务。它需要实验室设置或配备深度传感器的专用硬件来进行 3D 扫描 - 这为保留数据集中高水平的人类和环境多样性带来了额外的挑战。许多研究人员选择另一种方法 - 构建一个完全合成的数据集,这又带来了将合成数据应用于现实世界图像的领域适应挑战。

我们的方法基于一个名为 GHUM 的统计 3D 人体模型,该模型使用大量人体形状和运动数据构建而成。为了获得 3D 人体姿势真值,我们将 GHUM 模型拟合到我们现有的 2D 姿势数据集,并用度量空间中的真实世界 3D 关键点坐标对其进行了扩展。在拟合过程中,GHUM 的形状和姿势变量经过优化,使得重建的模型与图像证据对齐。这包括 2D 关键点和轮廓语义分割对齐,以及形状和姿势正则化项。有关详细信息,请参阅 3D 姿势和形状推理的相关工作 (HUNDTHUNDR)。

Sample GHUM fitting for input image
输入图像的 GHUM 拟合示例。从左到右:原始图像、3D GHUM 重建(不同视角)以及融合后的结果投影到原始图像之上。

由于 3D 到 2D 投影 的性质,3D 中的多个点可以在 2D 中具有相同的投影(即具有相同的 X 和 Y 但不同的 Z)。因此,拟合可能会导致给定 2D 标注的多个逼真的 3D 人体姿势。为了最大限度地减少这种歧义,除了 2D 人体姿势外,我们还要求标注者在他们确定的姿势骨架边缘之间提供深度顺序(请查看下图)。事实证明,此任务非常容易(与真实的深度标注相比),标注者之间显示出高度一致性(交叉验证中为 98%),并且有助于将拟合的 GHUM 重建的深度排序错误从 25% 降低到 3%。

Depth order annotation: the wider edge corner denotes the corner closer to the camera
(e.g. the person’s right shoulder is closer to camera than left shoulder on both examples)
“深度顺序”标注:较宽的边缘角表示距离摄像头更近的角(例如,在这两个示例中,人的右肩都比左肩更靠近摄像头)

BlazePose GHUM 利用了一种两步 检测器-跟踪器方法,其中跟踪器在裁剪的人体图像上运行。因此,模型经过训练,可以预测度量空间中以主体髋关节中心为原点的相对坐标的 3D 人体姿势。

MediaPipe 与 TF.js 运行时

使用每个运行时都有一些优缺点。如下面的性能表所示,MediaPipe 运行时在台式机、笔记本电脑和 Android 手机上提供了更快的推理速度。TF.js 运行时在 iPhone 和 iPad 上提供了更快的推理速度。TF.js 运行时的体积也比 MediaPipe 运行时小约 1 MB。


MacBook Pro 15” 2019. 

英特尔酷睿 i9。 

AMD Radeon Pro Vega 20 图形卡。

(FPS)

iPhone 11

(FPS)

Pixel 5

(FPS)

台式机 

英特尔 i9-10900K。英伟达 GTX 1070 显卡。

(FPS)

MediaPipe 运行时

使用 WASM 和 GPU 加速。

75 | 67 | 34

9 | 6 | N/A                   

25 | 21 | 8

150 | 130 | 97

TFJS 运行时

使用 WebGL 后端。

52 | 40 | 24

 43 | 32 | 22

14 | 10 | 4

42 | 35 | 29

BlazePose GHUM 在不同设备和运行时上的推理速度。每个单元格中的第一个数字代表 lite 模型,第二个数字代表 full 模型,第三个数字代表 heavy 模型。

鸣谢

我们感谢参与创建 BlazePose GHUM 3D 的同事:Andrei ZanfirCristian SminchisescuTyler Zhu,MediaPipe 的其他贡献者:Chuo-Ling ChangMichael HaysMing Guang YongMatthias Grundmann,以及参与 TensorFlow.js 姿势检测 API 的人员:Ahmed SabiePing Yu,当然还有使用这些模型进行精彩创作的社区:Richard Yee.

下一篇文章
3D Pose Detection with MediaPipe BlazePose GHUM and TensorFlow.js

发布者 Ivan GrishchenkoValentin BazarevskyEduard Gabriel BazavanNa LiJason Mayes,Google 姿态检测是了解视频和图像中人体的关键步骤。 我们现有的模型 已经支持 2D 姿态估计一段时间了,许多人可能已经尝试过。今天,我们将在 TF.js pose-detection API 中发布我们的第一个 3D 模型。3D 姿态估…