Python の画像埋め込みガイド

MediaPipe Image Embedder タスクを使用すると、画像データを数値表現に変換して、2 つの画像の類似度の比較などの ML 関連の画像処理タスクを実行できます。ここでは、Python で画像埋め込みを使用する方法について説明します。

このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

画像埋め込み用のサンプルコードには、このタスクの完全な実装が Python で用意されています。このコードは、このタスクをテストし、独自の画像埋め込みツールの作成を開始する際に役立ちます。Google Colab のウェブブラウザを使用して、Image Embedder のサンプルコードを表示、実行、編集できます。この例のソースコードは GitHub で確認できます。

セットアップ

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

パッケージ

Image Embedder は mediapipe pip パッケージにタスクを実行します。この依存関係は、次のコマンドでインストールできます。

$ python -m pip install mediapipe

インポート

次のクラスをインポートして、画像埋め込みタスク関数にアクセスします。

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 Op がまだ含まれていない場合にのみ使用してください。ほとんどの場合、これはすでに当てはまるため、L2 正規化は TFLite 推論によって行われるため、このオプションは必要ありません。 Boolean False
quantize 返されたエンベディングを、スカラー量子化によってバイトに量子化するかどうかを指定します。エンベディングは暗黙的に単位ノルムであると想定されるため、どのディメンションも [-1.0, 1.0] の値を持つことが保証されます。そうでない場合は、l2_normalize オプションを使用します。 Boolean False
result_callback Image Embedder がライブ ストリーム モードのときに埋め込み結果を非同期で受け取るように結果リスナーを設定します。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます なし 未設定

データの準備

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

タスクを実行する

実行モードに対応する埋め込み関数を呼び出して、推論をトリガーできます。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

この結果は、次の画像を埋め込むことで取得されました。

ImageEmbedder.cosine_similarity 関数を使用して、2 つのエンベディングの類似性を比較できます。例として、次のコードをご覧ください。

# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
  embedding_result.embeddings[0],
  other_embedding_result.embeddings[0])