基于开源二兄弟MediaPipe+Rerun实现人体姿势跟踪可视化

概述

本文中,我们将探索一个利用开源框架MediaPipe的功能以二维和三维方式跟踪人体姿势的使用情形。使这一探索更有趣味的是由开源可视化工具Rerun提供的可视化展示,该工具能够提供人类动作姿势的整体视图。

您将一步步跟随作者使用MediaPipe在2D和3D环境中跟踪人体姿势,并探索工具Rerun的可视化功能。

人体姿势跟踪

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

有一个完美的模型固然很好,但不幸的是,目前的模型仍然不完美。尽管数据集可能存储了多种体型数据,但人体在个体之间是有所不同的。每个人身体的独特性都带来了挑战,尤其是对于那些手臂和腿部尺寸不标准的人来说,这可能会导致使用这项技术时精度较低。在考虑将这项技术集成到系统中时,承认不准确的可能性至关重要。希望科学界正在进行的努力将为开发更强大的模型铺平道路。

除了缺乏准确性之外,使用这项技术还需要考虑伦理和法律因素。例如,如果个人未经同意,在公共场所拍摄人体姿势可能会侵犯隐私权。在现实世界中实施这项技术之前,考虑到任何道德和法律问题都是至关重要的。

先决条件和初始设置

首先,安装所需的库:

# 安装所需的Python包
pip install mediapipe
pip install numpy
pip install opencv-python<4.6
pip install requests>=2.31,<3
pip install rerun-sdk# 也可以直接使用配置文件requirements.txt
pip install -r examples/python/human_pose_tracking/requirements.txt

使用MediaPipe跟踪人体姿势

谷歌提供的姿势地标检测指南中的图像(参考文献1)

谷歌提供的姿势地标检测指南中的图像

对于希望集成计算机视觉和机器学习的设备ML解决方案的开发人员来说,基于Python语言的MediaPipe框架正是一个方便的工具。

在下面的代码中,MediaPipe姿态标志检测被用于检测图像中人体的标志。该模型可以将身体姿势标志检测为图像坐标和3D世界坐标。一旦成功运行ML模型,就可以使用图像坐标和3D世界坐标来可视化输出。

import mediapipe as mp
import numpy as np
from typing import Any
import numpy.typing as npt
import cv2"""

从Mediapipe姿势结果集中读取二维地标位置。

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:# 提取标准化的地标位置并将其缩放为图像尺寸normalized_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])"""

从Mediapipe Pose结果集中读取三维地标位置。

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:# 提取三维地标位置landmarks = [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])"""

跟踪并分析输入图像中的姿势。

