基于 MediaPipe 的 2D 和 3D 的人体姿态追踪:Rerun 展示

2024-06-07 17:20

本文主要是介绍基于 MediaPipe 的 2D 和 3D 的人体姿态追踪:Rerun 展示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击下方卡片,关注“小白玩转Python”公众号

4fab12e9c7f529cad22c8c525585949e.png

概述

我们探讨一个使用 MediaPipe 在 2D 和 3D 中追踪人体姿态的用例。使这次探索更加有趣的是通过开源可视化工具 Rerun 提供的可视化功能,可以全方位展示人体姿态的动态。在这篇博文中,您将学习如何使用 MediaPipe 追踪 2D 和 3D 的人体姿态,并探索 Rerun 的可视化能力。

人体姿态追踪

人体姿态追踪是计算机视觉中的一项任务,专注于识别关键身体部位位置、分析姿态和分类动作。该技术的核心是一种预训练的机器学习模型,用于评估视觉输入并识别身体在图像坐标和 3D 世界坐标中的关键点。该技术的应用场景包括但不限于人机交互、运动分析、游戏、虚拟现实、增强现实、健康等。

拥有一个完美的模型当然很好,但遗憾的是,目前的模型仍不完美。尽管数据集中可能包含各种体型,但人体在个体之间存在差异。每个人体的独特性尤其是那些手臂和腿部尺寸非标准的人,可能会导致使用这项技术时准确度较低。在考虑将这项技术整合到系统中时,必须认识到存在不准确的可能性。希望科学界的持续努力能够推动更健壮模型的发展。

除了准确度不足,使用这项技术还涉及伦理和法律问题。例如,在公共场所捕捉人体姿态可能会在未征得个人同意的情况下侵犯隐私权。在实际应用这项技术之前,务必考虑任何伦理和法律问题。

前提条件与设置

首先安装所需的库:

# Install the required Python packages 
pip install mediapipe
pip install numpy
pip install opencv-python<4.6
pip install requests>=2.31,<3
pip install rerun-sdk# or just use the requirements file
pip install -r examples/python/human_pose_tracking/requirements.txt

使用 MediaPipe 追踪人体姿态

88e78ec49d10f108861316750f78ed64.png

MediaPipe Python 是一个对开发者非常有用的工具,适合集成设备上的计算机视觉和机器学习解决方案。在下面的代码中,利用 MediaPipe 姿态标志检测来检测图像中人体的标志。该模型可以检测到图像坐标和 3D 世界坐标中的人体姿态标志。一旦成功运行机器学习模型,您可以使用图像坐标和 3D 世界坐标来可视化输出结果。

