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

La tarea del Segmentador de imágenes interactiva de MediaPipe toma una ubicación en una imagen y estima los límites de un objeto en esa ubicación y devuelve la segmentación del objeto como datos de imágenes. Estas instrucciones te muestran cómo usar el segmentador de imágenes interactivo con Apps para Android. El ejemplo de código descrito en estas instrucciones está disponible en GitHub: Para obtener más información sobre las capacidades, los modelos y las opciones de configuración para completar esta tarea, consulta la Descripción general.

Ejemplo de código

El ejemplo de código de tareas de MediaPipe es una implementación simple de un segmentador de imágenes interactivo 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 hacer referencia a ella. cuando se modifica 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 ejemplo con la herramienta de línea de comandos git.

Para descargar el código de ejemplo, haz lo siguiente:

  1. Clona el repositorio de Git con el siguiente comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. De forma opcional, configura tu instancia de Git para que use el resultado escaso. para que solo tengas los archivos de 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 en 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 esencial para esta imagen ejemplo de segmentación:

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y proyectos de código para usar el segmentador de imágenes interactivo. Para obtener información general configurar tu entorno de desarrollo para usar tareas de MediaPipe, como de la versión de la plataforma, consulta la Guía de configuración para Android.

Dependencias

El segmento interactivo de imágenes usa la biblioteca com.google.mediapipe:tasks-vision. Agregar 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 del Segmentador de imágenes interactiva 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; luego, 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 de acceso. que usa el modelo. Este método se muestra en el ejemplo de código de la siguiente sección.

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

Crea la tarea

Puedes usar la función createFromOptions para crear la tarea. El La función createFromOptions acepta las opciones de configuración, que incluyen enmascarar tipos de salida. Para obtener más información sobre la 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 obtener un ejemplo más detallado de la configuración de esta tarea, consulta el InteractiveSegmenterHelper función de clase setupInteractiveSegmenter().

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 incluirá una máscara de segmentación. que una imagen de uint8, donde cada valor de píxel indica si el píxel es parte de el objeto ubicado en el área de interés. {True, False} False
outputConfidenceMasks Si se establece en True, el resultado incluirá una máscara de segmentación. como una imagen de valor flotante, donde cada valor flotante representa la confianza que el píxel sea 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 que se proporcionan en la 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 Configura un objeto de escucha de errores opcional. N/A Sin establecer

Preparar los datos

El segmentador de imágenes interactivo trabaja con imágenes y la tarea controla la entrada de datos el procesamiento previo, incluidos el cambio de tamaño, la rotación y la normalización de valores. Debes convertir la imagen de entrada en com.google.mediapipe.framework.image.MPImage antes de pasarlo al 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();
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 InteractiveSegmenterHelper.kt .

Cómo controlar y mostrar resultados

Luego de ejecutar la inferencia, la tarea del Segmentador de imágenes interactivo devuelve un ImageSegmenterResult, que contiene los resultados de lo siguiente: de segmentación personalizada. El contenido del resultado puede incluir una máscara de categoría, de confianza, o ambas, según lo que establezcas cuando configuró 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 categoría de valor con un área de interés indicada. Cada píxel es un uint8 valor 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 la imagen o en un área de interés.

Resultado de imagen original y máscara de categoría. Imagen de origen de Pascal VOC 2012 conjunto de datos.

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 que El píxel de imagen es parte del objeto ubicado en el área de interés.