自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于開源二兄弟MediaPipe+Rerun實(shí)現(xiàn)人體姿勢跟蹤可視化

譯文 精選
開源
本文將通過實(shí)際操作并結(jié)合編程方式介紹如何通過開源工具Rerun輕松實(shí)現(xiàn)基于開源框架MediaPipe的人體姿態(tài)跟蹤的可視化呈現(xiàn)。

譯者 | 朱先忠

審校 | 重樓

摘要本文將通過實(shí)際操作并結(jié)合編程方式介紹如何通過開源工具Rerun輕松實(shí)現(xiàn)基于開源框架MediaPipe的人體姿態(tài)跟蹤的可視化呈現(xiàn)。

概述

本文中,我們探索一個利用開源框架MediaPipe的功能二維和三維方式跟蹤人體姿勢的使用情形。使這一探索更有趣味的是由開源可視化工具Rerun提供的可視化展示,該工具能夠提供人類動作姿勢的整體視圖。

您將一步步跟隨作者使用MediaPipe在2D和3D環(huán)境中跟蹤人體姿勢,并探索工具Rerun的可視化功能。

人體姿勢跟蹤

人體姿勢跟蹤是計(jì)算機(jī)視覺中的一項(xiàng)任務(wù),其重點(diǎn)是識別關(guān)鍵的身體位置、分析姿勢和對動作進(jìn)行分類。這項(xiàng)技術(shù)的核心是一個預(yù)先訓(xùn)練的機(jī)器學(xué)習(xí)模型,用于評估視覺輸入,并在圖像坐標(biāo)和3D世界坐標(biāo)中識別身體上的地標(biāo)。該技術(shù)的應(yīng)用場景包括但不限于人機(jī)交互、運(yùn)動分析、游戲、虛擬現(xiàn)實(shí)、增強(qiáng)現(xiàn)實(shí)、健康等領(lǐng)域

有一個完美的模型固然很好,但不幸的是,目前的模型仍然不完美。盡管數(shù)據(jù)集可能存儲了多種體型數(shù)據(jù),但人體在個體之間有所不同。每個人身體的獨(dú)特性都帶來了挑戰(zhàn),尤其是對于那些手臂和腿部尺寸不標(biāo)準(zhǔn)的人來說,這可能會導(dǎo)致使用這項(xiàng)技術(shù)時精度較低。在考慮將這項(xiàng)技術(shù)集成到系統(tǒng)中時,承認(rèn)不準(zhǔn)確的可能性至關(guān)重要。希望科學(xué)界正在進(jìn)行的努力將為開發(fā)更強(qiáng)大的模型鋪平道路。

除了缺乏準(zhǔn)確性之外,使用這項(xiàng)技術(shù)還需要考慮倫理和法律因素。例如,如果個人未經(jīng)同意,在公共場所拍攝人體姿勢可能會侵犯隱私權(quán)。在現(xiàn)實(shí)世界中實(shí)施這項(xiàng)技術(shù)之前,考慮到任何道德和法律問題都是至關(guān)重要。

先決條件和初始設(shè)置

首先,安裝所需的庫:

# 安裝所需的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跟蹤人體姿勢

谷歌提供的姿勢地標(biāo)檢測指南中的圖像(參考文獻(xiàn)1)谷歌提供的姿勢地標(biāo)檢測指南中的圖像(參考文獻(xiàn)1)

對于希望集成計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)的設(shè)備ML解決方案的開發(fā)人員來說,基于Python語言的MediaPipe框架正是一個方便的工具。

在下面的代碼中,MediaPipe姿態(tài)標(biāo)志檢測被用于檢測圖像中人體的標(biāo)志。該模型可以將身體姿勢標(biāo)志檢測為圖像坐標(biāo)和3D世界坐標(biāo)。一旦成功運(yùn)行ML模型,就可以使用圖像坐標(biāo)和3D世界坐標(biāo)來可視化輸出。

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


