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

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

サンプルコード

MediaPipe Tasks のコードサンプルは、Android 向けのインタラクティブな画像セグメンテーション アプリのシンプルな実装です。 この例では、デバイスのギャラリーから選択した画像を使用します。

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

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

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

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

  1. 次のコマンドを使用して、Git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成して、インタラクティブ イメージ セグメンタの例アプリのファイルのみを取得します。
    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(exception -> {
         // 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 オプションのエラー リスナーを設定します。 なし 未設定

データの準備

インタラクティブ画像セグメンテーションは画像を処理し、タスクはサイズ変更、回転、値の正規化などのデータ入力前処理を処理します。入力画像をタスクに渡す前に、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 users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage 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] の間の浮動小数点値が含まれます。値が大きいほど、画像ピクセルが対象領域にあるオブジェクトの一部である可能性が高いことを示します。