Android 互動式圖片區隔指南

MediaPipe Interactive Image Segmenter 工作會擷取圖片中的某個位置,估算該位置物件的邊界,並以圖片資料的形式傳回物件的區隔。本操作說明將說明如何在 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 設定指南

重要元件

下列檔案包含此圖像分割範例應用程式的重要程式碼:

設定

本節將說明設定開發環境和程式碼專案以使用互動式圖片分割器的關鍵步驟。如要進一步瞭解如何設定開發環境以使用 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();

在互動式圖片分割器範例程式碼中,資料準備作業會由 segment() 函式在 InteractiveSegmenterHelper 類別中處理。

執行工作

呼叫 segment 函式執行預測並產生區段。「互動式圖像區隔器」工作會傳回輸入圖片中已識別的區隔區域。

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

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

在互動式圖片分割器範例程式碼中,segment 函式是在 InteractiveSegmenterHelper.kt 檔案中定義。

處理及顯示結果

執行推論時,互動式圖像區隔器工作會傳回 ImageSegmenterResult 物件,其中包含區隔工作結果。輸出內容可能包含類別遮罩和/或信心遮罩,具體取決於您在設定工作時設定的內容。

以下各節將進一步說明此工作產生的輸出資料:

類別遮罩

下圖顯示分類值遮罩任務輸出的視覺化效果,其中標示出感興趣的點區域。每個像素都是 uint8 值,用於指出該像素是否位於感興趣區域的物件。第二張圖片中的黑白圓圈,代表所選取的興趣所在區域。

一隻狗站在一堆落葉中 上一個圖片中狗的輪廓形狀

原始圖片和類別遮罩輸出結果。Pascal VOC 2012 資料集的原始圖片。

可信度遮罩

信心遮罩的輸出內容包含每個圖像輸入通道的 [0, 1] 之間浮點值。值越高,表示圖片像素是位於感興趣區域的物件一部分的可信度越高。