2021 年 8 月 30 日 — 发布者 Ivan Grishchenko,Valentin Bazarevsky,Eduard Gabriel Bazavan,Na Li,Jason Mayes,谷歌 姿势检测是了解视频和图像中人体的关键步骤。 我们现有的模型 一直支持 2D 姿势估计,你们中的许多人可能已经尝试过。今天,我们在 TF.js 姿势检测 API 中发布了我们的第一个 3D 模型。3D 姿势估…
发布者 Ivan Grishchenko,Valentin Bazarevsky,Eduard Gabriel Bazavan,Na Li,Jason Mayes,谷歌
姿势检测是了解视频和图像中人体的关键步骤。 我们现有的模型 一直支持 2D 姿势估计,你们中的许多人可能已经尝试过。
今天,我们在 TF.js 姿势检测 API 中发布了我们的第一个 3D 模型。3D 姿势估计为健身、医疗、动作捕捉等应用带来了新的设计机会 - 在这些领域中,我们看到了 TensorFlow.js 社区越来越多的兴趣。一个很好的例子是 在浏览器中使用 3D 动作捕捉来驱动角色动画。
BlazePose GHUM 的 3D 动作捕捉,由 Richard Yee 制作 (经许可使用,实时演示可访问 3d.kalidoface.com) |
此社区演示使用由 MediaPipe 和 TensorFlow.js 提供支持的多个模型(即 FaceMesh、BlazePose 和 HandPose)。更棒的是,不需要安装应用程序,您只需访问一个网页即可享受体验。因此,让我们深入了解并查看此新模型的实际操作!
尝试实时演示! |
姿势检测 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
,您可以从以下三个选项中进行选择:lite
、full
和 heavy
。从 lite
到 heavy
,精度会提高,而推理速度会降低。请尝试我们的 实时演示 来比较不同的配置。
拥有检测器后,您可以传入视频流来检测姿势
const video = document.getElementById('video');
const poses = await detector.estimatePoses(video);
如何使用输出?poses
代表图像帧中检测到的 pose
预测的数组。对于每个 pose
,它包含 keypoints
和 keypoints3D
。keypoints
与我们之前发布的 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 姿势和形状推理的相关工作 (HUND,THUNDR)。
输入图像的 GHUM 拟合示例。从左到右:原始图像、3D GHUM 重建(不同视角)以及融合后的结果投影到原始图像之上。 |
由于 3D 到 2D 投影 的性质,3D 中的多个点可以在 2D 中具有相同的投影(即具有相同的 X 和 Y 但不同的 Z)。因此,拟合可能会导致给定 2D 标注的多个逼真的 3D 人体姿势。为了最大限度地减少这种歧义,除了 2D 人体姿势外,我们还要求标注者在他们确定的姿势骨架边缘之间提供深度顺序(请查看下图)。事实证明,此任务非常容易(与真实的深度标注相比),标注者之间显示出高度一致性(交叉验证中为 98%),并且有助于将拟合的 GHUM 重建的深度排序错误从 25% 降低到 3%。
“深度顺序”标注:较宽的边缘角表示距离摄像头更近的角(例如,在这两个示例中,人的右肩都比左肩更靠近摄像头) |
BlazePose GHUM 利用了一种两步 检测器-跟踪器方法,其中跟踪器在裁剪的人体图像上运行。因此,模型经过训练,可以预测度量空间中以主体髋关节中心为原点的相对坐标的 3D 人体姿势。
使用每个运行时都有一些优缺点。如下面的性能表所示,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 Zanfir,Cristian Sminchisescu,Tyler Zhu,MediaPipe 的其他贡献者:Chuo-Ling Chang,Michael Hays,Ming Guang Yong,Matthias Grundmann,以及参与 TensorFlow.js 姿势检测 API 的人员:Ahmed Sabie 和 Ping Yu,当然还有使用这些模型进行精彩创作的社区:Richard Yee.
2021 年 8 月 30 日 — 发布者 Ivan Grishchenko,Valentin Bazarevsky,Eduard Gabriel Bazavan,Na Li,Jason Mayes,Google 姿态检测是了解视频和图像中人体的关键步骤。 我们现有的模型 已经支持 2D 姿态估计一段时间了,许多人可能已经尝试过。今天,我们将在 TF.js pose-detection API 中发布我们的第一个 3D 模型。3D 姿态估…