Guia de segmentação de imagens para Python

A tarefa "Segmento de imagem do MediaPipe" permite dividir imagens em regiões com base em categorias para aplicar efeitos visuais, como desfoque do plano de fundo. Esses mostram como usar o segmentador de imagens com a linguagem Python. Para mais informações sobre os recursos, modelos e opções de configuração do para esta tarefa, consulte a Visão geral.

Exemplo de código

O código de exemplo para o segmentador de imagens fornece uma implementação completa em Python para sua referência. Esse código ajuda a testar a tarefa começou a criar seu próprio aplicativo de segmentação de imagem. Você pode exibir, executar e editar o segmentador de imagens exemplo de código 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 segmentador de imagens. 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 Python. Você pode revisar o código-fonte deste exemplo em GitHub

Pacotes

A tarefa segmentador de imagem do MediaPipe requer o pacote mediapipe. É possível instalar as dependências necessárias com o seguinte comando:

$ python -m pip install mediapipe

Importações

Importe as seguintes classes para acessar as funções da tarefa do Segmentador de imagens:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Modelo

A tarefa do segmentador de imagens do MediaPipe requer um modelo treinado que seja compatível com essa tarefa. Para mais informações sobre modelos treinados disponíveis para o segmentador de imagens, consulte a 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:

model_path = '/absolute/path/to/model.tflite'

Especifique o caminho do modelo dentro do parâmetro "Nome do modelo", conforme mostrado abaixo:

base_options = BaseOptions(model_asset_path=model_path)

Criar a tarefa

A tarefa Segmentação por imagem do MediaPipe usa a função create_from_options para para configurar a tarefa. A função create_from_options aceita valores das opções de configuração. Para mais informações sobre configuração de tarefas, consulte Opções de configuração.

Esses exemplos também mostram as variações da construção da tarefa para imagens, arquivos de vídeo e streams de vídeo ao vivo.

Imagem

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Vídeo

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Transmissão ao vivo

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

Opções de configuração

Esta tarefa tem as seguintes opções de configuração para aplicativos Python:

Nome da opção Descrição Intervalo de valor Valor padrão
running_mode Define o modo de execução da tarefa. Existem três modos:

IMAGEM: o modo para entradas de imagem única.

VÍDEO: o modo para frames decodificados de um vídeo.

LIVE_STREAM: o modo de transmissão ao vivo da entrada dados de uma câmera, por exemplo. Neste modo, resultListener deve ser chamado para configurar um listener e receber resultados de forma assíncrona.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask 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 a categoria vencedora . {True, False} False
output_confidence_masks 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 mapa de pontuação da categoria. {True, False} True
display_names_locale 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
result_callback 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 corrida está definido como LIVE_STREAM N/A N/A

Preparar dados

Prepare sua entrada como um arquivo de imagem ou uma matriz numpy, e depois converter em um objeto mediapipe.Image. Se a entrada for um arquivo de vídeo ou transmissão ao vivo por webcam, é possível usar uma biblioteca externa, como OpenCV para carregar os frames de entrada como numpy matrizes de dados.

Imagem

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

Vídeo

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate to calculate the timestamp for each frame.
# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Transmissão ao vivo

# Use OpenCV’s VideoCapture to start capturing from the webcam.
# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Para um exemplo de código que mostra a preparação de dados para o segmentador de imagens, consulte o exemplo de código.

Executar a tarefa

O segmentador de imagens usa segment, segment_for_video e segment_async para acionar inferências. Para a segmentação de imagens, isso envolve pré-processamento de dados de entrada, execução de modelos de segmentação e pós-processamento as saídas do modelo bruto para as máscaras segmentadas.

Os exemplos de código a seguir mostram como executar o processamento com o modelo de tarefa.

Imagem

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

Vídeo

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

Transmissão ao vivo

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

Observe o seguinte:

  • Ao executar nos modos de vídeo ou de transmissão ao vivo, você também precisa forneça à tarefa do Segmentador de imagens o carimbo de data/hora do frame de entrada.
  • Ao executar na imagem ou no modelo de vídeo, a tarefa do Segmentador de imagens bloquear a linha de execução atual até que ela termine de processar a imagem de entrada ou frame.

Para ver um exemplo mais completo de como executar inferências do segmentador de imagens, consulte o exemplo de código.

Gerenciar e exibir resultados

O segmentador de imagens gera uma lista de dados de Image. Se output_type é CATEGORY_MASK, a saída é uma lista contendo uma máscara segmentada como uma imagem uint8. O pixel indica índice de categoria reconhecido da imagem de entrada. Se output_type for CONFIDENCE_MASK, a saída será um vetor com o tamanho do número da categoria. Cada A máscara segmentada é uma imagem flutuante dentro do intervalo [0,1], representando pontuação de confiança do pixel que pertence à categoria.

As seções abaixo mostram exemplos dos dados de saída desta tarefa:

Confiança da categoria

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

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

Valor da categoria

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

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