Guia interativo de segmentação de imagens para Android

A tarefa MediaPipe Interactive Image Segmenter utiliza um local em uma imagem, estima os limites de um objeto nesse local e retorna a segmentação dele como dados de imagem. Estas instruções mostram como usar o segmentador de imagem interativo com apps Android. O exemplo de código descrito nestas instruções está disponível no GitHub. Para mais informações sobre os recursos, modelos e opções de configuração dessa tarefa, consulte a Visão geral.

Exemplo de código

O exemplo de código do MediaPipe Tasks é uma implementação simples de um app do Segmenter de imagem interativo para Android. O exemplo funciona com imagens selecionadas na galeria do dispositivo.

Você pode usar o app como ponto de partida para seu próprio app Android ou se referir a ele ao modificar um app já existente. O código de exemplo do Interactive Image Segmenter está hospedado no GitHub (em inglês).

Fazer o download do código

As instruções a seguir mostram como criar uma cópia local do código de exemplo usando a ferramenta de linha de comando git.

Para fazer o download do código de exemplo:

  1. Clone o repositório git usando o seguinte comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Como opção, configure sua instância git para usar a finalização da compra esparsa para que você tenha apenas os arquivos do app de exemplo do segmento de imagem interativo:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

Depois de criar uma versão local do código de exemplo, você poderá importar o projeto para o Android Studio e executar o app. Para conferir instruções, consulte o Guia de configuração para Android.

Principais componentes

Os arquivos a seguir contêm o código essencial para este exemplo de aplicativo de segmentação de imagens:

Configuração

Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código para usar o segmento de imagem interativo. Para ter informações gerais sobre como configurar seu ambiente de desenvolvimento para usar tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte o Guia de configuração para Android.

Dependências

O Segmenter de imagem interativo usa a biblioteca com.google.mediapipe:tasks-vision. Adicione essa dependência ao arquivo build.gradle do projeto de desenvolvimento de apps Android. Importe as dependências necessárias com o seguinte código:

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

Modelo

A tarefa MediaPipe Interactive Image Segmenter requer um modelo treinado compatível com ela. Para mais informações sobre os modelos treinados disponíveis para o Interactive Image Segmenter, consulte a seção Modelos de visão geral da tarefa.

Selecione e faça o download do modelo e armazene-o no diretório do projeto:

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

Use o método BaseOptions.Builder.setModelAssetPath() para especificar o caminho usado pelo modelo. Esse método é mostrado no exemplo de código na próxima seção.

No código de exemplo do Segmentador de imagem interativo, o modelo é definido na classe InteractiveSegmenterHelper.kt na função setupInteractiveSegmenter().

Criar a tarefa

Use a função createFromOptions para criar a tarefa. A função createFromOptions aceita opções de configuração, incluindo tipos de saída de máscara. Para mais informações sobre as opções de configuração, consulte Visão geral da configuração.

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 um exemplo mais detalhado de configuração dessa tarefa, consulte a função setupInteractiveSegmenter() da classe InteractiveSegmenterHelper.

Opções de configuração

Esta tarefa tem as seguintes opções de configuração para apps Android:

Nome da opção Descrição Intervalo de valor Valor padrão
outputCategoryMask Se definido como True, a saída incluirá uma máscara de segmentação como uma imagem uint8, em que cada valor de pixel indica se o pixel faz parte do objeto localizado na área de interesse. {True, False} False
outputConfidenceMasks Se definido como True, a saída incluirá uma máscara de segmentação como uma imagem de valor flutuante, em que cada valor flutuante representa a confiança de que o pixel faz parte do objeto localizado na área de interesse. {True, False} True
displayNamesLocale Define o idioma dos rótulos a ser usado para nomes de exibição fornecidos nos metadados do modelo da tarefa, se disponível. O padrão é en para inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado usando a API TensorFlow Lite Metadata Writer Código da localidade en
errorListener Define um listener de erro opcional. N/A Não definido

preparar dados

O segmento de imagens interativo funciona com imagens, e a tarefa lida com o pré-processamento de entrada de dados, incluindo redimensionamento, rotação e normalização de valores. É necessário converter a imagem de entrada em um objeto com.google.mediapipe.framework.image.MPImage antes de transmiti-la para a tarefa.

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

No código de exemplo do Segmentador de imagem interativo, a preparação dos dados é processada na classe InteractiveSegmenterHelper pela função segment().

Executar a tarefa

Chame a função segment para executar a previsão e gerar segmentos. A tarefa "Segmento de imagem interativo" retorna as regiões de segmento identificadas na imagem de entrada.

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

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

No código de exemplo do Segmentador de imagem interativo, as funções segment são definidas no arquivo InteractiveSegmenterHelper.kt.

Gerenciar e mostrar resultados

Ao executar a inferência, a tarefa "Segmento de imagem interativo" retorna um objeto ImageSegmenterResult que contém os resultados da tarefa de segmentação. O conteúdo da saída pode incluir uma máscara de categoria, máscara de confiança ou ambas, dependendo do que você definiu quando configurou a tarefa.

As seções a seguir explicam melhor os dados de saída dessa tarefa:

Máscara de categoria

As imagens a seguir mostram uma visualização da saída da tarefa para uma máscara de valor de categoria com uma área de interesse indicada. Cada pixel é um valor uint8 que indica se o pixel faz parte do objeto localizado na área de interesse. O círculo preto e branco na segunda imagem indica a área de interesse selecionada.

Saída original da máscara de imagem e categoria. Imagem de origem do conjunto de dados Pascal VOC 2012.

Máscara de confiança

A saída de uma máscara de confiança contém valores flutuantes entre [0, 1] para cada canal de entrada de imagem. Valores mais altos indicam uma confiança maior de que o pixel da imagem faz parte do objeto localizado na área de interesse.