A tarefa do segmentador de imagem interativa do MediaPipe usa um local em uma imagem, estima os limites de um objeto nesse local e retorna a segmentação do objeto 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 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 app de segmentação de imagens interativas 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 existente. O código de exemplo do segmentador de imagem interativo está hospedado no GitHub.
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:
- Clone o repositório do Git usando o seguinte comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Opcionalmente, configure sua instância do Git para usar o checkout esparso,
para que você tenha apenas os arquivos do app de exemplo do Segmentador 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ê pode importar o projeto para o Android Studio e executar o app. Para ver instruções, consulte o Guia de configuração para Android.
Principais componentes
Os arquivos a seguir contêm o código crucial para este exemplo de aplicativo de segmentação de imagens:
- InteractiveSegmentationHelper.kt: inicializa a tarefa do segmentador de imagem interativo e processa a seleção de modelo e delegado.
- OverlayView.kt: processa e formata os resultados da 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 imagem interativo. Para informações gerais sobre como configurar seu ambiente de desenvolvimento para usar as tarefas do MediaPipe, incluindo os requisitos da versão da plataforma, consulte o Guia de configuração para Android.
Dependências
O segmentador 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 do MediaPipe Interactive Image Segmenter requer um modelo treinado compatível com essa tarefa. Para mais informações sobre os modelos treinados disponíveis para o Segmentador de imagem interativo, consulte a seção "Modelos" da 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
Você pode usar 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(exception -> { // Process the segmentation errors here. }) .build(); interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);
Para conferir um exemplo mais detalhado de como configurar essa 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 inclui 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 inclui 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 serem usados para os nomes de exibição fornecidos nos metadados do modelo da tarefa, se disponível. O padrão é en para
o inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado
usando a API Writer de metadados do TensorFlow Lite.
| Código de localidade | en |
errorListener |
Define um listener de erro opcional. | N/A | Não definido |
Preparar dados
O Segmentador de imagem interativo funciona com imagens, e a tarefa processa a 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 à
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. MPImage mpImage = new BitmapImageBuilder(bitmap).build();
No código de exemplo do segmentador de imagem interativo, o preparo de dados é processado 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 do segmentador de imagem interativa 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
.
Processar e mostrar resultados
Ao executar a inferência, a tarefa do segmentador de imagem interativa 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,
uma máscara de confiança ou ambas, dependendo do que você definiu ao
configurar a tarefa.
As seções a seguir explicam melhor os dados de saída desta 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 da máscara de imagem original 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.