Python ジェスチャー認識ガイド

MediaPipe ジェスチャー認識タスクを使用すると、手のジェスチャーをリアルタイムに認識できます。 認識された手の動きの結果と、検出された手のランドマークが表示されます。 できます。ここでは、ジェスチャー認識ツールの使用方法について説明します。 Python アプリケーションとの相互作用です

このタスクの動作を確認するには、 デモ Google Cloud インフラストラクチャの機能、モデル、構成オプションについて このタスクについては、概要をご覧ください。

サンプルコード

ジェスチャー認識ツールのコード例では、この実装方法を完全に実装しています。 タスクを示しています。このコードは、このタスクをテストして、 独自の手の動き認識ツールの構築を始めました。特定のリソースを表示、実行、 ジェスチャー認識ツールの例を編集します。 コード できます。

Raspberry Pi 用にジェスチャー認識機能を実装する場合は、 Raspberry Pi の例 アプリ

セットアップ

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

パッケージ

MediaPipe ジェスチャー認識タスクには、mediapipe PyPI パッケージが必要です。Compute Engine インスタンスに 次のように依存関係をインポートします。

$ python -m pip install mediapipe
<ph type="x-smartling-placeholder">

インポート

ジェスチャー認識ツールのタスク関数にアクセスするには、次のクラスをインポートします。

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

モデル

MediaPipe ジェスチャー認識タスクには、MediaPipe ジェスチャー認識ツール できます。ジェスチャー認識ツールで利用可能なトレーニング済みモデルについて詳しくは、 タスクの概要のモデル セクションをご覧ください。

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

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

次に示すように、Model Name パラメータ内にモデルのパスを指定します。

base_options = BaseOptions(model_asset_path=model_path)

タスクを作成する

MediaPipe ジェスチャー認識タスクは、create_from_options 関数を使用して以下をセットアップします。 タスクを実行します。create_from_options 関数は構成の値を受け入れます。 いくつかあります。構成オプションの詳細については、このモジュールの 構成オプション

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

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

画像

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the image mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

動画

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the video mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

ライブ配信

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the live stream mode:
def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int):
    print('gesture recognition result: {}'.format(result))

options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

構成オプション

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

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

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

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

LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands 次の手で検出できる手の最大数は、 GestureRecognizer Any integer > 0 1
min_hand_detection_confidence ハンド検出の最小信頼スコアは、 成功したと考えられています。 0.0 - 1.0 0.5
min_hand_presence_confidence 手の存在スコアの最小信頼スコア モデルです。ジェスチャー認識ツールの動画モードとライブ配信モードでは、 手のランドマーク モデルによる手の存在の信頼スコアが以下の場合 このしきい値を超えると、手のひら検出モデルがトリガーされます。それ以外の場合: 軽量のハンド トラッキング アルゴリズムを使用して、 ランドマーク検出に利用します。 0.0 - 1.0 0.5
min_tracking_confidence ハンド トラッキングの最小信頼スコア 成功です。グラフ内の手間の境界ボックスの IoU しきい値です。 現在のフレームと最後のフレームが表示されます。動画モードとストリーム モードでは、 ジェスチャー認識機能(トラッキングが失敗した場合、ジェスチャー認識ツールが手をかざす) できます。それ以外の場合、手の検出はスキップされます。 0.0 - 1.0 0.5
canned_gestures_classifier_options あらかじめ用意されたジェスチャー分類器の動作を設定するためのオプション。返信定型文は["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
です
  • Display Name locale: TFLite Model Metadata で指定された表示名に使用する言語 / 地域(存在する場合)。
  • 最大結果数: 返される上位スコアの分類結果の最大数。<0 の場合、利用可能な結果がすべて返されます。
  • スコアしきい値: 下回った結果が拒否されるスコア。0 に設定すると、利用可能な結果がすべて返されます。
  • カテゴリの許可リスト: カテゴリ名の許可リスト。空でない場合、このセットにカテゴリがない分類結果は除外されます。拒否リストとは相互に排他的。
  • カテゴリの拒否リスト: カテゴリ名の拒否リスト。空でない場合、このセット内にカテゴリがある分類結果は除外されます。許可リストとは相互に排他的。
    • 表示名の言語 / 地域: any string
    • 最大結果数: any integer
    • スコアしきい値: 0.0-1.0
    • カテゴリの許可リスト: vector of strings
    • カテゴリの拒否リスト: vector of strings
    • 表示名の言語 / 地域: "en"
    • 最大結果数: -1
    • スコアしきい値: 0
    • カテゴリの許可リスト: 空
    • カテゴリの拒否リスト: 空
    custom_gestures_classifier_options カスタム ジェスチャー分類器の動作を設定するオプション。
  • Display Name locale: TFLite Model Metadata で指定された表示名に使用する言語 / 地域(存在する場合)。
  • 最大結果数: 返される上位スコアの分類結果の最大数。<0 の場合、利用可能な結果がすべて返されます。
  • スコアしきい値: 下回った結果が拒否されるスコア。0 に設定すると、利用可能な結果がすべて返されます。
  • カテゴリの許可リスト: カテゴリ名の許可リスト。空でない場合、このセットにカテゴリがない分類結果は除外されます。拒否リストとは相互に排他的。
  • カテゴリの拒否リスト: カテゴリ名の拒否リスト。空でない場合、このセット内にカテゴリがある分類結果は除外されます。許可リストとは相互に排他的。
    • 表示名の言語 / 地域: any string
    • 最大結果数: any integer
    • スコアしきい値: 0.0-1.0
    • カテゴリの許可リスト: vector of strings
    • カテゴリの拒否リスト: vector of strings
    • 表示名の言語 / 地域: "en"
    • 最大結果数: -1
    • スコアしきい値: 0
    • カテゴリの許可リスト: 空
    • カテゴリの拒否リスト: 空
    result_callback 分類結果を受け取るように結果リスナーを設定します。 ライブ ストリーム モードの場合は非同期で行われます。 実行モードが LIVE_STREAM に設定されている場合にのみ使用できます ResultListener なし なし

    データの準備

    入力を画像ファイルまたは 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)
        

    タスクを実行する

    ジェスチャー認識ツールでは、Recognize、Recognize_for_video、Recognize_async が使用されます 推論をトリガーできますジェスチャー認識の場合 入力データの前処理、画像内の手の検出、手の検出 ランドマークからの手の動きの認識などです

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

    画像

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the image mode.
    gesture_recognition_result = recognizer.recognize(mp_image)
        

    動画

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the video mode.
    gesture_recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
        

    ライブ配信

    # Send live image data to perform gesture recognition.
    # The results are accessible via the `result_callback` provided in
    # the `GestureRecognizerOptions` object.
    # The gesture recognizer must be created with the live stream mode.
    recognizer.recognize_async(mp_image, frame_timestamp_ms)
        

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

    • 動画モードまたはライブ配信モードで実行する場合は、 入力フレームのタイムスタンプをジェスチャー認識タスクに提供します。
    • 画像モデルまたは動画モデルで実行すると、ジェスチャー認識タスクが 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。
    • ライブ ストリーム モードで実行すると、ジェスチャー認識タスクがブロックされない すぐに戻ります。このメソッドは、 認識結果を返すリスナーを 表示されます。ジェスチャー認識ツールの実行時に認識関数が呼び出された場合 タスクが別のフレームの処理でビジー状態の場合、タスクは新しい入力 クリックします。

    画像に対してジェスチャー認識ツールを実行する詳細な例については、コード 例 をご覧ください。

    結果の処理と表示

    ジェスチャー認識ツールは、操作ごとに 認識されます。結果のオブジェクトには、画像座標の手のランドマークが含まれます。 世界座標、利き手(左手と右手)、手の手のランドマーク 検出された手のジェスチャー カテゴリです。

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

    結果の GestureRecognizerResult には 4 つのコンポーネントが含まれます。各要素は配列で、各要素には 1 つの検出された手の検出結果が含まれます。

    • 利き手

      利き手は、検出された手が左手か右手かを表します。

    • ジェスチャー

      検出された手で認識されたジェスチャーのカテゴリ。

    • ランドマーク

      21 個のハンド ランドマークがあり、それぞれ xyz 座標で構成されています。「 x 座標と y 座標は、画像の幅と [0.0, 1.0] に正規化されます。 あります。z 座標はランドマークの深さを表します。 手首の奥行きが原点になります。値が小さいほど、 カメラに映し出されますz の大きさは、 x

    • 世界の名所

      21 の針のランドマークも世界座標で示されています。各ランドマーク は xyz で構成されており、次の現実世界の 3D 座標を表します。 m を、手の幾何学的中心を原点とします。

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      Landmarks:
        Landmark #0:
          x            : 0.638852
          y            : 0.671197
          z            : -3.41E-7
        Landmark #1:
          x            : 0.634599
          y            : 0.536441
          z            : -0.06984
        ... (21 landmarks for a hand)
      WorldLandmarks:
        Landmark #0:
          x            : 0.067485
          y            : 0.031084
          z            : 0.055223
        Landmark #1:
          x            : 0.063209
          y            : -0.00382
          z            : 0.020920
        ... (21 world landmarks for a hand)
    

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

    ジェスチャー認識ツールのコード例は、認識機能を表示する方法を示したものです。 タスクから返された結果については、コード 例 をご覧ください。