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.