import mediapipe as mp
import numpy as np
from typing import Any
import numpy.typing as npt
import cv2"""Read 2D landmark positions from Mediapipe Pose results.Args:results (Any): Mediapipe Pose results.image_width (int): Width of the input image.image_height (int): Height of the input image.Returns:np.array | None: Array of 2D landmark positions or None if no landmarks are detected.
"""
def read_landmark_positions_2d(results: Any,image_width: int,image_height: int,
) -> npt.NDArray[np.float32] | None:if results.pose_landmarks is None:return Noneelse:# Extract normalized landmark positions and scale them to image dimensionsnormalized_landmarks = [results.pose_landmarks.landmark[lm] for lm in mp.solutions.pose.PoseLandmark]return np.array([(image_width * lm.x, image_height * lm.y) for lm in normalized_landmarks])"""Read 3D landmark positions from Mediapipe Pose results.Args:results (Any): Mediapipe Pose results.Returns:np.array | None: Array of 3D landmark positions or None if no landmarks are detected.
"""
def read_landmark_positions_3d(results: Any,
) -> npt.NDArray[np.float32] | None:if results.pose_landmarks is None:return Noneelse:# Extract 3D landmark positionslandmarks = [results.pose_world_landmarks.landmark[lm] for lm in mp.solutions.pose.PoseLandmark]return np.array([(lm.x, lm.y, lm.z) for lm in landmarks])"""Track and analyze pose from an input image.Args:image_path (str): Path to the input image.
"""
def track_pose(image_path: str) -> None:# Read the image, convert color to RGBimage = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# Create a Pose model instancepose_detector = mp.solutions.pose.Pose(static_image_mode=True)# Process the image to obtain pose landmarksresults = pose_detector.process(image)h, w, _ = image.shape# Read 2D and 3D landmark positionslandmark_positions_2d = read_landmark_positions_2d(results, w, h)landmark_positions_3d = read_landmark_positions_3d(results)

使用 Rerun 可视化 MediaPipe 的输出

db65659d29dd467a6013e1bdd5fb25a6.png

Rerun 是一个多模态数据的可视化工具。通过 Rerun Viewer,您可以构建布局、自定义可视化并与数据交互。本节的其余部分详细说明了如何使用 Rerun SDK 记录和展示数据,以便在 Rerun Viewer 中进行可视化。

7df6b2412da2c2b7bde5096237160ee0.jpeg

在 2D 和 3D 点中,指定点之间的连接是必不可少的。定义这些连接会自动在它们之间渲染线条。利用 MediaPipe 提供的信息,可以从 POSE_CONNECTIONS 集合中获取姿态点的连接,然后使用Annotation Context(https://www.rerun.io/docs/concepts/annotation-context)将它们设置为关键点连接。

rr.log("/",rr.AnnotationContext(rr.ClassDescription(info=rr.AnnotationInfo(id=0, label="Person"),keypoint_annotations=[rr.AnnotationInfo(id=lm.value, label=lm.name) for lm in mp_pose.PoseLandmark],keypoint_connections=mp_pose.POSE_CONNECTIONS,)),timeless=True,)

图像坐标 — 2D 位置

在视频上可视化人体姿态标志是一个不错的选择。为实现这一点,您需要遵循 Rerun 文档中的实体和组件指南。实体路径层次结构页面描述了如何在同一实体上记录多个组件。例如,您可以创建“video”实体,并包含“video/rgb”组件用于视频,以及“video/pose”组件用于人体姿态。如果您打算将其用于视频,则需要时间线的概念。每一帧都可以与相应的数据相关联。这里有一个可以在视频上可视化 2D 点的函数:

def track_pose_2d(video_path: str) -> None:mp_pose = mp.solutions.pose  with closing(VideoSource(video_path)) as video_source, mp_pose.Pose() as pose:for idx, bgr_frame in enumerate(video_source.stream_bgr()):if max_frame_count is not None and idx >= max_frame_count:breakrgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)# Associate frame with the datarr.set_time_seconds("time", bgr_frame.time)rr.set_time_sequence("frame_idx", bgr_frame.idx)# Present the videorr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))# Get the prediction resultsresults = pose.process(rgb)h, w, _ = rgb.shape# Log 2d points to 'video' entitylandmark_positions_2d = read_landmark_positions_2d(results, w, h)if landmark_positions_2d is not None:rr.log("video/pose/points",rr.Points2D(landmark_positions_2d, class_ids=0, keypoint_ids=mp_pose.PoseLandmark),)

3D 世界坐标 — 3D 点

为什么仅仅停留在 2D 点呢,当您还可以拥有 3D 点?创建一个新的实体,命名为“Person”,并记录 3D 点。完成了!您刚刚创建了一个人体姿态的 3D 表示。下面是如何做到的:

def track_pose_3d(video_path: str, *, segment: bool, max_frame_count: int | None) -> None:mp_pose = mp.solutions.pose  rr.log("person", rr.ViewCoordinates.RIGHT_HAND_Y_DOWN, timeless=True)with closing(VideoSource(video_path)) as video_source, mp_pose.Pose() as pose:for idx, bgr_frame in enumerate(video_source.stream_bgr()):if max_frame_count is not None and idx >= max_frame_count:breakrgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)# Associate frame with the datarr.set_time_seconds("time", bgr_frame.time)rr.set_time_sequence("frame_idx", bgr_frame.idx)# Present the videorr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))# Get the prediction resultsresults = pose.process(rgb)h, w, _ = rgb.shape# New entity "Person" for the 3D presentationlandmark_positions_3d = read_landmark_positions_3d(results)if landmark_positions_3d is not None:rr.log("person/pose/points",rr.Points3D(landmark_positions_3d, class_ids=0, keypoint_ids=mp_pose.PoseLandmark),)

源代码

本教程重点讲解了人体姿态追踪示例的主要部分。对于喜欢动手实践的人来说,可以在 GitHub 上找到此示例的完整源代码。随意探索、修改并理解实现的内部工作原理。

提示与建议

  1. 压缩图像以提高效率 通过压缩记录的图像,可以提升整体处理速度:

    rr.log("video", rr.Image(img).compress(jpeg_quality=75)
    )
  2. 限制内存使用 如果您记录的数据超出 RAM 的容量,旧数据将开始被丢弃。默认限制是系统 RAM 的 75%。如果您想增加这个限制,可以使用命令行参数——memory-limit。有关内存限制的更多信息,请参阅 Rerun 的“如何限制内存使用”页面。

  3. 根据需要自定义可视化

a8763ae0fb1395a5a7e973be779273eb.png

·  END  ·

HAPPY LIFE

d2d39f8de6d61ca9dc7270248016456c.png

本文仅供学习交流使用,如有侵权请联系作者删除

这篇关于基于 MediaPipe 的 2D 和 3D 的人体姿态追踪:Rerun 展示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039814

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r

通过Ajax请求后台数据,返回JSONArray(JsonObject),页面(Jquery)以table的形式展示

点击“会商人员情况表”,弹出层,显示一个表格,如下图: 利用Ajax和Jquery和JSONArray和JsonObject来实现: 代码如下: 在hspersons.html中: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>会商人员情况表</title><script type="text/javasc

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.