DUICUO

オープンソースのMediaPipeとRerunをベースにした人間のポーズ追跡可視化

翻訳者|朱賢宗

校正者 | Chonglou

概要:この記事では、オープンソースツールRerunを使用して、オープンソースフレームワークMediaPipeに基づく人間のポーズトラッキングを簡単に視覚化する方法と、実際の操作とプログラミングを紹介します。

概要

この記事では、オープンソースフレームワーク「MediaPipe」を用い、人間の姿勢を2次元と3次元の両方追跡するユースケース紹介ます。この考察をさらに興味深いものにしているのは、オープンソースの可視化ツール「Rerun」提供する可視化です。Rerunは、人間の動きと姿勢を包括的に可視化します

著者が MediaPipe を使用して 2D および 3D環境で人間のポーズを追跡し、Rerun ツールの視覚化機能を探る方法を段階的に説明します

人間の姿勢追跡

人間の姿勢追跡は、コンピュータービジョンにおける主要な体位の特定、姿勢の分析、動作の分類に重点を置いたタスクです。この技術の中核を成すのは、視覚入力を評価し、画像座標と3Dワールド座標で体上のランドマークを識別する、事前学習済みの機械学習モデルです。この技術の応用分野には、ヒューマンコンピュータインタラクション、動作分析、ゲーム、仮想現実(VR)、拡張現実(AR)、ヘルスケアなどがありますが、これらに限定されるものではありません

完璧なモデルが理想です、残念ながら現在のモデルはまだ不完全です。データセットには様々な体型のデータが保存されているかもしれませんが、人体人それぞれ異なります。一人ひとりの体型の独自性は、特に腕や脚のサイズが標準的でない人にとっては課題となり、この技術を使用する際の精度低下につながる可能性があります。この技術をシステムに統合することを検討する際には、不正確さの可能性を認識することが不可欠です。科学界による継続的な努力が、より堅牢なモデルの開発への道を開くことを期待します。

この技術の精度不足に加え、その使用には倫理的および法的側面も考慮する必要があります。例えば、公共の場でポーズをとっている人物を本人の同意なく撮影することは、プライバシー権の侵害につながる可能性があります。この技術を実社会に導入する前に、倫理的および法的側面を考慮に入れることは非常に重要です

前提条件と初期設定

まず必要なライブラリをインストールします。

 # 安装所需的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を使用して人間の姿勢を追跡する

Googleのポーズランドマーク検出ガイドラインからの画像(参考文献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ジェスチャ結果セットから2 次元ランドマークの位置を読み取ります

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: # 提取标准化的地标位置并将其缩放为图像尺寸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 結果セットから3D ランドマークの場所を読み取ります

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: # 提取三维地标位置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 SDKを使用してRerun画像ビューアでデータを記録し、表示する方法について詳しく説明します

ポーズサインモデル(ポーズサイン検出ガイドラインを使用して Google が撮影した画像、参考文献 1)

2Dと3Dの両方のポイントマッピングにおいて、ポイント間の接続を指定することは非常に重要です。これらの接続を定義すると、ポイント間の線が自動的にレンダリングされます。MediaPipeが提供する情報を使用して、pose_connectionsコレクションからポーズポイントの接続を取得し、アノテーションコンテキストを使用してキーポイントの接続として設定できます。

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

画像座標 - 2次元位置

人間の姿勢を 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) # 将帧与数据关联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ポイント

人間の姿勢を 3D ポイントとして視覚化する (画像は著者提供)。

既に3Dポイントがあるのに、なぜ2Dポイントを選ぶ必要があるのでしょうか?新しいエンティティを作成し、「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) # 把帧与数据关联起来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), )

ソースコードの探索

この記事では、 「Human Pose Tracking」サンプルの主要部分に焦点を当てます。実際に操作してみたい方は、このサンプルの完全なソースコードを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%です。この制限を増やすには、コマンドラインパラメータ「--memorylimit」を使用します。メモリ制限の詳細については、 Rerun「メモリ使用量を制限する方法」ページをご覧ください

3. ニーズに合わせて視覚効果をカスタマイズする

カスタム再実行ビューア(画像は著者提供)

人間の姿勢追跡を超えて

この記事が役に立ち参考になったと思われた方は同様のトピックに関する別の記事をご覧ください

  • MediaPipeのリアルタイムハンドトラッキングとジェスチャー認識:再実行アプリケーション例

さらに、コンピューター ビジョンとロボット工学に関する視覚化チュートリアル頻繁に共有します

参考文献

[1] Googleの論文ポーズランドマーク検出ガイド このページのコンテンツの一部はGoogleの著作物から複製されており、クリエイティブ・コモンズ 4.0 表示ライセンスに記載されている条件に従って使用することができます

[2] MITライセンスの下で利用可能な公式リファレンスドキュメント再実行します

翻訳者紹介

Zhu Xianzong 氏は、51CTO コミュニティ エディター、51CTO 専門ブロガー兼講師、維坊の大学のコンピューター教師、そしてフリー プログラミング コミュニティのベテランです。

原題: 2D および 3D での MediaPipe による人間のポーズ追跡: 再実行ショーケース、著者: Andreas Naoum