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

news2024/11/25 12:55:39

点击下方卡片,关注“小白玩转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 None
    else:
        # Extract normalized landmark positions and scale them to image dimensions
        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])




"""
    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 None
    else:
        # Extract 3D landmark positions
        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])




"""
    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 RGB
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)


    # Create a Pose model instance
    pose_detector = mp.solutions.pose.Pose(static_image_mode=True)


    # Process the image to obtain pose landmarks
    results = pose_detector.process(image)
    h, w, _ = image.shape


    # Read 2D and 3D landmark positions
    landmark_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:
                break


            rgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)


            # Associate frame with the data
            rr.set_time_seconds("time", bgr_frame.time)
            rr.set_time_sequence("frame_idx", bgr_frame.idx)


            # Present the video
            rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))


            # Get the prediction results
            results = pose.process(rgb)
            h, w, _ = rgb.shape


            # Log 2d points to 'video' entity
            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 点

为什么仅仅停留在 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:
                break


            rgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)


            # Associate frame with the data
            rr.set_time_seconds("time", bgr_frame.time)
            rr.set_time_sequence("frame_idx", bgr_frame.idx)


            # Present the video
            rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))


            # Get the prediction results
            results = pose.process(rgb)
            h, w, _ = rgb.shape


            # New entity "Person" for the 3D presentation
            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 上找到此示例的完整源代码。随意探索、修改并理解实现的内部工作原理。

提示与建议

  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

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

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

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

相关文章

知识图谱的应用---智慧政务

文章目录 智慧政务典型应用 智慧政务 智慧政务即通过“互联网政务服务”构建智慧型政府&#xff0c;利用云计算、移动物联网、人工智能、数据挖掘、知识管理等技术&#xff0c;提高政府在办公、监管、服务、决策中的智能水平&#xff0c;形成高效、敏捷、公开、便民的新型政府&…

静态IP地址:多元化场景下的稳定连接解决方案

当考虑静态IP地址的适用场景时&#xff0c;我们可以从以下几个板块进行细分和归纳&#xff1a; 一、服务器托管与网络服务 1. 服务器托管 稳定性&#xff1a;静态IP确保服务器能够持续、稳定地接入互联网&#xff0c;减少因IP地址更新带来的服务中断风险。 可访问性&am…

java:reactor的Mono和Reactor的简单例子

【pom.xml】 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.3.17.RELEASE</version> </dependency>【MyReactorTest2.java】 package com.chz.myReactor;import react…

基于 Delphi 的前后端分离:之三,使用 HTMX

# 前请提要 基于 Delphi 的前后端分离&#xff1a;之一_delphi 后台vue-CSDN博客 基于 Delphi 的前后端分离&#xff1a;之二_后端 框架 delphi-CSDN博客 # 发现一个非常好的前端框架 - HTMX 这里仍然使用之二里面提到的页面模板&#xff0c;但采用 HTMX 来和后端交互&#…

Redis持久化说明

Redis的持久化是指将内存中的数据持久化到磁盘中&#xff0c;以保证数据在重启或宕机后不会丢失。 Redis提供了两种主要的持久化方式&#xff1a;RDB(Redis DataBase)和AOF(Append Only File)。 RDB&#xff08;Redis DataBase&#xff09; 1、RDB快照原理 RDB持久化方式会定…

Django分页

1、在视图函数文件中引入‘分页器’ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 2、给原来的罗列信息函数&#xff0c;添加分页功能&#xff0c;即按照页码&#xff0c;只返回部分信息。 login_required def article_list(request):article…

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

ICLR2024佳作:多视图Transformer再次升级,直接感知三维几何信息

论文标题&#xff1a; GTA: A Geometry-Aware Attention Mechanism for Multi-View Transformers 论文作者&#xff1a; Takeru Miyato, Bernhard Jaeger, Max Welling, Andreas Geiger 导读&#xff1a; 本文提出一种几何感知注意力机制&#xff0c;替换Transformer中原有的…

