Python 用姿勢ランドマーク検出ガイド

MediaPipe Pose Landmarker タスクでは、画像内の人体のランドマークを検出したり、 動画をご覧ください。このタスクを使用して、主な身体の位置の特定、姿勢の分析、 動きを分類できますこのタスクでは、次の条件を満たす機械学習(ML)モデルを使用します。 単一の画像または動画を使用できますこのタスクは、身体ポーズのランドマークを画像に出力します。 3 次元の世界座標で表します。

この手順で説明するコードサンプルは、 GitHub。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。

サンプルコード

「Pose Landmarker」のサンプル コードでは、この実装方法を完全に実装できます。 タスクを示しています。このコードは、このタスクをテストして、 独自のポーズ ランドマーク ツールの作成に着手しました。特定のリソースを表示、実行、 編集 Pose Landmarker のサンプルコード できます。

Raspberry Pi 用にポーズのマーカーを実装する場合は、 Raspberry Pi の例 アプリ

セットアップ

このセクションでは、開発環境をセットアップする主な手順と 特に Pose Landmarker を使用するためのコード プロジェクトがありました。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Python のセットアップ ガイド

<ph type="x-smartling-placeholder">

パッケージ

MediaPipe Pose Landmarker タスクには、mediapipe PyPI パッケージが必要です。 これらの依存関係は、次のコマンドでインストールしてインポートできます。

$ python -m pip install mediapipe

インポート

次のクラスをインポートして、Pose Landmarker タスクの関数にアクセスします。

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

モデル

MediaPipe 姿勢位置マーカー タスクには、これと互換性のあるトレーニング済みモデルが必要です タスクを実行します。位置マーカーで利用可能なトレーニング済みモデルについて詳しくは、以下をご覧ください。 タスクの概要のモデル セクションをご覧ください。

モデルを選択してダウンロードし、ローカル ディレクトリに保存します。

model_path = '/absolute/path/to/pose_landmarker.task'

BaseOptions オブジェクトの model_asset_path パラメータを使用してパスを指定する モデルを定義します。コード例については、次のセクションをご覧ください。

タスクを作成する

MediaPipe Pose Landmarker タスクは、create_from_options 関数を使用して以下の操作を行います。 タスクを設定します。create_from_options 関数は値を受け入れる 処理する構成オプションを確認してください詳細については、次をご覧ください: 構成オプション

次のコードは、このタスクをビルドして構成する方法を示しています。

これらのサンプルは、画像のタスク構成のバリエーションも示しています。 動画ファイル、ライブ ストリームです。

画像

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

動画

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the video mode:
options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

ライブ配信

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the live stream mode:
def print_result(result: PoseLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('pose landmarker result: {}'.format(result))

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

画像で使用する姿勢のランドマーク作成の詳細な例については、 コードサンプルをご覧ください。

構成オプション

このタスクには、Python アプリケーション用の次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
running_mode タスクの実行モードを設定します。3 つの モード:

IMAGE: 単一画像入力のモード。

VIDEO: 動画のデコードされたフレームのモード。

LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。 このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses 地面マーカーのポーズ。 Integer > 0 1
min_pose_detection_confidence 姿勢検出に必要な最小信頼スコア 成功したとみなされます。 Float [0.0,1.0] 0.5
min_pose_presence_confidence ポーズの有無に関する最小信頼スコア スコアを記録しました。 Float [0.0,1.0] 0.5
min_tracking_confidence ポーズ トラッキングの最小信頼スコア 成功とみなされます。 Float [0.0,1.0] 0.5
output_segmentation_masks 位置マーカーのセグメンテーション マスクが、検出された要素に対してセグメンテーション マスクを出力するかどうか ポーズを決めます。 Boolean False
result_callback ランドマークの結果を受け取るように結果リスナーを設定します。 Pose Landmarker がライブ ストリーム モードのときに非同期で配信されます。 実行モードが LIVE_STREAM に設定されている場合にのみ使用できます ResultListener N/A

データの準備

入力を画像ファイルまたは numpy 配列として準備します。 mediapipe.Image オブジェクトに変換します。入力が動画ファイルの場合 ライブ ストリームで配信する場合、 入力フレームを numpy として読み込むための OpenCV あります

画像

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

動画

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

ライブ配信

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

タスクを実行する

ポーズマーカーでは、detectdetect_for_videodetect_async を使用します。 推論をトリガーできますポーズのランドマークについては、以下の操作を行います。 入力データの前処理と画像内のポーズの検出です。

次のコードは、タスクモデルを使用して処理を実行する方法を示しています。

画像

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the image mode.
pose_landmarker_result = landmarker.detect(mp_image)
    

動画

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the video mode.
pose_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

ライブ配信

# Send live image data to perform pose landmarking.
# The results are accessible via the `result_callback` provided in
# the `PoseLandmarkerOptions` object.
# The pose landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

次の点にご留意ください。

  • 動画モードまたはライブ配信モードで実行している場合 Pose Landmarker タスクに入力フレームのタイムスタンプを提供します。
  • 画像モデルまたは動画モデルで実行する場合、[Pose Landmarker] タスクは 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。
  • ライブ ストリーム モードで実行している場合、[Pose LandMarker] タスクが 現在のスレッドをブロックしません。このメソッドは、 完了するたびに、その検出結果が 表示されます。[Pose Landmarker] タスクの実行時に検出関数が呼び出された場合 別のフレームの処理でビジー状態の場合、タスクは新しい入力フレームを無視します。

画像上でポーズ マーカーを表示する詳細な例については、 コードサンプル をご覧ください。

結果の処理と表示

ポーズのランドマーカーは、検出ごとに poseLandmarkerResult オブジェクトを返します。 あります。結果のオブジェクトには、各ポーズ ランドマークの座標が含まれます。

このタスクからの出力データの例を次に示します。

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

出力には、正規化された座標(Landmarks)と世界の両方が含まれます。 各ランドマークの座標(WorldLandmarks)があります。

出力には、次の正規化された座標(Landmarks)が含まれます。

  • xy: 0.0 ~ 1.0 の範囲で正規化されたランドマーク座標 画像の幅(x)と高さ(y)を指定します。

  • z: ランドマークの深さ。腰の中間点の深さが 含まれます。値が小さいほど、ランドマークがカメラに近づきます。「 z の大きさは x とほぼ同じスケールを使用します。

  • visibility: 画像内にランドマークが見える可能性。

出力には、次のワールド座標(WorldLandmarks)が含まれます。

  • xyz: 実世界の 3 次元座標(メートル単位)。 中間点を起点とします。

  • visibility: 画像内にランドマークが見える可能性。

次の図は、タスク出力を可視化したものです。

セグメンテーション マスク(省略可)は、各ピクセルが帰属する可能性を表します。 通知します。次の画像は、画像のセグメンテーション マスクです。 タスクの出力:

「Pose Landmarker」サンプルコードは、 結果については、 コードサンプル をご覧ください。