MediaPipe Image Segmenter タスクでは、事前定義されたリソースに基づいて画像をリージョンに分割 背景のぼかしなどの視覚効果を適用するカテゴリです。これらの では、Android アプリで画像セグメンタを使用する方法を説明しています。コード ここで説明する例は、 GitHub。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。
サンプルコード
MediaPipe Tasks のコードサンプルには、 Android 用 Image Segmenter アプリ:
この例では、実際の Android デバイスのカメラを使用して、 ライブカメラフィードで画像セグメンテーションを実行するか、画像と 動画をストリーミングできますこれらのアプリは、 カスタマイズすることも、既存のアプリに変更を加える際に参照することもできます。「 画像セグメントツールのサンプルコードは GitHub。
以降のセクションでは カテゴリマスクを使用した画像セグメンテーション 。
コードをダウンロードする
次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。
<ph type="x-smartling-placeholder">サンプルコードをダウンロードするには:
- 次のコマンドを使用して Git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように 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 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();
動画
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 video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
ライブ配信
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s 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 年) 見てみましょう。