L'attività Segmentazione delle immagini di MediaPipe consente di dividere le immagini in regioni in base a categorie per l'applicazione di effetti visivi, ad esempio la sfocatura dello sfondo. Questi istruzioni mostrano come utilizzare lo strumento di segmentazione delle immagini con le app per Android. Il codice descritto in queste istruzioni è disponibile su GitHub. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
L'esempio di codice Attività MediaPipe contiene due semplici implementazioni di un App di segmentazione delle immagini per Android:
- Segmentazione di immagini con maschera di categoria
- Segmentazione delle immagini con maschera di confidenza
Negli esempi viene utilizzata la fotocamera di un dispositivo Android fisico per eseguire la segmentazione delle immagini su un feed live della videocamera, oppure scegliere immagini e video dalla galleria del dispositivo. Puoi usare le app come punto di partenza per creare un'app per Android personale o farvi riferimento quando modifichi un'app esistente. La Il codice di esempio del segmento di immagini è ospitato su GitHub.
Le sezioni seguenti fanno riferimento Segmentazione di immagini con maschera di categoria dell'app.
Scarica il codice
Le seguenti istruzioni mostrano come creare una copia locale dell'esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
- Clona il repository git utilizzando il comando seguente:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Facoltativamente, configura l'istanza Git in modo da utilizzare il pagamento sparso,
in modo da avere solo i file per l'app di esempio dello strumento di segmentazione delle immagini:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_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, vedi Guida alla configurazione per Android.
Componenti chiave
I seguenti file contengono il codice fondamentale per questa immagine Esempio di applicazione di segmentazione:
- ImageSegmenterHelper.kt: Inizializza l'attività Segmenter immagini e gestisce il modello e delega selezione.
- CameraFragment.kt: Fornisce l'interfaccia utente e il codice di controllo per una videocamera.
- GalleryFragment.kt: Fornisce l'interfaccia utente e il codice di controllo per la selezione di immagini e video .
- OverlayView.kt: Gestisce e formatta i risultati della segmentazione.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare la segmentazione delle immagini. Per informazioni generali su configurare l'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta Guida alla configurazione per Android.
Dipendenze
La funzionalità di segmentazione delle immagini utilizza la raccolta com.google.mediapipe:tasks-vision
. Aggiungi questo
al file build.gradle
del tuo
Progetto di sviluppo app per Android. Importa le dipendenze richieste con
il seguente codice:
dependencies {
...
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività Segmenter immagini MediaPipe richiede un modello addestrato che sia compatibile con dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per la segmentazione delle immagini, consulta la panoramica delle attività nella sezione Modelli.
Seleziona e scarica il modello, quindi archivialo nella directory del progetto:
<dev-project-root>/src/main/assets
Usa il metodo BaseOptions.Builder.setModelAssetPath()
per specificare il percorso
usato dal modello. Questo metodo è indicato nell'esempio di codice della
.
Nel segmentazione delle immagini
esempio di codice,
Il modello è definito in ImageSegmenterHelper.kt
nella funzione setupImageSegmenter()
.
Crea l'attività
Puoi utilizzare la funzione createFromOptions
per creare l'attività. La
La funzione createFromOptions
accetta opzioni di configurazione, incluso l'output della maschera
di testo. Per ulteriori informazioni sulla configurazione delle attività, consulta
Opzioni di configurazione.
L'attività Segmentazione delle immagini supporta i seguenti tipi di dati di input: immagini statiche, file video e stream video in diretta. Devi specificare la modalità di corsa corrispondenti al tipo di dati di input durante la creazione dell'attività. Scegli la scheda per il tipo di dati di input per vedere come creare l'attività.
Immagine
ImageSegmenterOptions options = ImageSegmenterOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setRunningMode(RunningMode.IMAGE) .setOutputCategoryMask(true) .setOutputConfidenceMasks(false) .build(); imagesegmenter = ImageSegmenter.createFromOptions(context, options);
Video
ImageSegmenterOptions options = ImageSegmenterOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setRunningMode(RunningMode.VIDEO) .setOutputCategoryMask(true) .setOutputConfidenceMasks(false) .build(); imagesegmenter = ImageSegmenter.createFromOptions(context, options);
Live streaming
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)
L'implementazione del codice di esempio del segmento di immagini consente all'utente di passare da
di elaborazione. L'approccio rende il codice di creazione delle attività più complicato
potrebbero non essere appropriati per il tuo caso d'uso. Puoi trovare questo codice nel
ImageSegmenterHelper
dalla funzione setupImageSegmenter()
.
Opzioni di configurazione
Questa attività include le seguenti opzioni di configurazione per le app per Android:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
runningMode |
Imposta la modalità di esecuzione per l'attività. Esistono tre tipi di
modalità: IMAGE: la modalità per gli input di immagini singole. VIDEO: la modalità per i fotogrammi decodificati di un video. LIVE_STREAM: la modalità per un live streaming di input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
outputCategoryMask |
Se impostato su True , l'output include una maschera di segmentazione
come un'immagine uint8, in cui ogni valore di pixel indica la categoria vincente
valore. |
{True, False } |
False |
outputConfidenceMasks |
Se impostato su True , l'output include una maschera di segmentazione
come immagine con valore in virgola mobile, in cui ogni valore in virgola mobile rappresenta la confidenza
la mappa dei punteggi della categoria. |
{True, False } |
True |
displayNamesLocale |
Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nel
metadati del modello dell'attività, se disponibili. Il valore predefinito è en per
Inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato
Utilizzando l'API TensorFlow Metadata Writer |
Codice impostazioni internazionali | it |
resultListener |
Imposta il listener di risultati per ricevere i risultati della segmentazione
in modo asincrono quando il segmento di immagini è in modalità LIVE_STREAM .
Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM |
N/D | N/D |
errorListener |
Imposta un listener di errori facoltativo. | N/D | Non impostato |
Preparazione dei dati
La funzionalità di segmentazione delle immagini funziona con immagini, file video e video in live streaming. L'attività gestisce la pre-elaborazione dell'input di dati, tra cui il ridimensionamento, la rotazione e il valore della normalizzazione.
Devi convertire l'immagine o il frame di input in un
com.google.mediapipe.framework.image.MPImage
prima di passarlo all'oggetto
Segmentazione delle immagini.
Immagine
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();
Video
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();
Live streaming
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();
Nel codice di esempio del Segmenter di immagini, la preparazione dei dati viene gestita nel campo
ImageSegmenterHelper
dalla funzione segmentLiveStreamFrame()
.
Esegui l'attività
Chiamerai una funzione segment
diversa in base alla modalità di corsa in uso.
La funzione di segmentazione delle immagini restituisce le regioni di segmenti identificate all'interno dei tag
l'immagine o il frame di input.
Immagine
ImageSegmenterResult segmenterResult = imagesegmenter.segment(image);
Video
// 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);
Live streaming
// 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);
Tieni presente quanto segue:
- Quando è attiva la modalità video o live streaming, devi anche fornisce il timestamp del frame di input all'attività Segmentazione delle immagini.
- Quando è in esecuzione in modalità immagine o video, l'attività Segmentazione delle immagini blocca il thread corrente finché non termina di elaborare l'immagine di input o frame. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in una in background.
- Quando viene eseguita in modalità live streaming, l'attività Segmentazione delle immagini non blocca
il thread corrente, ma restituisce immediatamente. Richiamerà il suo risultato
con il risultato del rilevamento ogni volta che termina l'elaborazione di un
frame di input. Se la funzione
segmentAsync
viene chiamata quando lo strumento di segmentazione delle immagini l'attività è impegnata a elaborare un altro frame, ignora il nuovo frame di input.
Nel codice di esempio del Segmenter di immagini, le funzioni segment
sono definite nella
ImageSegmenterHelper.kt
.
Gestire e visualizzare i risultati
Dopo l'esecuzione dell'inferenza, l'attività Segmentazione delle immagini restituisce un ImageSegmenterResult
contenente i risultati dell'attività di segmentazione. I contenuti
l'output dipende dal valore outputType
impostato
configurato l'attività.
Le seguenti sezioni mostrano esempi di dati di output di questa attività:
Confidenza nella categoria
Le seguenti immagini mostrano una visualizzazione dell'output dell'attività per una categoria
maschera di confidenza. L'output della maschera di confidenza contiene valori in virgola mobile tra
[0, 1]
.
Output della maschera di confidenza dell'immagine originale e della categoria. Immagine di origine dalla VOC Pascal 2012 del set di dati.
Valore categoria
Le seguenti immagini mostrano una visualizzazione dell'output dell'attività per una categoria
come maschera del valore. L'intervallo della maschera di categoria è [0, 255]
e il valore di ogni pixel
rappresenta l'indice della categoria vincente dell'output del modello. La categoria vincente
ha il punteggio più alto tra le categorie che il modello può riconoscere.
Output della maschera di categoria e dell'immagine originale. Immagine di origine dalla VOC Pascal 2012 del set di dati.