Android 向け画像セグメンテーション ガイド

MediaPipe Image Segmenter タスクでは、事前定義されたリソースに基づいて画像をリージョンに分割 背景のぼかしなどの視覚効果を適用するカテゴリです。これらの では、Android アプリで画像セグメンタを使用する方法を説明しています。コード ここで説明する例は、 GitHub。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。

サンプルコード

MediaPipe Tasks のコードサンプルには、 Android 用 Image Segmenter アプリ:

この例では、実際の Android デバイスのカメラを使用して、 ライブカメラフィードで画像セグメンテーションを実行するか、画像と 動画をストリーミングできますこれらのアプリは、 カスタマイズすることも、既存のアプリに変更を加える際に参照することもできます。「 画像セグメントツールのサンプルコードは GitHub

以降のセクションでは カテゴリマスクを使用した画像セグメンテーション

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

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

<ph type="x-smartling-placeholder">

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

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

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

主要コンポーネント

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

  • ImageSegmenterHelper.kt - Image Segmenter タスクを初期化し、モデルとデリゲートを処理する 選択します。
  • CameraFragment.kt - カメラのユーザー インターフェースと制御コードを提供します。
  • GalleryFragment.kt - 画像と動画を選択するためのユーザー インターフェースと制御コードを提供します。 できます。
  • OverlayView.kt - セグメンテーションの結果を処理し、フォーマットします。

セットアップ

このセクションでは、開発環境をセットアップする主な手順と 画像セグメンテーション アプリを使用できます一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android の設定ガイド

<ph type="x-smartling-placeholder">

依存関係

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

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

モデル

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

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

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

BaseOptions.Builder.setModelAssetPath() メソッドを使用してパスを指定する 使用されます。このメソッドは、次のコードサンプルで参照されています。 。

イメージ セグメンテーション サンプルコード、 モデルは ImageSegmenterHelper.kt で定義されています。 setupImageSegmenter() 関数内で指定します。

タスクを作成する

タスクを作成するには、createFromOptions 関数を使用します。「 createFromOptions 関数は、マスク出力などの構成オプションを受け入れます できます。タスクの構成の詳細については、このモジュールの 構成オプション

画像セグメンテーション タスクは、静止画像、 動画ファイル、ライブ動画ストリームなどです。実行モードを指定する必要があります タスクの作成時に、入力データ型に対応する値を宣言します。タブを選択 タスクの作成方法を確認してください。

画像

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

動画

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

ライブ配信

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

画像セグメンタのコード実装例では、 処理モードを選択できますこのアプローチでは、タスク作成コードが複雑になり、 ユースケースに適さない場合がありますこのコードは ImageSegmenterHelper クラスを setupImageSegmenter() 関数で呼び出します。

構成オプション

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

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

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

VIDEO: 動画のデコードされたフレームのモード。

LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。 このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask True に設定すると、出力にはセグメンテーション マスクが含まれます。 uint8 イメージとして。各ピクセル値は落札カテゴリを示します。 あります。 {True, False} False
outputConfidenceMasks True に設定すると、出力にはセグメンテーション マスクが含まれます。 浮動小数点値の画像として格納され、各浮動小数点値は信頼度を カテゴリのスコアマップ。 {True, False} True
displayNamesLocale 指定された表示名に使うラベルの言語を設定します。 タスクのモデルのメタデータ(利用可能な場合)。デフォルトは en です。 英語。カスタムモデルのメタデータにローカライズされたラベルを追加できます。 TensorFlow Lite Metadata Writer API を使用 言語 / 地域コード en
resultListener セグメンテーション結果を受け取るように結果リスナーを設定します。 LIVE_STREAM モードの場合、非同期で実行できます。 実行モードが LIVE_STREAM に設定されている場合にのみ使用できます なし なし
errorListener オプションのエラーリスナーを設定します。 なし 未設定

データの準備

画像セグメンタは、画像、動画ファイル、ライブ ストリーム動画に対応しています。タスク サイズ変更、回転、値を含むデータ入力の前処理を処理 説明します。

入力画像またはフレームを com.google.mediapipe.framework.image.MPImage オブジェクトを使用してから Image Segmenter。

画像

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.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

動画

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

// Load a video file on the user's device using MediaMetadataRetriever

// From the videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. Youll need them
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

ライブ配信

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

// Create a CameraXs ImageAnalysis to continuously receive frames
// from the devices camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Androids ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Androids Image object and convert it to
// a MediaPipes Image object.
android.media.Image mediaImage = imageProxy.getImage()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

Image Segmenter のサンプルコードでは、データの準備を ImageSegmenterHelper クラスを segmentLiveStreamFrame() 関数で呼び出します。

タスクを実行する

使用している実行モードに応じて、異なる segment 関数を呼び出します。 Image Segmenter 関数は、指定された 入力画像やフレームです。

画像

ImageSegmenterResult segmenterResult = imagesegmenter.segment(image);
    

動画

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

ライブ配信

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

次の点にご留意ください。

  • 動画モードまたはライブ配信モードで実行する場合は、 入力フレームのタイムスタンプを画像セグメンテーション タスクに渡します。
  • 画像モードまたは動画モードで実行している場合、画像セグメント タスクは 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。ユーザー インターフェースがブロックされないように、 使用します。
  • ライブ ストリーム モードで実行している場合、画像セグメンタ タスクはブロックされない すぐに戻ります。このメソッドは、 完了するたびに、その検出結果が 表示されます。イメージ セグメンタが呼び出されたときに segmentAsync 関数が呼び出された場合、 タスクが別のフレームの処理でビジー状態の場合、タスクは新しい入力フレームを無視します。

画像セグメンタのサンプルコードでは、segment 関数が ImageSegmenterHelper.kt 表示されます。

結果の処理と表示

推論を実行すると、画像セグメンタ タスクは ImageSegmenterResult を返します。 このオブジェクトには、セグメンテーション タスクの結果が含まれます。内容 出力は、コマンドの実行時に設定した outputType によって異なります。 タスクを構成します。

次のセクションでは、このタスクからの出力データの例を示します。

カテゴリの信頼度

次の画像は、特定のカテゴリのタスク出力を可視化したものです。 マスクされます。信頼マスクの出力には、次の範囲の浮動小数点値が含まれます。 [0, 1]

元の画像とカテゴリの信頼度マスクの出力。からのソース画像 Pascal VOC(2012 年) 見てみましょう。

カテゴリの値

次の画像は、特定のカテゴリのタスク出力を可視化したものです。 あります。カテゴリマスクの範囲は [0, 255] で、各ピクセル値 モデル出力の成功カテゴリ インデックスを表します。受賞部門 モデルが認識できるカテゴリの中で、最も高いスコアになります。

元の画像とカテゴリマスクの出力。からのソース画像 Pascal VOC(2012 年) 見てみましょう。