Guia interativo de segmentação de imagens para Android

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

Exemplo de código

O exemplo de código do MediaPipe Tasks é uma implementação simples de um segmentador 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 consultá-lo ao modificar um aplicativo existente. O exemplo de código do segmentador de imagem interativo está hospedado em GitHub.

Fazer o download do código

As instruções a seguir mostram como criar uma cópia local do 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 do Git para usar a finalização esparsa. Portanto, você tem apenas os arquivos do aplicativo de exemplo do segmentador de imagens 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ê pode importar o projeto no Android Studio e executar o app. Para instruções, consulte a Guia de configuração para Android.

Principais componentes

Os arquivos a seguir contêm o código crucial para esta imagem Exemplo de aplicativo de segmentação:

Configuração

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

Dependências

O segmentador de imagem interativo usa a biblioteca com.google.mediapipe:tasks-vision. Adicionar dependência do arquivo build.gradle da 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 do segmentador de imagem interativo do MediaPipe requer um modelo treinado que seja compatível com essa tarefa. Para mais informações sobre os modelos treinados disponíveis para o segmentador de imagens interativas, consulte na seção de visão geral da tarefa Modelos.

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. usados pelo modelo. Esse método é mostrado no exemplo de código nos próximos nesta seção.

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

Criar a tarefa

Use a função createFromOptions para criar a tarefa. A A função createFromOptions aceita opções de configuração, incluindo máscara de entrada. Para mais informações sobre configurações opções, 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(exception -> {
         // Process the segmentation errors here.
    })    
    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

Para um exemplo mais detalhado da configuração desta tarefa, consulte o InteractiveSegmenterHelper função setupInteractiveSegmenter() da classe.

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 o objeto 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 que o pixel é parte do objeto localizado na área de interesse. {True, False} True
displayNamesLocale Define o idioma dos rótulos a serem usados para nomes de exibição fornecidos no metadados do modelo da tarefa, se disponíveis. O padrão é en para inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado usando a API Metadata Writer do TensorFlow Lite; Código da localidade en
errorListener Define um listener de erro opcional. N/A Não definido

Preparar dados

O segmentador interativo de imagens funciona com imagens, e a tarefa processa a entrada de dados pré-processamento, incluindo redimensionamento, rotação e normalização de valores. Você precisa converter a imagem de entrada com.google.mediapipe.framework.image.MPImage antes de transmiti-lo ao tarefa.

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

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

Gerenciar e exibir resultados

Ao executar a inferência, a tarefa segmentador de imagem interativo retorna uma O objeto ImageSegmenterResult, que contém os resultados do 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ê definir ao 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 categoria máscara de valor com a indicação de uma área de interesse. Cada pixel é um 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 o área de interesse.

Imagem original e saída de máscara de categoria. Imagem de origem do Pascal VOC 2012 (em inglês) no conjunto de dados.

Máscara de confiança

A saída de uma máscara de confiança contém valores flutuantes entre [0, 1] para 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.