"""

從Mediapipe姿勢結(jié)果中讀取二維地標(biāo)位置。

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:
 # 提取標(biāo)準(zhǔn)化的地標(biāo)位置并將其縮放為圖像尺寸
 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結(jié)果中讀取三維地標(biāo)位置。

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:
 # 提取三維地標(biāo)位置
 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:
 # 讀取圖像,將顏色轉(zhuǎn)換為RGB格式
 image = cv2.imread(image_path)
 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

 # 創(chuàng)建Pose模型實(shí)例
 pose_detector = mp.solutions.pose.Pose(static_image_mode=True)

 # 處理圖像以獲得姿勢標(biāo)志
 results = pose_detector.process(image)
 h, w, _ = image.shape

 # 讀取二維和三維地標(biāo)位置
 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官方文檔,參考資料2)

Rerun可作為多模態(tài)數(shù)據(jù)的可視化工具。通過Rerun圖像瀏覽,您可以構(gòu)建布局、自定義可視化以及與數(shù)據(jù)交互。本節(jié)的其余部分詳細(xì)介紹如何使用Rerun SDK在Rerun圖像瀏覽器中記錄和顯示數(shù)據(jù)。

姿勢標(biāo)志模型(谷歌通過姿勢標(biāo)志檢測指南拍攝的圖像,參考資料1)姿勢標(biāo)志模型(谷歌通過姿勢標(biāo)志檢測指南拍攝的圖像,參考資料1)

在二維和三維點(diǎn)中,指定點(diǎn)之間的連接至關(guān)重要。定義這些連接會自動渲染它們之間的線。使用MediaPipe提供的信息,可以從pose_connections集合獲取姿勢點(diǎn)連接,然后使用Annotation Context將它們設(shè)置為關(guān)鍵點(diǎn)連接。

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,
 )

圖像坐標(biāo)——二維位置

將人的姿勢可視化為2D點(diǎn)(作者本人提供的圖像)將人的姿勢可視化為2D點(diǎn)(作者本人提供的圖像)

在視頻中以可視化方式觀察身體姿勢的標(biāo)志似乎是一個不錯的選擇。要實(shí)現(xiàn)這一點(diǎn),您需要仔細(xì)遵循Rerun文檔中有關(guān)Entities和Components相關(guān)介紹。其中,實(shí)體路徑層次結(jié)構(gòu)(The Entity Path Hierarchy)頁面描述了如何在同一實(shí)體上記錄多個組件。例如,您可以創(chuàng)建“video”實(shí)體,并包括視頻的“video/rgb”組件和身體姿勢的“video/pose”組件。不過,如果你打算把它用于視頻設(shè)計(jì)中的話,你需要認(rèn)真掌握時間線的概念。每個幀可以與適當(dāng)?shù)臄?shù)據(jù)相關(guān)聯(lián)。

以下是一個可以將視頻上的2D點(diǎn)可視化的函數(shù)

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)

 # 將幀與數(shù)據(jù)關(guān)聯(lián)
 rr.set_time_seconds("time", bgr_frame.time)
 rr.set_time_sequence("frame_idx", bgr_frame.idx)

 # 呈現(xiàn)視頻
 rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))

 # 獲取預(yù)測結(jié)果
 results = pose.process(rgb)
 h, w, _ = rgb.shape

 # 把2D點(diǎn)記錄到'video'實(shí)體中
 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),
 )

三維世界坐標(biāo)——三維點(diǎn)

將人的姿勢可視化為3D點(diǎn)(作者本人提供的圖像)將人的姿勢可視化為3D點(diǎn)(作者本人提供的圖像)

當(dāng)你有三維點(diǎn)的時候,為什么要選擇二維點(diǎn)呢?創(chuàng)建一個新實(shí)體,將其命名為“Person”,并輸出有關(guān)這些三維點(diǎn)的數(shù)據(jù)這就行了!這樣就可以創(chuàng)建人體姿勢的三維演示。

以下是操作方法:

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)

 # 把幀與數(shù)據(jù)關(guān)聯(lián)起來
 rr.set_time_seconds("time", bgr_frame.time)
 rr.set_time_sequence("frame_idx", bgr_frame.idx)

 # 呈現(xiàn)視頻
 rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))

 # 取得預(yù)測結(jié)果
 results = pose.process(rgb)
 h, w, _ = rgb.shape

 # 對于3D呈現(xiàn)的新的實(shí)例"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),
 )

源代碼探索

重點(diǎn)介紹“人體姿勢跟蹤”示例的主要部分。對于那些喜歡動手的人來說,這個例子的完整源代碼可以在GitHub(https://github.com/rerun-io/rerun/blob/latest/examples/python/human_pose_tracking/main.py)上找到。您可以隨意探索、修改和理解其中實(shí)現(xiàn)的內(nèi)部工作原理。

提示和建議

1.壓縮圖像以提高效率

您可以通過壓縮記錄的圖像來提高整個過程的速度:

rr.log(
 "video", 
 rr.Image(img).compress(jpeg_quality=75)
)

2.限制內(nèi)存使用

如果你記錄的數(shù)據(jù)超過了RAM的容量,它就會開始丟棄舊數(shù)據(jù)。默認(rèn)限制是系統(tǒng)RAM的75%。如果你想增加這個限制,可以使用命令行參數(shù)——內(nèi)存限制。有關(guān)內(nèi)存限制的更多信息,請參閱Rerun“如何限制內(nèi)存使用”頁面信息

3.根據(jù)您的需求定制視覺效果

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

超越人體姿勢跟蹤

如果你覺得這篇文章有用且有見地,下面再推薦一篇類似主題的文章:

另外,經(jīng)常分享一些關(guān)于計(jì)算機(jī)視覺和機(jī)器人的可視化教程。

參考資料

[1]谷歌公司的論文Pose Landmark Detection Guide,本頁面的部分內(nèi)容轉(zhuǎn)載自谷歌創(chuàng)建和共享的作品,根據(jù)Creative Commons 4.0 Attribution許可證中描述的條款使用

[2] Rerun官方參考文檔,可根據(jù)MIT許可使用

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:Human Pose Tracking with MediaPipe in 2D and 3D: Rerun Showcase,作者:Andreas Naoum



責(zé)任編輯:華軒 來源: 51CTO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號