Guia de segmentação de imagens para a Web

A tarefa MediaPipe Image Segmenter permite dividir imagens em regiões com base em categorias predefinidas para aplicar efeitos visuais, como desfoque de plano de fundo. Estas instruções mostram como usar o Image Segmenter para apps da Web e do Node. 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 Image Segmenter oferece uma implementação completa dessa tarefa em JavaScript para sua referência. Esse código ajuda você a testar essa tarefa e começar a criar seu próprio app de segmentação de imagens. É possível ver, executar e editar o exemplo do Image Segmenter usando apenas seu navegador da Web.

Configuração

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

Pacotes JavaScript

O código do segmentador de imagens está disponível no pacote NPM @mediapipe/tasks-vision do MediaPipe. Você pode encontrar e baixar essas bibliotecas nos links fornecidos no guia de configuração da plataforma.

É possível instalar os pacotes necessários com o seguinte código para teste local usando este comando:

npm install --save @mediapipe/tasks-vision

Se você quiser importar o código da tarefa usando um serviço de rede de fornecimento de conteúdo (CDN), adicione o seguinte código à tag <head> no arquivo HTML:

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.mjs"
    crossorigin="anonymous"></script>
</head>

Modelo

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

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

<dev-project-root>/app/shared/models/

Criar a tarefa

Use uma das funções do Image Segmenter createFrom...() para preparar a tarefa para executar inferências. Use a função createFromModelPath() com um caminho relativo ou absoluto para o arquivo modelo treinado. Se o modelo já estiver carregado na memória, use o método createFromModelBuffer().

O exemplo de código abaixo demonstra o uso da função createFromOptions() para configurar a tarefa. A função createFromOptions permite personalizar o Image Segmenter com opções de configuração. Para mais informações sobre a configuração de tarefas, consulte Opções de configuração.

O código a seguir demonstra como criar e configurar a tarefa com opções personalizadas:

runningMode = "IMAGE";

async function createImageSegmenter() {
  const vision = await FilesetResolver.forVisionTasks(
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
  );

  imageSegmenter = await ImageSegmenter.createFromOptions(vision, {
    baseOptions: {
      modelAssetPath:
        "https://storage.googleapis.com/mediapipe-assets/deeplabv3.tflite?generation=1661875711618421",
    },
    outputCategoryMask: true,
    outputConfidenceMasks: false
    runningMode: runningMode
  });
}
createImageSegmenter();

Para uma implementação mais completa da criação de uma tarefa de segmentador de imagens, consulte o exemplo de código.

Opções de configuração

Essa tarefa tem as seguintes opções de configuração para aplicativos da Web:

Nome da opção Descrição Intervalo de valor Valor padrão
outputCategoryMask Se definido como True, a saída vai incluir uma máscara de segmentação como uma imagem uint8, em que cada valor de pixel indica o valor da categoria vencedora. {True, False} False
outputConfidenceMasks Se definido como True, a saída vai incluir uma máscara de segmentação como uma imagem de valor de ponto flutuante, em que cada valor representa o mapa de pontuação de confiança da categoria. {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íveis. 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
resultListener Define o listener de resultados para receber os resultados da segmentação de forma assíncrona quando o segmentador de imagens está no modo LIVE_STREAM. Só pode ser usado quando o modo de execução está definido como LIVE_STREAM N/A N/A

Preparar dados

O Image Segmenter pode segmentar objetos em imagens de qualquer formato compatível com o navegador host. A tarefa também processa o pré-processamento de entrada de dados, incluindo redimensionamento, rotação e normalização de valores.

As chamadas para os métodos segment() e segmentForVideo() do Image Segmenter são executadas de forma síncrona e bloqueiam a linha de execução da interface do usuário. Se você segmentar objetos em frames de vídeo da câmera de um dispositivo, cada tarefa de segmentação vai bloquear a thread principal. Para evitar isso, implemente web workers para executar segment() e segmentForVideo() em outra linha de execução.

Executar a tarefa

O Image Segmenter usa o método segment() com o modo de imagem e o método segmentForVideo() com o modo video para acionar inferências. O segmentador de imagens retorna os segmentos detectados como dados de imagem para uma função de callback definida ao executar uma inferência para a tarefa.

O código a seguir demonstra como executar o processamento com o modelo de tarefa:

Imagem

const image = document.getElementById("image") as HTMLImageElement;
imageSegmenter.segment(image, callback);

Vídeo

async function renderLoop(): void {
  const video = document.getElementById("video");
  let startTimeMs = performance.now();

  imageSegmenter.segmentForVideo(video, startTimeMs, callbackForVideo);

  requestAnimationFrame(() => {
    renderLoop();
  });
}

Para uma implementação mais completa da execução de uma tarefa de segmentador de imagens, consulte o exemplo.

Processar e mostrar resultados

Ao executar a inferência, a tarefa Image Segmenter retorna dados de imagem de segmento para uma função de callback. O conteúdo da saída depende do outputType definido quando você configurou a tarefa.

As seções a seguir mostram exemplos dos dados de saída dessa tarefa:

Confiança da categoria

As imagens a seguir mostram uma visualização da saída da tarefa para uma máscara de confiança de categoria. A saída da máscara de confiança contém valores de ponto flutuante entre [0, 1].

Duas meninas montando um cavalo e uma menina caminhando ao lado dele A máscara de imagem que descreve o formato das meninas e do cavalo da foto anterior. A metade esquerda do contorno da imagem é capturada, mas a metade direita não é

Imagem original e saída da máscara de confiança da categoria. Imagem de origem do conjunto de dados Pascal VOC 2012.

Valor da categoria

As imagens a seguir mostram uma visualização da saída da tarefa para uma máscara de valor de categoria. O intervalo da máscara de categoria é [0, 255], e cada valor de pixel representa o índice da categoria vencedora da saída do modelo. O índice da categoria vencedora tem a maior pontuação entre as categorias que o modelo pode reconhecer.

Duas meninas montando um cavalo e uma menina caminhando ao lado dele A máscara de imagem que descreve o formato das meninas e do cavalo da imagem anterior. O formato das três meninas e do cavalo estão mascarados com precisão

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

O exemplo de código do Image Segmenter mostra como exibir os resultados da segmentação retornados da tarefa. Consulte o exemplo para mais detalhes.