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 設定指南」。

重要元件

下列檔案包含此圖片區隔範例應用程式的重要程式碼:

設定

本節說明設定開發環境及程式碼專案以使用互動式圖片區隔的重要步驟。如需瞭解如何設定開發環境以使用 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 設定選用的錯誤事件監聽器。 不適用 未設定

準備資料

互動式圖片區隔器會處理圖片,且工作會處理資料輸入預先處理作業,包括調整大小、旋轉和值正規化。您必須將輸入圖片轉換為 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();

在互動式圖片區隔範例程式碼中,資料準備是由 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] 之間的浮點值。值越大,代表圖片像素屬於所需區域中的物件,可信度越高。