A tarefa do segmentador de imagens do MediaPipe 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 com a linguagem Python. 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 para o segmentador de imagens oferece uma implementação completa dessa tarefa em Python para sua referência. Esse código ajuda a testar essa tarefa e começar a criar seu próprio aplicativo de segmentação de imagens. É possível conferir, executar e editar o código de exemplo do Segmentador de imagens usando apenas o 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 o ambiente de desenvolvimento para usar as tarefas do MediaPipe, incluindo os requisitos da versão da plataforma, consulte o Guia de configuração para Python. Confira o código-fonte deste exemplo no GitHub.
Pacotes
A tarefa do 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 classes a seguir para acessar as funções de tarefa do segmentador de imagem:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modelo
A tarefa do segmentador de imagem do MediaPipe 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 Models (Modelos) da visão geral da tarefa.
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 no parâmetro "Nome do modelo", conforme mostrado abaixo:
base_options = BaseOptions(model_asset_path=model_path)
Criar a tarefa
A tarefa de segmentação de imagem do MediaPipe usa a função create_from_options
para
configurar a tarefa. A função create_from_options
aceita valores
para que as opções de configuração sejam processadas. Para mais informações sobre a configuração de tarefas,
consulte Opções de configuração.
Esses exemplos também mostram as variações da construção de tarefas para imagens, arquivos de vídeo e transmissões 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. Há três
modos: IMAGE: o modo para entradas de imagem única. VÍDEO: o modo para quadros decodificados de um vídeo. LIVE_STREAM: o modo de uma transmissão ao vivo de dados de entrada, como de uma câmera. Nesse modo, o resultListener precisa ser chamado para configurar um listener para receber resultados de forma assíncrona. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
output_category_mask |
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 o valor da categoria
vencedora. |
{True, False } |
False |
output_confidence_masks |
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 o mapa de pontuação de confiança da categoria. |
{True, False } |
True |
display_names_locale |
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 |
result_callback |
Define o listener de resultado 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
Prepare a entrada como um arquivo de imagem ou uma matriz NumPy
e converta-a em um objeto mediapipe.Image
. Se a entrada for um arquivo de vídeo
ou uma transmissão ao vivo de uma webcam, use uma biblioteca externa, como o
OpenCV, para carregar os frames de entrada como matrizes
numpy.
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 conferir um exemplo de código que mostra o preparo de dados para o Image Segmenter, consulte o exemplo de código.
Executar a tarefa
O segmentador de imagens usa as funções segment
, segment_for_video
e segment_async
para acionar inferências. Para a segmentação de imagens, isso envolve
pré-processar dados de entrada, executar o modelo de segmentação e pós-processar
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 no modo de vídeo ou de transmissão ao vivo, também é necessário fornecer à tarefa do segmentador de imagem o carimbo de data/hora do frame de entrada.
- Ao ser executada no modelo de imagem ou vídeo, a tarefa do segmentador de imagem bloqueia a linha de execução atual até que ela termine de processar a imagem de entrada ou o frame.
Para conferir um exemplo mais completo de execução de inferências do segmentador de imagens, consulte o exemplo de código.
Processar e mostrar resultados
O segmentador de imagens gera uma lista de dados Image
. Se
output_type
for CATEGORY_MASK
, a saída será uma lista
que contém uma máscara segmentada única como uma imagem uint8. O pixel indica o
í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
máscara segmentada é uma imagem flutuante no intervalo [0,1]
, representando a
pontuação de confiança do pixel pertencente à categoria.
As seções a seguir 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 máscara de confiança
de categoria. A saída da máscara de confiança contém valores flutuantes entre
[0, 1]
.
Saída da máscara de confiança da imagem original e 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 de categoria vencedor da saída do modelo. O índice da categoria vencedora
tem a maior pontuação entre as categorias que o modelo pode reconhecer.
Saída da máscara de imagem original e categoria. Imagem de origem do conjunto de dados Pascal VOC 2012.