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:
- Clona el repositorio de git con el siguiente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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:
- InteractiveSegmentationHelper.kt: Inicializa la tarea de Interactive Image Segmenter y controla el modelo y la selección del delegado.
- OverlayView.kt: Controla y da formato a los resultados de la 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 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 user’s device as a Bitmap object using BitmapFactory. // Convert an Android’s Bitmap object to a MediaPipe’s 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.
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.