MediaPipe Image Embedder タスクでは、画像データを数値表現に変換 モデルの比較など、ML 関連の画像処理タスクを 類似度を検出できます。ここでは、 Python による Image Embedder です。
機能、モデル、構成オプションの詳細については、 概要をご覧ください。
サンプルコード
画像埋め込みツールのサンプルコードは、このコードの実装全体に対応しています。 タスクを示しています。このコードは、このタスクをテストして、 独自の画像埋め込みツールの構築に着手しました。「新規顧客の獲得」目標を 画像埋め込みの例 コード ウェブブラウザだけで Google Colab を 利用できますこのアプリケーションのソースコードを この例を GitHub。
セットアップ
このセクションでは、開発環境をセットアップする主な手順と Image Embedder を使用するコード プロジェクトがあります。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Python。
<ph type="x-smartling-placeholder">パッケージ
mediapipe pip パッケージに対する画像埋め込みタスク。この依存関係をインストールすると、 次のように置き換えます。
$ python -m pip install mediapipe
インポート
次のクラスをインポートして、Image Embedder タスク関数にアクセスします。
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
モデル
MediaPipe Image Embedder タスクには、この変換と互換性のあるトレーニング済みモデルが必要 タスクを実行します。画像エンベディングで使用可能なトレーニング済みモデルについて詳しくは、以下をご覧ください。 タスクの概要のモデル セクションをご覧ください。
モデルを選択してダウンロードし、ローカル ディレクトリに保存します。次を使用: 推奨される MobileNetV3 モデルです。
model_path = '/absolute/path/to/mobilenet_v3_small_075_224_embedder.tflite'
次に示すように、model_asset_path
パラメータ内にモデルのパスを指定します。
base_options = BaseOptions(model_asset_path=model_path)
タスクを作成する
タスクを作成するには、create_from_options
関数を使用します。「
create_from_options
関数は、埋め込み機能を設定する構成オプションを受け入れます。
。構成オプションの詳細については、構成
概要をご覧ください。
画像埋め込みタスクは、静止画像と動画ファイルの 3 つの入力データタイプをサポート ストリーミング動画にも対応しています入力データ型に対応するタブを選択して、 タスクを作成して推論を実行する方法を学びます。
画像
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), quantize=True, running_mode=VisionRunningMode.IMAGE) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
動画
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), quantize=True, running_mode=VisionRunningMode.VIDEO) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
ライブ配信
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedderResult = mp.tasks.vision.ImageEmbedder.ImageEmbedderResult ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: ImageEmbedderResult, output_image: mp.Image, timestamp_ms: int): print('ImageEmbedderResult result: {}'.format(result)) options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, quantize=True, result_callback=print_result) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
構成オプション
このタスクには、Python アプリケーション用の次の構成オプションがあります。
オプション名 | 説明 | 値の範囲 | デフォルト値 |
---|---|---|---|
running_mode |
タスクの実行モードを設定します。3 つの
モード: IMAGE: 単一画像入力のモード。 VIDEO: 動画のデコードされたフレームのモード。 LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。 |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
返された特徴ベクトルを L2 ノルムで正規化するかどうか。 このオプションは、モデルにネイティブ L2_NORMALIZATION TFLite 演算ほとんどの場合はこれがすでに行われており、 そのため、L2 正規化は TFLite 推論によって実現され、 指定します。 | Boolean |
False |
quantize |
返されたエンベディングを、次を使用してバイトに量子化するかどうか スカラー量子化です。エンベディングは暗黙的にユニットノルムであると想定され、 したがって、どのディメンションも [-1.0, 1.0] の範囲の値を持つことが保証されます。使用 そうでない場合は l2_normalize オプションを使用します。 | Boolean |
False |
result_callback |
エンベディング結果を受け取る結果リスナーを設定します。
非同期で行われます。
モードです。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます |
なし | 未設定 |
データの準備
入力を画像ファイルまたは 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)
タスクを実行する
ランニング モードに対応する埋め込み関数を呼び出して、 説明します。Image Embedder API は、画像のエンベディング ベクトルを 入力画像やフレームです。
画像
# Perform image embedding on the provided single image. embedding_result = embedder.embed(mp_image)
動画
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform image embedding on the video frame. embedding_result = embedder.embed_for_video(mp_image, frame_timestamp_ms)
ライブ配信
# Send the latest frame to perform image embedding. # Results are sent to the `result_callback` provided in the `ImageEmbedderOptions`. embedder.embed_async(mp_image, frame_timestamp_ms)
次の点にご留意ください。
- 動画モードまたはライブ配信モードで実行する場合は、 入力フレームのタイムスタンプを画像エンベディング タスクに提供します。
- 画像モデルまたは動画モデルで実行する場合、Image Embedder タスクは 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。
- ライブ ストリーム モードで実行している場合、画像埋め込みタスクはブロックされない
すぐに戻ります。このメソッドは、
メッセージの処理が完了するたびに、エンべディング結果を返す
表示されます。画像エンベディングがリクエストされたときに
embedAsync
関数が呼び出された場合 タスクが別のフレームの処理でビジー状態の場合、タスクは新しい入力フレームを無視します。
結果の処理と表示
推論を実行すると、画像エンベディング タスクは ImageEmbedderResult
を返します。
オブジェクト。
入力画像やフレームです。
このタスクからの出力データの例を次に示します。
ImageEmbedderResult:
Embedding #0 (sole embedding head):
float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
head_index: 0
この結果は、次の画像を埋め込むことで取得されました。
2 つのエンベディングの類似度を比較できます。
ImageEmbedder.cosine_similarity
関数を使用します。詳細については、次のコードをご覧ください。
例です。
# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
embedding_result.embeddings[0],
other_embedding_result.embeddings[0])