MediaPipe ジェスチャー認識タスクを使用すると、手のジェスチャーをリアルタイムに認識できます。 認識された手の動きの結果と、検出された手のランドマークが表示されます。 できます。ここでは、ジェスチャー認識ツールの使用方法について説明します。 Python アプリケーションとの相互作用です
このタスクの動作を確認するには、 デモ Google Cloud インフラストラクチャの機能、モデル、構成オプションについて このタスクについては、概要をご覧ください。
サンプルコード
ジェスチャー認識ツールのコード例では、この実装方法を完全に実装しています。 タスクを示しています。このコードは、このタスクをテストして、 独自の手の動き認識ツールの構築を始めました。特定のリソースを表示、実行、 ジェスチャー認識ツールの例を編集します。 コード できます。
Raspberry Pi 用にジェスチャー認識機能を実装する場合は、 Raspberry Pi の例 アプリ。
セットアップ
このセクションでは、開発環境をセットアップする主な手順と ジェスチャー認識ツールを使用するコード プロジェクトが存在します。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Python。
パッケージ
MediaPipe ジェスチャー認識タスクには、mediapipe PyPI パッケージが必要です。Compute Engine インスタンスに 次のように依存関係をインポートします。
$ python -m pip install mediapipe
インポート
ジェスチャー認識ツールのタスク関数にアクセスするには、次のクラスをインポートします。
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"] です |
|
|
|
custom_gestures_classifier_options |
カスタム ジェスチャー分類器の動作を設定するオプション。 |
|
|
|
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 個のハンド ランドマークがあり、それぞれ
x
、y
、z
座標で構成されています。「x
座標とy
座標は、画像の幅と [0.0, 1.0] に正規化されます。 あります。z
座標はランドマークの深さを表します。 手首の奥行きが原点になります。値が小さいほど、 カメラに映し出されますz
の大きさは、x
。世界の名所
21 の針のランドマークも世界座標で示されています。各ランドマーク は
x
、y
、z
で構成されており、次の現実世界の 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)
次の図は、タスク出力を可視化したものです。
ジェスチャー認識ツールのコード例は、認識機能を表示する方法を示したものです。 タスクから返された結果については、コード 例 をご覧ください。