Guida interattiva alla segmentazione delle immagini per Android

L'attività MediaPipe Interactive Image Segmenter prende una posizione in un'immagine, stima i confini di un oggetto in quella posizione e restituisce la segmentazione dell'oggetto come dati immagine. Queste istruzioni mostrano come utilizzare lo Segmentatore di immagini interattivo con le app per Android. L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

L'esempio di codice di MediaPipe Tasks è una semplice implementazione di un'app di segmentazione delle immagini interattiva per Android. L'esempio funziona con le immagini selezionate dalla galleria del dispositivo.

Puoi utilizzare l'app come punto di partenza per la tua app per Android o farvi riferimento quando modifichi un'app esistente. Il codice di esempio di Interactive Image Segmenter è ospitato su GitHub.

Scarica il codice

Le istruzioni riportate di seguito mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il seguente comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura l'istanza Git in modo da utilizzare il controllo sparse, in modo da avere solo i file per l'app di esempio Interactive Image Segmenter:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

Dopo aver creato una versione locale del codice di esempio, puoi importare il progetto in Android Studio ed eseguire l'app. Per istruzioni, consulta la Guida alla configurazione per Android.

Componenti chiave

I seguenti file contengono il codice fondamentale per questa applicazione di esempio di segmentazione delle immagini:

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice per utilizzare Interactive Image Segmenter. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per Android.

Dipendenze

Interactive Image Segmenter utilizza la libreria com.google.mediapipe:tasks-vision. Aggiungi questa dipendenza al file build.gradle del tuo progetto di sviluppo di app per Android. Importa le dipendenze richieste con il seguente codice:

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

Modello

L'attività di segmentazione delle immagini interattive di MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per lo strumento di segmentazione delle immagini interattivo, consulta la sezione Modelli della panoramica dell'attività.

Seleziona e scarica il modello, quindi memorizzalo nella directory del progetto:

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

Utilizza il metodo BaseOptions.Builder.setModelAssetPath() per specificare il percorso utilizzato dal modello. Questo metodo è mostrato nell'esempio di codice nella sezione successiva.

Nel codice di esempio di Interactive Image Segmenter, il modello è definito nella classe InteractiveSegmenterHelper.kt nella funzione setupInteractiveSegmenter().

Crea l'attività

Puoi utilizzare la funzione createFromOptions per creare l'attività. La funzione createFromOptions accetta opzioni di configurazione, tra cui i tipi di output della maschera. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.

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);

Per un esempio più dettagliato della configurazione di questa attività, consulta la funzione setupInteractiveSegmenter() della classe InteractiveSegmenterHelper.

Opzioni di configurazione

Questa attività offre le seguenti opzioni di configurazione per le app per Android:

Nome opzione Descrizione Intervallo di valori Valore predefinito
outputCategoryMask Se impostato su True, l'output include una maschera di segmentazione come immagine uint8, in cui ogni valore del pixel indica se il pixel fa parte dell'oggetto nell'area di interesse. {True, False} False
outputConfidenceMasks Se impostato su True, l'output include una maschera di segmentazione come immagine con valore float, in cui ogni valore float rappresenta la confidenza che il pixel fa parte dell'oggetto nell'area di interesse. {True, False} True
displayNamesLocale Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nei metadati del modello dell'attività, se disponibile. Il valore predefinito è en per l'inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato utilizzando l'API TensorFlow Lite Metadata Writer Codice delle impostazioni internazionali it
errorListener Imposta un listener di errore facoltativo. N/D Non impostato

Preparazione dei dati

Lo strumento di segmentazione delle immagini interattive funziona con le immagini e gestisce la preelaborazione dei dati di input, tra cui ridimensionamento, rotazione e normalizzazione dei valori. Devi convertire l'immagine di input in un oggetto com.google.mediapipe.framework.image.MPImage prima di trasmetterla all'attività.

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();

Nel codice di esempio di Interactive Image Segmenter, la preparazione dei dati viene gestita nella classe InteractiveSegmenterHelper dalla funzione segment().

Esegui l'attività

Chiama la funzione segment per eseguire la previsione e generare i segmenti. L'attività Segmentazione delle immagini interattiva restituisce le regioni dei segmenti identificati all'interno dell'immagine di input.

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

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

Nel codice di esempio di Interactive Image Segmenter, le funzioni segment sono definite nel file InteractiveSegmenterHelper.kt.

Gestire e visualizzare i risultati

Dopo l'esecuzione dell'inferenza, l'attività di segmentazione delle immagini interattive restituisce un oggetto ImageSegmenterResult contenente i risultati dell'attività di segmentazione. I contenuti dell'output possono includere una maschera di categoria, una maschera di attendibilità o entrambe, a seconda di ciò che hai impostato quando hai configurato l'attività.

Le sezioni seguenti spiegano ulteriormente i dati di output di questa attività:

Maschera delle categorie

Le seguenti immagini mostrano una visualizzazione dell'output dell'attività per una maschera di valore della categoria con un punto di interesse indicato. Ogni pixel è un valore uint8 che indica se il pixel fa parte dell'oggetto situato nell'area di interesse. Il cerchio bianco e nero nella seconda immagine indica l'area di interesse selezionata.

Un cane in piedi in mezzo a una pila di foglie La forma delineata del cane dell&#39;immagine precedente

Output dell'immagine originale e della maschera della categoria. Immagine di origine del set di dati Pascal VOC 2012.

Maschera di confidenza

L'output di una maschera di confidenza contiene valori di tipo float compresi tra [0, 1] per ogni canale di input dell'immagine. Valori più elevati indicano una maggiore certezza che il pixel dell'immagine faccia parte dell'oggetto nell'area di interesse.