Guía interactiva de segmentación de imágenes para Android

La tarea del segmentador de imágenes interactivo de MediaPipe toma una ubicación en una imagen, estima los límites de un objeto en esa ubicación y muestra la segmentación del objeto como datos de imagen. En estas instrucciones, se muestra cómo usar el Segmentador de imágenes interactivo con apps para Android. El ejemplo de código que se describe en estas instrucciones está disponible en GitHub. Para obtener más información sobre las funciones, los modelos y las opciones de configuración de esta tarea, consulta la descripción general.

Ejemplo de código

El ejemplo de código de MediaPipe Tasks es una implementación simple de una app de Interactive Image Segmenter para Android. El ejemplo funciona con imágenes seleccionadas de la galería del dispositivo.

Puedes usar la app como punto de partida para tu propia app para Android o consultarla cuando modifiques una app existente. El código de ejemplo del Segmentador de imágenes interactivo se aloja en GitHub.

Descarga el código

En las siguientes instrucciones, se muestra cómo crear una copia local del código de ejemplo con la herramienta de línea de comandos git.

Para descargar el código de ejemplo, sigue estos pasos:

  1. Clona el repositorio de git con el siguiente comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. De manera opcional, configura tu instancia de git para usar el control de revisión disperso, de modo que solo tengas los archivos de la app de ejemplo de Interactive Image Segmenter:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

Después de crear una versión local del código de ejemplo, puedes importar el proyecto a Android Studio y ejecutar la app. Para obtener instrucciones, consulta la Guía de configuración para Android.

Componentes clave

Los siguientes archivos contienen el código fundamental de esta aplicación de ejemplo de segmentación de imágenes:

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y proyectos de código para usar Interactive Image Segmenter. Si deseas obtener información general sobre cómo configurar tu entorno de desarrollo para usar tareas de MediaPipe, incluidos los requisitos de la versión de la plataforma, consulta la Guía de configuración para Android.

Dependencias

El Segmentador de imágenes interactivo usa la biblioteca com.google.mediapipe:tasks-vision. Agrega esta dependencia al archivo build.gradle de tu proyecto de desarrollo de apps para Android. Importa las dependencias requeridas con el siguiente código:

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

Modelo

La tarea del segmentador de imágenes interactivo de MediaPipe requiere un modelo entrenado que sea compatible con esta tarea. Para obtener más información sobre los modelos entrenados disponibles para el Segmentador de imágenes interactivo, consulta la sección Modelos de la descripción general de la tarea.

Selecciona y descarga el modelo, y guárdalo en el directorio de tu proyecto:

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

Usa el método BaseOptions.Builder.setModelAssetPath() para especificar la ruta que usa el modelo. Este método se muestra en el ejemplo de código de la siguiente sección.

En el código de ejemplo del Segmentador de imágenes interactivo, el modelo se define en la clase InteractiveSegmenterHelper.kt en la función setupInteractiveSegmenter().

Crea la tarea

Puedes usar la función createFromOptions para crear la tarea. La función createFromOptions acepta opciones de configuración, incluidos los tipos de salida de máscara. Para obtener más información sobre las opciones de configuración, consulta Descripción general de la configuración.

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

Para ver un ejemplo más detallado de cómo configurar esta tarea, consulta la función setupInteractiveSegmenter() de la clase InteractiveSegmenterHelper.

Opciones de configuración

Esta tarea tiene las siguientes opciones de configuración para apps para Android:

Nombre de la opción Descripción Rango de valores Valor predeterminado
outputCategoryMask Si se establece en True, el resultado incluye una máscara de segmentación como una imagen uint8, en la que cada valor de píxel indica si el píxel forma parte del objeto ubicado en el área de interés. {True, False} False
outputConfidenceMasks Si se establece en True, el resultado incluye una máscara de segmentación como una imagen de valor de punto flotante, en la que cada valor de punto flotante representa la confianza de que el píxel es parte del objeto ubicado en el área de interés. {True, False} True
displayNamesLocale Establece el idioma de las etiquetas que se usarán para los nombres visibles proporcionados en los metadatos del modelo de la tarea, si están disponibles. El valor predeterminado es en para el inglés. Puedes agregar etiquetas localizadas a los metadatos de un modelo personalizado con la API de Metadata Writer de TensorFlow Lite. Código de configuración regional en
errorListener Establece un objeto de escucha de errores opcional. N/A Sin establecer

Preparar los datos

El Segmentador de imágenes interactivo funciona con imágenes, y la tarea controla el procesamiento previo de la entrada de datos, lo que incluye el cambio de tamaño, la rotación y la normalización de valores. Debes convertir la imagen de entrada en un objeto com.google.mediapipe.framework.image.MPImage antes de pasarla a la tarea.

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

En el código de ejemplo del Segmentador de imágenes interactivo, la función segment() controla la preparación de los datos en la clase InteractiveSegmenterHelper.

Ejecuta la tarea

Llama a la función segment para ejecutar la predicción y generar segmentos. La tarea de Segmentador de imágenes interactivo muestra las regiones de segmentos identificadas dentro de la imagen de entrada.

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

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

En el código de ejemplo del Segmentador de imágenes interactivo, las funciones segment se definen en el archivo InteractiveSegmenterHelper.kt.

Cómo controlar y mostrar los resultados

Cuando se ejecuta la inferencia, la tarea Interactive Image Segmenter muestra un objeto ImageSegmenterResult que contiene los resultados de la tarea de segmentación. El contenido del resultado puede incluir una máscara de categoría, una máscara de confianza o ambas, según lo que hayas establecido cuando configuraste la tarea.

En las siguientes secciones, se explican con más detalle los datos de salida de esta tarea:

Máscara de categoría

En las siguientes imágenes, se muestra una visualización del resultado de la tarea para una máscara de valor de categoría con un área de interés de punto indicada. Cada píxel es un valor uint8 que indica si el píxel forma parte del objeto ubicado en el área de interés. El círculo en blanco y negro de la segunda imagen indica el área de interés seleccionada.

Un perro de pie en medio de un montón de hojas La forma con contorno del perro de la imagen anterior

Imagen original y resultado de la máscara de categoría. Imagen de origen del conjunto de datos Pascal VOC 2012.

Máscara de confianza

El resultado de una máscara de confianza contiene valores de punto flotante entre [0, 1] para cada canal de entrada de imagen. Los valores más altos indican una mayor confianza de que el píxel de la imagen forma parte del objeto ubicado en el área de interés.