MediaPipe 3D姿态估计简明教程

姿势检测是更多地了解视频和图像中人体的重要一步。 我们现有的模型支持 2D 姿态估计已经有一段时间了,你们中的许多人可能已经尝试过。

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

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎

上述社区演示使用由 MediaPipe 和 TensorFlow.js 支持的多个模型(即 FaceMesh、BlazePose 和 HandPose)。 更好的是,无需安装应用程序,你只需访问网页即可享受体验。 因此,考虑到这一点,让我们了解更多信息并看看这个新模型的实际应用!

1、安装

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

要安装 API 和运行时库,你可以在 html 文件中使用:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/pose-detection"></script>
<!-- Include below scripts if you want to use TF.js runtime. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-core"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-converter"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl"></script><!-- Optional: Include below scripts if you want to use MediaPipe runtime. -->
<script src="https://cdn.jsdelivr.net/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';

2、快速上手

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

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

选择适合你应用需求的型号,共有三种选项供你选择:精简型、完整型和重型。 从轻量级到重量级,精度提高,但推理速度降低。 请尝试我们的现场演示来比较不同的配置。

一旦有了检测器,就可以传入视频流来检测姿势:

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

如何使用输出? 姿势表示图像帧中检测到的姿势预测的数组。 对于每个姿势,它包含关键点和关键点3D。 关键点与我们之前推出的2D模型相同,它是一个由33个关键点对象组成的数组,每个对象都有以像素为单位的x,y。

keypoints3D 是一个附加数组,包含 33 个关键点对象,每个对象都有 x、y、z。 单位为米。 对人进行建模,就好像他们处于 2m x 2m x 2m 的立方空间中。 每个轴的范围从 -1 到 1(因此总增量为 2m)。 该 3D 空间的原点是臀部中心 (0, 0, 0)。 从原点开始,如果靠近相机,则 z 为正值;如果远离相机,则 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"},...]}
]

你可以参阅我们的自述文件以获取有关 API 的更多详细信息。

3、模型探讨

构建姿势模型 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 身体姿势。

4、MediaPipe运行时 vs. TF.js 运行时

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

BlazePose GHUM 在不同设备和运行时的推理速度。 每个单元格中的第一个数字适用于精简模型,第二个数字适用于完整模型,第三个数字适用于重量级模型。


原文链接:MediaPipe 3D姿态估计 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress外贸站优化工具,WordPress外贸SEO优化方法

WordPress外贸站是跨国企业拓展市场、提升品牌知名度的理想选择。然而&#xff0c;如何通过SEO优化、原创文章生成以及留心站点优化的事项&#xff0c;成为众多站长关注的焦点。 SEO&#xff0c;即搜索引擎优化&#xff0c;是提高网站在搜索引擎结果中排名的关键。首先&#x…

云计算:数字时代的引擎

引言 云计算&#xff0c;作为现代信息技术领域的一项革命性创新&#xff0c;已经深刻改变了我们处理数据和应用的方式。它已经从仅仅是一个概念演变为一个全球范围内广泛应用的技术。云计算为个人、企业和政府机构提供了强大的计算能力、灵活性和可扩展性&#xff0c;同时降低…

JavaScript递归

前端面试大全JavaScript递归 &#x1f31f;经典真题 &#x1f31f;递归 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 使用递归完成 1 到 100 的累加 &#x1f31f;递归 A recursive method is a method that calls itself. 递归调用是一种特殊的调…

使用pytorch从零开始实现迷你GPT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

wordpress建站优化加速教程-Redis加速

这篇文章适合宝塔面板&#xff0c;在宝塔面板安装 Redis 实现网站加速&#xff08; Redis是一个高性能的key-value数据库(PHP连接redis&#xff0c;需PHP设置中安装redis扩展) &#xff09;。对在word press网站有着明显的加速效果。关于Redis具体说明请自己百度&#xff0c;…

编程中常见的技术难题有哪些?By AI

编程对于现代社会发展的重要性 编程&#xff0c;即按照特定的规则和逻辑&#xff0c;为计算机设计指令的过程&#xff0c;已经深深地融入现代社会的各个角落。它对人们的生活、工作和科技发展产生了深远的影响。 首先&#xff0c;编程改变了人们的生活方式。如今&#xff0c;…

Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?

# 前言 项目源码下载 https://gitcode.com/m0_45463480/QSQLite3/tree/main # 第一步 项目配置 平台:windows10 Qt版本:Qt 5.14.2 在.pro添加 QT += sql 需要的头文件 #include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include &…

Pandas进阶:拼接 concat 使用方法

1.处理索引和轴 假设我们有2个关于考试成绩的数据集。 df1 pd.DataFrame&#xff08;{ name&#xff1a;[A&#xff0c;B&#xff0c;C&#xff0c;D]&#xff0c;math&#xff1a;[60,89,82,70]&#xff0c;physics&#xff1a;[66&#xff0c; 95,83,66]&#xff0c;chemi…

springBoot整合task

springBoot整合task 文章目录 springBoot整合task开开关设置任务&#xff0c;并设置执行周期定时任务的相关配置 开开关 设置任务&#xff0c;并设置执行周期 Component public class MyBean {Scheduled(cron "0/1 * * * * ?")public void print(){System.out.prin…

C++进阶篇6---C++11新语法

目录 目录 一、统一的列表初始化 二、声明 1.auto 2.decltype 3.nullptr 三、范围for 四、STL中的变化 五、右值引用和移动语义(重点) 一、统一的列表初始化 在c11之前&#xff0c;我们能用{}初始化数组和结构体 struct Point {int x;int y; }; int main() {int a[] …

机器学习 - 导论

简单了解 机器学习关于数据集的概念 、

HCIP —— 双点重发布 + 路由策略 实验

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验配置&#xff1a; 1.配置IP地址 2.配置动态路由协议 —— RIP 、 OSPF R1 RIP R4 OSPF R2 配置RIP、OSPF 双向重发布 R3配置RIP、OSPF 双向重发布 3.查询路由表学习情况 4.使用路由策略控制选路 R2 R3 5.检…

Linux shell编程学习笔记32:declare 命令

0 前言 在 Linux shell编程学习笔记16&#xff1a;bash中的关联数组https://blog.csdn.net/Purpleendurer/article/details/134053506?spm1001.2014.3001.5501 中&#xff0c;我们在定义关联数组时使用了declare命令。 其实&#xff0c;declare命令的功能不只是定义定义关…

排序算法介绍(三)选择排序

0. 简介 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。选择排序是不稳…

超大规模集成电路设计----学习框架(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架&#xff08;一&#xff09; 这门课在学什么&#xff1f;这门课该怎么学&#xf…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接&#xff1a;Python---函数递归---练习&#xff1a;斐波那契数列&#xff08;本文以递归算法为主&#xff09;-CSDN博客 案例&#xff1a;猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。…

类和对象——(5)定义对象数组

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 芳华没有草稿纸&#xff0c;我们永久不…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03&#xff0c;ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好&#xff0c;最近在搞论文所以在研究各种论文的思想&#xff0c;这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布&#xff0c;其主要的核心思想是&#xff1a;基于多层感知机&#xff08;MLP&#xff09;构建的编码器-解码器架构&#xff0c;核心创…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想&#xff1a; 如何利用数学模型&#xff0c;来解决对应的需求问题&#xff1b;然后利用代码实现对应的数据模型。 算法&#xff1a;使用代码实现对应的数学模型&#xff0c;从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中&#xff0c;有两种非常…