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

MediaPipe のポーズのランドマーク タスクでは、画像や動画に含まれる人体のランドマークを検出できます。このタスクを使用して、身体の主な位置の特定、姿勢の分析、動作の分類を行うことができます。このタスクでは、単一の画像または動画で動作する機械学習(ML)モデルを使用します。このタスクは、身体の姿勢のランドマークを画像座標と 3 次元の世界座標で出力します。

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

サンプルコード

参考までに、ポーズ ランドマーク er のサンプルコードでは、このタスクの完全な実装を Python で提供しています。このコードは、このタスクをテストして、独自のポーズ ランドマークの作成を開始する際に役立ちます。ウェブブラウザだけで Pose Landscapeer のサンプルコードを表示、実行、編集できます。

Raspberry Pi 用のポーズ ランドマークャーを実装する場合は、Raspberry Pi サンプルアプリをご覧ください。

セットアップ

このセクションでは、ポーズ ランドマークャーの使用に特化した開発環境とコード プロジェクトをセットアップする主な手順について説明します。プラットフォームのバージョン要件など、MediaPipe タスクを使用するための開発環境の設定に関する一般的な情報については、Python の設定ガイドをご覧ください。

パッケージ

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

$ python -m pip install mediapipe

インポート

次のクラスをインポートして、ポーズのランドマーク er タスク関数にアクセスします。

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 のポーズのランドマーク タスクでは、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 検出されたポーズのセグメンテーション マスクを姿勢ランドマーク er が出力するかどうか。 Boolean False
result_callback Pose Landscapeer がライブ ストリーム モードのときに、ランドマーク マーキングの結果を非同期で受け取るように結果リスナーを設定します。 実行モードが LIVE_STREAM に設定されている場合にのみ使用できます ResultListener N/A

データの準備

入力を画像ファイルまたは numpy 配列として準備し、mediapipe.Image オブジェクトに変換します。入力が動画ファイルまたはウェブカメラのライブ ストリームの場合は、OpenCV などの外部ライブラリを使用して、入力フレームを numpy 配列として読み込むことができます。

画像

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)
    

タスクを実行する

ポーズのランドマークは、detect 関数、detect_for_video 関数、detect_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)
    

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

  • 動画モードまたはライブ ストリーム モードで実行する場合は、ポーズ ランドマーク タスクに入力フレームのタイムスタンプも指定します。
  • 画像モデルまたは動画モデルで実行されている場合、ポーズのランドマーク タスクは入力画像またはフレームの処理を完了するまで現在のスレッドをブロックします。
  • ライブ ストリーム モードで実行すると、ポーズのランドマーク タスクはすぐに返され、現在のスレッドはブロックされません。入力フレームの処理が完了するたびに、検出結果とともに結果リスナーを呼び出します。ポーズのランドマーク タスクが別のフレームの処理でビジー状態のときに検出関数が呼び出された場合、タスクは新しい入力フレームを無視します。

画像に対してポーズのランドマーク ツールを実行する詳細な例については、コードサンプルをご覧ください。

結果を処理して表示する

ポーズのランドマークは、検出を実行するたびに 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: 画像の幅(x)と高さ(y)で正規化された 0.0 ~ 1.0 のランドマーク座標。

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

  • visibility: ランドマークが画像内に表示される可能性。

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

  • xyz: ヒップの中心を原点とする実際の 3 次元座標(メートル単位)。

  • visibility: ランドマークが画像内に表示される可能性。

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

オプションのセグメンテーション マスクは、各ピクセルが検出された人物に属する可能性を表します。次の画像は、タスク出力のセグメンテーション マスクです。

姿勢のランドマーク er サンプルコードは、タスクから返された結果を表示する方法を示しています。詳しくは、コードサンプルをご覧ください。