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

La tarea 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 capacidades, 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 segmentación de imágenes interactiva para Android. El ejemplo funciona con imágenes seleccionadas de la galería del dispositivo.

Puedes usar la app como punto de partida de 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, haz lo siguiente:

  1. Usa el siguiente comando para clonar el repositorio de Git:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. De manera opcional, configura tu instancia de Git para que use un proceso de confirmación de compra disperso, de modo que solo tengas los archivos para la app de ejemplo del Segmentador de imágenes interactivo:
    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 de Android.

Componentes clave

Los siguientes archivos contienen el código fundamental para 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 los proyectos de código a fin de usar el Segmentador de imágenes interactivo. Si quieres obtener información general sobre cómo configurar tu entorno de desarrollo para usar tareas de MediaPipe, incluidos los requisitos de 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 necesarias con el siguiente código:

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

Modelo

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

Selecciona y descarga el modelo. Luego, almacénalo 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 de 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 enmascaramiento. 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((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

Para obtener 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 incluye 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 configura 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 es parte del objeto ubicado en el área de interés. {True, False} False
outputConfidenceMasks Si se configura como True, el resultado incluye una máscara de segmentación como una imagen de valor flotante, en la que cada valor flotante representa la confianza de que el píxel es parte del objeto ubicado en el área de interés. {True, False} True
displayNamesLocale Configura 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 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 No establecida

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

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 Segmentador de imágenes interactivo muestra las regiones de los segmentos identificados 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 del Segmentador de imágenes interactivo 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, de confianza o ambas, según lo que configuraste 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 de una máscara de valor de categoría con un área de punto de interés indicada. Cada píxel es un valor uint8 que indica si el píxel es parte del objeto ubicado en el área de interés. El círculo blanco y negro de la segunda imagen indica el área de interés seleccionada.

Resultado original de la imagen y 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 flotantes entre [0, 1] para cada canal de entrada de imagen. Los valores más altos indican una mayor confianza en que el píxel de la imagen es parte del objeto ubicado en el área de interés.