Android 向けインタラクティブ画像セグメンテーション ガイド

MediaPipe インタラクティブ画像セグメンテーション タスクは、画像内の位置を取得し、その位置にあるオブジェクトの境界を推定して、オブジェクトのセグメンテーションを画像データとして返します。ここでは、Android アプリでインタラクティブ画像セグメンテーションを使用する方法について説明します。この手順で説明されているコードサンプルは、GitHub で入手できます。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

MediaPipe Tasks のコード例は、Android 用のインタラクティブ画像セグメンタ アプリの簡単な実装です。 このサンプルは、デバイス ギャラリーから選択された画像に対して機能します。

アプリは、独自の Android アプリの出発点として使用できます。また、既存のアプリを変更するときにアプリを参照することもできます。インタラクティブ画像セグメンテーションのサンプルコードは GitHub でホストされています。

コードをダウンロードする

次の手順では、git コマンドライン ツールを使用してサンプルコードのローカルコピーを作成する方法を示します。

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して、git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成します。これにより、Interactive Image Segmenter サンプルアプリのファイルのみを使用できます。
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

サンプルコードのローカル バージョンを作成したら、Android Studio にプロジェクトをインポートしてアプリを実行できます。手順については、Android の設定ガイドをご覧ください。

主要コンポーネント

次のファイルには、この画像セグメンテーションのサンプル アプリケーションの重要なコードが含まれています。

  • InteractiveSegmentationHelper.kt - インタラクティブ画像 セグメンテーション タスクを初期化し、モデルを処理して選択を委任します。
  • OverlayView.kt - セグメンテーション結果を処理し、書式設定します。

セットアップ

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

依存関係

インタラクティブ画像セグメンタでは、com.google.mediapipe:tasks-vision ライブラリを使用します。この依存関係を Android アプリ開発プロジェクトの build.gradle ファイルに追加します。次のコードを使用して、必要な依存関係をインポートします。

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

モデル

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

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

<dev-project-root>/src/main/assets

BaseOptions.Builder.setModelAssetPath() メソッドを使用して、モデルで使用するパスを指定します。このメソッドは、次のセクションのコードサンプルで示しています。

インタラクティブ画像セグメンテーションのサンプルコードでは、モデルは setupInteractiveSegmenter() 関数の InteractiveSegmenterHelper.kt クラスで定義されています。

タスクを作成する

createFromOptions 関数を使用してタスクを作成できます。createFromOptions 関数は、マスク出力タイプなどの構成オプションを受け入れます。構成オプションの詳細については、構成の概要をご覧ください。

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

このタスクの設定の詳細な例については、InteractiveSegmenterHelper クラスの setupInteractiveSegmenter() 関数をご覧ください。

構成オプション

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

オプション名 説明 値の範囲 デフォルト値
outputCategoryMask True に設定すると、出力には uint8 画像としてセグメンテーション マスクが含まれます。各ピクセル値は、ピクセルが対象領域にあるオブジェクトの一部かどうかを示します。 {True, False} False
outputConfidenceMasks True に設定すると、出力には浮動小数点値の画像としてセグメンテーション マスクが含まれます。各浮動小数点値は、ピクセルが対象領域にあるオブジェクトの一部であるという信頼度を表します。 {True, False} True
displayNamesLocale タスクのモデルのメタデータで提供される表示名に使用するラベルの言語を設定します(利用可能な場合)。英語の場合、デフォルトは en です。TensorFlow Lite Metadata Writer API を使用して、カスタムモデルのメタデータにローカライズされたラベルを追加できます。言語 / 地域コード en
errorListener オプションのエラーリスナーを設定します。 なし 未設定

データの準備

Interactive Image Segmenter は画像を処理し、このタスクはサイズ変更、回転、値の正規化などのデータ入力の前処理を処理します。入力画像をタスクに渡す前に、com.google.mediapipe.framework.image.MPImage オブジェクトに変換する必要があります。

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();

インタラクティブ画像セグメンテーションのサンプルコードでは、データの準備は InteractiveSegmenterHelper クラスで segment() 関数によって処理されます。

タスクを実行する

segment 関数を呼び出して予測を実行し、セグメントを生成します。インタラクティブ画像セグメンテーション タスクは、入力画像内で識別されたセグメント領域を返します。

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

インタラクティブ画像セグメンテーションのサンプルコードでは、segment 関数が InteractiveSegmenterHelper.kt ファイルで定義されています。

結果を処理して表示する

推論を実行すると、インタラクティブ画像セグメンテーション タスクは、セグメンテーション タスクの結果を含む ImageSegmenterResult オブジェクトを返します。出力の内容には、タスクを構成したときに設定した内容に応じて、カテゴリマスク、信頼マスク、またはその両方が含まれます。

以降のセクションでは、このタスクからの出力データについて詳しく説明します。

カテゴリマスク

次の画像は、スポット領域が示されたカテゴリ値のマスクのタスク出力を可視化したものです。各ピクセルは、そのピクセルが関心のある領域にあるオブジェクトの一部かどうかを示す uint8 値です。2 番目の画像にある黒と白の円は、選択した対象領域を示しています。

元の画像とカテゴリマスクの出力。Pascal VOC 2012 データセットのソース画像。

信頼マスク

信頼度マスクの出力には、各画像入力チャネルの [0, 1] 間の浮動小数点値が含まれます。値が大きいほど、画像のピクセルが対象領域にあるオブジェクトの一部であるという信頼度が高くなります。