ウェブ向け画像埋め込みガイド

MediaPipe Image Embedder タスクを使用すると、画像データを数値表現に変換して、2 つの画像の類似性を比較するなどの ML 関連の画像処理タスクを実行できます。以下では、Node とウェブアプリ用の Image Embedder の使用方法について説明します。

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

サンプルコード

画像埋め込み用のサンプルコードでは、このタスクの完全な実装を JavaScript で説明しています。このコードを使用すると、このタスクをテストして、独自の画像エンベディング アプリの作成を開始できます。ウェブブラウザを使用して、画像エンベディングのサンプルコードを表示、実行、編集できます。

セットアップ

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

JavaScript パッケージ

画像埋め込みコードは、MediaPipe @mediapipe/tasks-vision NPM パッケージで使用できます。これらのライブラリは、プラットフォームの設定ガイドに記載されているリンクから検索してダウンロードできます。

次のコマンドを使用して、ローカル ステージングに必要な次のコードを含む必要なパッケージをインストールできます。

npm install @mediapipe/tasks-vision

コンテンツ配信ネットワーク(CDN)サービスを介してタスクコードをインポートする場合は、HTML ファイルのタグに次のコードを追加します。

<!-- You can replace jsDelivr with your preferred CDN -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

モデル

MediaPipe Image Embedder タスクには、このタスクと互換性のあるトレーニング済みモデルが必要です。画像エンベダーで利用可能なトレーニング済みモデルの詳細については、タスクの概要のモデル セクションをご覧ください。

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

<dev-project-root>/app/shared/models/

タスクを作成する

モデルパスを指定する

createFromModelPath() メソッドを使用して、デフォルトのオプションでタスクを作成できます。

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
  const imageEmbedder = await ImageEmbedder.createFromOptions(vision, {
    baseOptions: {
      modelAssetPath: `https://storage.googleapis.com/mediapipe-models/image_embedder/mobilenet_v3_small/float32/1/mobilenet_v3_small.tflite`
    },
  });

モデルバッファを指定する

モデルがすでにメモリに読み込まれている場合は、createFromModelBuffer() メソッドを使用できます。

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const imageEmbedder = ImageEmbedder.createFromModelBuffer(
    vision, 
    new Uint8Array(...)
);

カスタム オプションを指定する

MediaPipe Image Embedder タスクは、createFromOptions 関数を使用してタスクを設定します。createFromOptions 関数は、構成オプションの値を受け入れます。構成オプションの詳細については、構成オプションをご覧ください。

次のコードは、カスタム オプションを使用してタスクをビルドして構成する方法を示しています。

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const imageEmbedder = await ImageEmbedder.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "model.tflite"
      },
      quantize: true
    });

構成オプション

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

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

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

VIDEO: 動画のデコードされたフレーム、または入力データのライブストリーム(カメラなど)のモード。
{IMAGE, VIDEO} IMAGE
l2Normalize 返された特徴ベクトルを L2 ノルムで正規化するかどうか。このオプションは、モデルにネイティブの L2_NORMALIZATION TFLite Op がまだ含まれていない場合にのみ使用してください。ほとんどの場合、これはすでに当てはまるため、L2 正規化は TFLite 推論によって行われるため、このオプションは必要ありません。 Boolean False
quantize 返されたエンベディングを、スカラー量子化によってバイトに量子化するかどうかを指定します。エンベディングは暗黙的に単位ノルムであると想定されるため、どのディメンションも [-1.0, 1.0] の値を持つことが保証されます。それ以外の場合は、l2Normalize オプションを使用してください。 Boolean False

データの準備

画像埋め込みは、ホストブラウザでサポートされている任意の形式で画像を埋め込むことができます。このタスクは、サイズ変更、回転、値の正規化など、データ入力の前処理も処理します。

画像エンベダーの embed() メソッドと embedForVideo() メソッドの呼び出しは同期的に実行され、ユーザー インターフェース スレッドをブロックします。動画フレームから特徴ベクトルを抽出する場合、各エンベディングがメインスレッドをブロックします。これを防ぐには、ウェブ ワーカーを実装して embed() メソッドと embedForVideo() メソッドを別のスレッドで実行します。

タスクを実行する

Image Embedder は、embed()(実行モード image)と embedForVideo()(実行モード video)のメソッドを使用して推論をトリガーします。Image Embedder API は、入力画像のエンベディング ベクトルを返します。

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

画像

const image = document.getElementById("image") as HTMLImageElement;
const imageEmbedderResult = imageEmbedder.embed(image);

動画

  const video = document.getElementById("webcam");

  const startTimeMs = performance.now();
  const embedderResult = await imageEmbedder.embedForVideo(video, startTimeMs);

結果を処理して表示する

推論を実行すると、画像埋め込みタスクは、入力画像またはフレームのエンベディング ベクトルを含む 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.cosineSimilarity 関数を使用して、2 つのエンベディングの意味的類似性を比較できます。例として、次のコードをご覧ください。

// Compute cosine similarity.
const similarity = ImageEmbedder.cosineSimilarity(
  imageEmbedderResult.embeddings[0],
  otherEmbedderResult.embeddings[0]);

画像エンベダーのサンプルコードは、タスクから返されたエンベダーの結果を表示する方法を示しています。詳しくは、コードサンプルをご覧ください。