MediaPipe Gesture Recognizer タスクを使用すると、手ジェスチャーをリアルタイムで認識し、認識された手ジェスチャーの結果と検出された手のランドマークを取得できます。以下では、Python アプリケーションでジェスチャー認識ツールを使用する方法について説明します。
このタスクの動作を確認するには、ウェブデモをご覧ください。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。
サンプルコード
ジェスチャー認識ツールのサンプルコードには、このタスクの Python での完全な実装が含まれています。このコードは、このタスクをテストし、独自の手のジェスチャー認識ツールの作成を開始するのに役立ちます。ウェブブラウザのみを使用して、ジェスチャー認識ツールのサンプルコードを表示、実行、編集できます。
Raspberry Pi 向けのジェスチャー認識ツールを実装する場合は、Raspberry Pi のサンプルアプリをご覧ください。
セットアップ
このセクションでは、ジェスチャー認識機能を使用するように開発環境とコード プロジェクトを設定する主な手順について説明します。プラットフォーム バージョンの要件など、MediaPipe タスクを使用する開発環境の設定に関する一般的な情報については、Python の設定ガイドをご覧ください。
パッケージ
MediaPipe ジェスチャー認識タスクには、mediapipe PyPI パッケージが必要です。これらの依存関係は、次のようにインストールしてインポートできます。
$ python -m pip install mediapipe
インポート
ジェスチャー認識タスクの関数にアクセスするには、次のクラスをインポートします。
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
モデル
MediaPipe ジェスチャー認識タスクでは、このタスクに対応したトレーニング済みモデル バンドルが必須です。ジェスチャー認識ツールで使用可能なトレーニング済みモデルの詳細については、タスクの概要のモデルのセクションをご覧ください。
モデルを選択してダウンロードし、ローカル ディレクトリに保存します。
model_path = '/absolute/path/to/gesture_recognizer.task'
次のように、モデル名パラメータ内にモデルのパスを指定します。
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: 単一画像入力のモード。 動画: 動画のデコードされたフレームのモード。 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"] です。 |
|
|
|
custom_gestures_classifier_options |
カスタム ジェスチャー分類システムの動作を構成するためのオプション。 |
|
|
|
result_callback |
ジェスチャー認識機能がライブ ストリーム モードのときに、分類結果を非同期で受信するように結果リスナーを設定します。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます。 |
ResultListener |
なし | なし |
データの準備
入力を画像ファイルまたは 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)
タスクを実行する
ジェスチャー認識機能は、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 個あり、それぞれ
x
、y
、z
の座標で構成されています。x
座標とy
座標は、それぞれ画像の幅と高さで [0.0, 1.0] に正規化されます。z
座標はランドマークの深さを表します。手首の深さが原点になります。値が小さいほど、ランドマークはカメラに近くなります。z
の振幅は、x
とほぼ同じスケールを使用します。世界の名所
21 個の手のランドマークもワールド座標で表されます。各ランドマークは
x
、y
、z
で構成され、手形の幾何学的中心を原点として、メートル単位の現実世界の 3D 座標を表します。
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)
次の画像は、タスク出力の可視化を示しています。
ジェスチャー認識ツールのサンプルコードでは、タスクから返された認識結果を表示する方法を示しています。詳細については、コードサンプルをご覧ください。