用TuneFab下载Apple Music

Apple Music以出色的高保真音质流式传输歌曲已不是什么秘密&#xff0c;但用iTunes下载的离线音乐&#xff0c;采用了Apple的DRM&#xff08;数字版权管理&#xff09;技术&#xff0c;并不能在其他应用上播放&#xff0c;通过TuneFab软件&#xff0c;可以截获iTunes播放流&…

【vue3|第7期】 toRefs 与 toRef 的深入剖析

日期&#xff1a;2024年6月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

FISCO BCOS助力郑州数据交易中心“碳账户”小程序上线

近年来&#xff0c;科技和数字化成为推进可持续绿色发展的关键词。在第53个世界环境日来临之际&#xff0c;由FISCO BCOS支持建设的郑州数据交易中心双碳数据服务专区迎来了新进展&#xff01;近日&#xff0c;专区正式以"碳账户"小程序对外提供多种形式的碳数据服务…

我国衡器市场规模逐渐扩大 出口量远大于进口量

我国衡器市场规模逐渐扩大 出口量远大于进口量 衡器是利用力的杠杆平衡原理或胡克定律来测定物体质量的一种仪器设备。随着生产技术逐渐进步&#xff0c;衡器的种类逐渐增多。根据衡量方法不同&#xff0c;衡器大致可分为非自动衡器、自动衡器等&#xff1b;根据结构原理不同&a…

RE_TEA加密

TEA这段时间遇到的是真多&#xff0c;有直接原始加密&#xff0c;也有 XTEA&#xff0c;XXTEA&#xff0c;更有在此上魔改的&#xff0c;之前也是能认出来&#xff0c;知道还是不够。 en,TEA加密解密脚本还是用 C 好一些&#xff0c;什么溢出之类不用考虑。 TEA 也有可能是 …

JimuReport 积木报表 v1.7.5 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

Java Web学习笔记13——JSON

JavaScript自定义对象 定义格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Js-对…

(求一个整数各位数的和)编写程序,读取一个在0和1000之间的整数,并将该整数的各位数字相加。例如:整数是 932,各位数字之和为14。

(求一个整数各位数的和)编写程序&#xff0c;读取一个在0和1000之间的整数&#xff0c;并将该整数 的各位数字相加。例如:整数是 932&#xff0c;各位数字之和为14。 提示:利用操作符%分解数字,然后使用操作符/去掉分解出来的数字。例如: 932%10-2 932/10-93。下面是一个运行示…

如何使用Python提取Excel中固定单元格的内容

正文共&#xff1a;1234 字 31 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前转载了颜总的Python环境搭建文章&#xff08;Python办公自动化—环境搭建&#xff09;&#xff0c;很久过去了&#xff0c;颜总也没有再更新。现在我有一个需求&#xff0c;就是我手上有大量格…

利用医学Twitter进行病理图像分析的视觉-语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual–language foundation model for pathology image analysis using medical Twitter 利用医学Twitter进行病理图像分析的视觉-语言基础模型 01 文献速递介绍 缺乏公开可用的医学图像标注是计算研究和教育创新的一个重要障碍。同时&#xff0c;许多医生…

HEXO博客常用命令(自用)

1、配置类命令 预览命令 hexo s 上传本地仓库&#xff1a; hexo g提交&#xff1a; hexo d更换主题&#xff1a;在_config.yml文件中&#xff1a;注意属性后面要跟着 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: vola…

进入某个页面时将VUE中的某个Button按钮设置为选中状态

进入某个页面时将VUE中的某个Button按钮设置为选中状态 我想达到的效果如标题所说&#xff0c;目的是为了表示页面展示的内容是由于该按钮被选择的结果。 解决思路是使用VUE中的mounted()钩子函数&#xff0c;在该函数中调用按钮得到焦点方法、按钮被点击方法。具体代码如下&am…