Args:image_path (str): Path to the input image.
"""
def track_pose(image_path: str) -> None:# 读取图像,将颜色转换为RGB格式image = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 创建Pose模型实例pose_detector = mp.solutions.pose.Pose(static_image_mode=True)# 处理图像以获得姿势标志results = pose_detector.process(image)h, w, _ = image.shape# 读取二维和三维地标位置landmark_positions_2d = read_landmark_positions_2d(results, w, h)landmark_positions_3d = read_landmark_positions_3d(results)

使用Rerun可视化MediaPipe的输出

Rerun图像浏览器(图像来自于Rerun官方文档,参考资料2)

Rerun图像浏览器

Rerun可作为多模态数据的可视化工具。通过Rerun图像浏览器,您可以构建布局、自定义可视化以及与数据交互。本节的其余部分将详细介绍如何使用Rerun SDK在Rerun图像浏览器中记录和显示数据。

姿势标志模型(谷歌通过姿势标志检测指南拍摄的图像,参考资料1)

姿势标志模型

在二维和三维点中,指定点之间的连接至关重要。定义这些连接会自动渲染它们之间的线。使用MediaPipe提供的信息,可以从pose_connections集合获取姿势点连接,然后使用Annotation Context将它们设置为关键点连接。

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

图像坐标——二维位置

将人的姿势可视化为2D点(作者本人提供的图像)

将人的姿势可视化为2D点

在视频中以可视化方式观察身体姿势的标志似乎是一个不错的选择。要实现这一点,您需要仔细遵循Rerun文档中有关Entities和Components的相关介绍。其中,“实体路径层次结构(The Entity Path Hierarchy)”页面描述了如何在同一实体上记录多个组件。例如,您可以创建“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)# 将帧与数据关联rr.set_time_seconds("time", bgr_frame.time)rr.set_time_sequence("frame_idx", bgr_frame.idx)# 呈现视频rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))# 获取预测结果results = pose.process(rgb)h, w, _ = rgb.shape# 把2D点记录到'video'实体中landmark_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点

当你有三维点的时候,为什么要选择二维点呢?创建一个新实体,将其命名为“Person”,并输出有关这些三维点的数据。这就行了!这样就可以创建人体姿势的三维演示。

以下是操作方法:

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)# 把帧与数据关联起来rr.set_time_seconds("time", bgr_frame.time)rr.set_time_sequence("frame_idx", bgr_frame.idx)# 呈现视频rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))# 取得预测结果results = pose.process(rgb)h, w, _ = rgb.shape# 对于3D呈现的新的实例"Person"landmark_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(https://github.com/rerun-io/rerun/blob/latest/examples/python/human_pose_tracking/main.py)上找到。您可以随意探索、修改和理解其中实现的内部工作原理。

提示和建议

1.压缩图像以提高效率

您可以通过压缩记录的图像来提高整个过程的速度:

rr.log("video", rr.Image(img).compress(jpeg_quality=75)
)
2.限制内存使用

如果你记录的数据超过了RAM的容量,它就会开始丢弃旧数据。默认限制是系统RAM的75%。如果你想增加这个限制,可以使用命令行参数——内存限制。有关内存限制的更多信息,请参阅Rerun的“如何限制内存使用”页面信息。

3.根据您的需求定制视觉效果

自定义Rerun查看器(作者本人提供的图像)

自定义Rerun查看器

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

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

相关文章

【计算机毕业设计】基于SSM+Vue的校园美食交流系统【源码+lw+部署文档】

目录 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统性能分析 3.3 系…

大模型训练中CUDA out of memory的几种解决方法

常用&#xff1a; 1. 减小batch size 2. 如果需要较大的batch size来达到预期训练指标效果&#xff0c;则使用gradient accumulation来累积梯度&#xff0c;达到等价效果的同时&#xff0c;占用显存小&#xff1b; 3. 使用低精度做训练。&#xff08;mixed precision traini…

自麻省理工学院和谷歌最新研究:零样本跨语言对齐的新途径

在构建实用的语言模型&#xff08;LMs&#xff09;时&#xff0c;使模型与人类偏好对齐是一个不可或缺的阶段。这通常需要大量的标注偏好数据&#xff0c;这些数据对于多种语言来说难以获取&#xff0c;尤其是对于多语种环境&#xff0c;这使得扩展到更多语言变得具有挑战性。本…

YOLO系列模型疑问

YOLO模型V1版本 1、论文里提到bounding box的&#xff08;x&#xff0c;y&#xff09;值表示什么意思呢&#xff1f; 原论文&#xff1a; Each bounding box consists of 5 predictions: x, y, w, h, and confidence. The (x, y) coordinates represent the center of the bo…

Golang发送GET请求并设置查询参数

服务端 package mainimport ("encoding/json""net/http""zdpgo_chi""zdpgo_chi/middleware" )func main() {r : zdpgo_chi.NewRouter()r.Use(middleware.RequestID)r.Use(middleware.RealIP)r.Use(middleware.Logger)r.Use(middlewar…

看这两位东北圣女美吗?如何描写美女的大长腿?

看这两位东北圣女美吗&#xff1f;如何描写美女的大长腿&#xff1f; 最近署名为懂球娘娘的一篇描写东北圣女的文章火了&#xff0c;文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…

Hadoop运行wordcount实例任务卡在job running的多种情况及解决方法

第一种&#xff1a;配置问题 这是别人的图片&#xff0c;据楼主排查解决是因为hosts配置问题… 现象&#xff1a;各种无法运行、启动 解决办法&#xff1a; 1、修改日志级别 export HADOOP_ROOT_LOGGERDEBUG,console 查看下详细信息&#xff0c;定位到具体问题解决 第二种&…

每周题解:繁忙的都市

题目链接 繁忙的都市 题目描述 城市 C 是一个非常繁忙的大都市&#xff0c;城市中的道路十分的拥挤&#xff0c;于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的&#xff1a;城市中有 n n n 个交叉路口&#xff0c;有些交叉路口之间有道路相连&#xff0c;两…

5月26(信息差)

&#x1f30d; 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来&#xff01; 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来&#xff01; &#x1f384; Windows 11 Beta 22635.3646 预览版发布&#xff1a;中国大陆地区新增“微软电脑管家”应用 ✨ 成都限购解除即将满…

[图解]产品经理-竞赛题解析:阿布思考法和EA

1 00:00:00,410 --> 00:00:02,330 今天我们来说一道 2 00:00:02,610 --> 00:00:04,690 前些天出的一道竞赛题 3 00:00:07,250 --> 00:00:09,310 怎么样用阿布思考法 4 00:00:09,320 --> 00:00:10,540 来改进EA 5 00:00:11,690 --> 00:00:12,620 题目是这样的…

简述 v-model 双向绑定的原理是什么?

v-model 是 Vue.js 中用于实现表单输入和应用状态&#xff08;即数据&#xff09;之间双向绑定的指令。其原理可以概括如下&#xff1a; 基本思想&#xff1a; v-model 是 v-bind 和 v-on 的语法糖&#xff0c;它结合了输入元素的 value 属性和 input 事件。当输入元素的值发生…

Kivy 项目51斩百词 5

MRWord\pages\infopage\info.py def read_random_word(self) def read_random_word(self):"""随机读取一条数据"""sql "SELECT * FROM word WHERE id (SELECT word_id FROM today ORDER BY RANDOM() limit 1)"rows select_data(sq…

Django 里html模板

Django 提供两种方式让程序员自定义html模板。 第一种方法 在项目文件夹里的urls.py进行添加 修改代码如下 from django.contrib import admin from django.urls import path from app01 import views # 得添加这行urlpatterns [path(xxx/, views.home), # 添加这行path(…

Java中print,println,printf的功能以及区别

在Java中&#xff0c;System.out.print, System.out.println, 和 System.out.printf 都是用于在控制台输出的方法&#xff0c;但它们在使用和功能上有所不同。 System.out.print: * 功能&#xff1a;将指定的内容输出到控制台&#xff0c;但不换行。 * 示例&#xff1a;Sy…

TXT文本编辑器:一键提取,多关键字匹配,内容尽在掌控!

在浩如烟海的文档中&#xff0c;寻找关键信息往往是一项繁琐而耗时的任务。你是否曾经为了查找某个关键字而翻遍了整个文件夹&#xff0c;却仍然一无所获&#xff1f;现在&#xff0c;有了TXT文本编辑器&#xff0c;这一切都将变得轻松而高效 这款软件以其简洁明了的操作界面和…

Flutter 中的 FittedBox 小部件:全面指南

Flutter 中的 FittedBox 小部件&#xff1a;全面指南 在Flutter的丰富布局小部件中&#xff0c;FittedBox扮演着一个独特而重要的角色。它是一个灵活的组件&#xff0c;用于将子组件的大小和位置适应到给定的约束条件中。本文将提供FittedBox的全面指南&#xff0c;帮助你了解…

C#9特性整理(部分)

1. 实例化类型推断&#xff08;Target-typed new&#xff09; 我们会使用 new 关键字来实例化&#xff0c;但在部分字段和属性声明的时候&#xff0c;这些类型已经是在旁边给出&#xff0c;且不能使用 var 代替的。因此&#xff0c;我们必须这么写&#xff1a; public Person…

最近5星好评的华为的书《常变与长青》

常变与长青 (豆瓣) 作者简介 郭平&#xff0c;1988年加入华为&#xff0c;历任产品开发部项目经理、供应链总经理、总裁办主任、管理工程部总裁、企业发展部总裁、终端公司董事长兼总裁、公司轮值CEO、财经委员会主任、公司副董事长、轮值董事长等职务&#xff0c;现任公…