MediaPipe Image Segmenter タスクを使用すると、事前定義されたカテゴリに基づいて画像を領域に分割し、背景のぼかしなどの視覚効果を適用できます。以下の手順では、Node アプリとウェブアプリで Image Segmenter を使用する方法について説明します。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。
サンプルコード
Image Segmenter のサンプルコードには、このタスクの JavaScript での完全な実装が記載されています。このコードは、このタスクをテストし、独自の画像分割アプリの作成を開始するのに役立ちます。ウェブブラウザのみを使用して、画像分割ツールのサンプルコードを表示、実行、編集できます。この例のコードは GitHub でも確認できます。
セットアップ
このセクションでは、Image Segmenter を使用するように開発環境とコード プロジェクトを設定する主な手順について説明します。プラットフォーム バージョンの要件など、MediaPipe タスクを使用する開発環境の設定に関する一般的な情報については、ウェブ向けの設定ガイドをご覧ください。
JavaScript パッケージ
画像セグメンテーション コードは、MediaPipe @mediapipe/tasks-vision
NPM パッケージで入手できます。これらのライブラリは、プラットフォームの設定ガイドに記載されているリンクから検索してダウンロードできます。
ローカル ステージング用に必要なパッケージをインストールするには、次のコマンドを使用します。
npm install --save @mediapipe/tasks-vision
コンテンツ配信ネットワーク(CDN)サービス経由でタスクコードをインポートする場合は、HTML ファイルの タグに次のコードを追加します。
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
crossorigin="anonymous"></script>
</head>
モデル
MediaPipe Image Segmenter タスクには、このタスクに対応したトレーニング済みモデルが必要です。Image Segmenter で使用可能なトレーニング済みモデルの詳細については、タスクの概要のモデルのセクションをご覧ください。
モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。
<dev-project-root>/app/shared/models/
タスクを作成する
Image Segmenter の createFrom...()
関数のいずれかを使用して、推論を実行するタスクを準備します。トレーニング済みモデルファイルの相対パスまたは絶対パスを指定して createFromModelPath()
関数を使用します。モデルがすでにメモリに読み込まれている場合は、createFromModelBuffer()
メソッドを使用できます。
次のコードサンプルは、createFromOptions()
関数を使用してタスクを設定する方法を示しています。createFromOptions
関数を使用すると、構成オプションで Image Segmenter をカスタマイズできます。タスクの構成の詳細については、構成オプションをご覧ください。
次のコードは、カスタム オプションを使用してタスクをビルドして構成する方法を示しています。
runningMode = "IMAGE";
async function createImageSegmenter() {
const vision = await FilesetResolver.forVisionTasks(
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
imageSegmenter = await ImageSegmenter.createFromOptions(vision, {
baseOptions: {
modelAssetPath:
"https://storage.googleapis.com/mediapipe-assets/deeplabv3.tflite?generation=1661875711618421",
},
outputCategoryMask: true,
outputConfidenceMasks: false
runningMode: runningMode
});
}
createImageSegmenter();
Image Segmenter タスクの作成の完全な実装については、コードサンプルをご覧ください。
設定オプション
このタスクには、ウェブ アプリケーションの次の構成オプションがあります。
オプション名 | 説明 | 値の範囲 | デフォルト値 |
---|---|---|---|
outputCategoryMask |
True に設定すると、出力には uint8 画像としてセグメンテーション マスクが含まれます。各ピクセル値は、最も高いスコアのカテゴリ値を示します。 |
{True, False } |
False |
outputConfidenceMasks |
True に設定すると、出力には浮動小数点値画像としてセグメンテーション マスクが含まれます。各浮動小数点値は、カテゴリの信頼スコア マップを表します。 |
{True, False } |
True |
displayNamesLocale |
タスクのモデルのメタデータで指定されている表示名に使用するラベルの言語を設定します(利用可能な場合)。デフォルトは英語で en です。TensorFlow Lite Metadata Writer API を使用して、カスタムモデルのメタデータにローカライズされたラベルを追加できます。 |
言語 / 地域コード | en |
resultListener |
画像セグメンタが LIVE_STREAM モードのときに、セグメンテーション結果を非同期で受信するように結果リスナーを設定します。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます。 |
なし | なし |
データの準備
Image Segmenter は、ホストブラウザでサポートされている任意の形式で画像内のオブジェクトをセグメント化できます。このタスクは、サイズ変更、回転、値の正規化などのデータ入力前処理も処理します。
Image Segmenter の segment()
メソッドと segmentForVideo()
メソッドの呼び出しは同期的に実行され、ユーザー インターフェース スレッドをブロックします。デバイスのカメラから動画フレームのオブジェクトをセグメント化する場合、各セグメンテーション タスクはメインスレッドをブロックします。これを防ぐには、別のスレッドで segment()
と segmentForVideo()
を実行するようにウェブワーカーを実装します。
タスクを実行する
Image Segmenter は、画像モードで segment()
メソッドを使用し、video
モードで segmentForVideo()
メソッドを使用して推論をトリガーします。Image Segmenter は、検出されたセグメントを画像データとして、タスクの推論実行時に設定したコールバック関数に返します。
次のコードは、タスクモデルを使用して処理を実行する方法を示しています。
画像
const image = document.getElementById("image") as HTMLImageElement; imageSegmenter.segment(image, callback);
動画
async function renderLoop(): void { const video = document.getElementById("video"); let startTimeMs = performance.now(); imageSegmenter.segmentForVideo(video, startTimeMs, callbackForVideo); requestAnimationFrame(() => { renderLoop(); }); }
Image Segmenter タスクの実行の完全な実装については、コード例をご覧ください。
結果を処理して表示する
推論を実行すると、Image Segmenter タスクはセグメント画像データをコールバック関数に返します。出力のコンテンツは、タスクの構成時に設定した outputType
によって異なります。
以降のセクションでは、このタスクの出力データの例を示します。
カテゴリの信頼度
次の画像は、カテゴリ信頼度マスクのタスク出力の可視化を示しています。信頼度マスクの出力には、[0, 1]
の間の浮動小数点値が含まれます。
元の画像とカテゴリ信頼度マスクの出力。Pascal VOC 2012 データセットのソース画像。
カテゴリ値
次の画像は、カテゴリ値マスクのタスク出力の可視化を示しています。カテゴリ マスクの範囲は [0, 255]
で、各ピクセル値はモデル出力の勝者カテゴリ インデックスを表します。勝ちのカテゴリ インデックスは、モデルが認識できるカテゴリの中で最も高いスコアです。
元の画像とカテゴリ マスクの出力。Pascal VOC 2012 データセットのソース画像。
Image Segmenter のサンプルコードは、タスクから返されたセグメンテーション結果を表示する方法を示しています。詳細については、コードサンプルをご覧ください。