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

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

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

サンプルコード

Image Embedder のサンプルコードでは、このタスクの完全な実装が JavaScript で提供されています。このコードは、このタスクをテストし、 独自の画像エンベディング アプリの構築を開始するのに役立ちます。ウェブブラウザだけで Image Embedder サンプル を表示、実行、 編集できます。

設定

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

JavaScript パッケージ

Image Embedder コードは、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.mjs"
    crossorigin="anonymous"></script>
</head>

モデル

MediaPipe Image Embedder タスクには、このタスクと互換性のあるトレーニング済みモデルが必要です。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 が含まれていない場合にのみ使用します。ほとんどの場合、すでにこのオプションが設定されているため、 このオプションを使用しなくても TFLite 推論で L2 正規化が実現されます。 Boolean False
quantize 返されたエンベディングを スカラー量子化によってバイトに量子化するかどうか。エンベディングは暗黙的に単位ノルムであると想定されるため、任意のディメンションの値は [-1.0, 1.0] の範囲になります。このオプションが設定されていない場合は、 l2Normalize オプションを使用します。 Boolean False

データの準備

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

Image Embedder の 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);

結果を処理して表示する

推論を実行すると、Image Embedder タスクは、入力画像またはフレームのエンベディング ベクトルを含む 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]);

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