Guia de detecção de pontos de referência facial para Python

A tarefa MediaPipe Face Scoreer permite detectar pontos de referência do rosto e expressões faciais no imagens e vídeos. Use essa tarefa para identificar expressões faciais humanas e aplicar filtros e efeitos faciais para criar um avatar virtual. Esta tarefa usa de machine learning (ML) que funcionam com imagens únicas ou uma fluxo de imagens. A tarefa gera pontos de referência tridimensionais de rostos, forma de mistura pontuações (coeficientes que representam expressões faciais) para inferir dados faciais detalhados as superfícies em tempo real, e as matrizes de transformação transformações necessárias para a renderização de efeitos.

O exemplo de código descrito nestas instruções está disponível em GitHub. Para mais informações sobre recursos, modelos e opções de configuração, desta tarefa, consulte a Visão geral.

Exemplo de código

O código de exemplo do Face Markdowner fornece uma implementação completa desse em Python para sua referência. Esse código ajuda a testar a tarefa você começou a criar seu próprio ponto de referência de rostos. Você pode visualizar, executar e editar o Exemplo de Face Markdown código usando apenas seu navegador da Web.

Se você estiver implementando o Face marcoer para Raspberry Pi, consulte o Exemplo do Raspberry Pi app.

Configuração

Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código especificamente para usar o Face Pointser. 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 o Guia de configuração do Python.

Pacotes

A tarefa MediaPipe Face Markdowner exige o pacote PyPI do mediapipe. É possível instalar e importe essas dependências com o seguinte:

$ python -m pip install mediapipe

Importações

Importe as seguintes classes para acessar as funções de tarefa do Face Markdown:

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

Modelo

A tarefa MediaPipe Face Scoreer requer um modelo treinado que seja compatível com esse tarefa. Para mais informações sobre os modelos treinados disponíveis para o Face Pointser, consulte na seção de visão geral da tarefa Modelos.

Selecione e faça o download do modelo e, em seguida, armazene-o em um diretório local:

model_path = '/absolute/path/to/face_landmarker.task'

Use o parâmetro model_asset_path do objeto BaseOptions para especificar o caminho do o modelo a ser usado. Para conferir um exemplo de código, consulte a próxima seção.

Criar a tarefa

A tarefa MediaPipe Face Markdowner usa a função create_from_options para configurar o tarefa. A função create_from_options aceita valores para configuração. opções de processamento. Para mais informações sobre as opções de configuração, consulte Opções de configuração.

O código abaixo demonstra como criar e configurar essa tarefa.

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

Imagem

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Vídeo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the video mode:
options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Transmissão ao vivo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
FaceLandmarkerResult = mp.tasks.vision.FaceLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the live stream mode:
def print_result(result: FaceLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('face landmarker result: {}'.format(result))

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Para ver um exemplo completo de criação de um marco de rostos para uso com uma imagem, consulte o código exemplo.

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
num_faces O número máximo de rostos que podem ser detectados pelo o FaceLandmarker. A suavização só é aplicada quando num_faces é definido como 1. Integer > 0 1
min_face_detection_confidence A pontuação de confiança mínima para que a detecção facial seja considerada bem-sucedida. Float [0.0,1.0] 0.5
min_face_presence_confidence A pontuação de confiança mínima da presença facial na detecção de pontos de referência do rosto. Float [0.0,1.0] 0.5
min_tracking_confidence A pontuação de confiança mínima para o rastreamento facial para ser considerado bem-sucedido. Float [0.0,1.0] 0.5
output_face_blendshapes Define se o marco de rostos gera combinações de rostos. As formas de mesclagem de rostos são usadas para renderizar o modelo de rosto em 3D. Boolean False
output_facial_transformation_matrixes Define se FaceLandmarker gera o efeito facial matriz de transformação. O FaceLandmarker usa o para transformar os pontos de referência faciais de um modelo de rosto canônico para o rosto detectado, para que os usuários possam aplicar efeitos aos pontos de referência detectados. Boolean False
result_callback Define o listener de resultados para receber os resultados do detector de ponto de referência. de forma assíncrona quando FaceLandmarker estiver no modo de transmissão ao vivo. Só pode ser usado quando o modo de corrida está definido como LIVE_STREAM ResultListener N/A

Preparar dados

Prepare sua entrada como um arquivo de imagem ou uma matriz numpy e, em seguida, converta-a em um mediapipe.Image. Se sua entrada for um arquivo de vídeo ou uma transmissão ao vivo de um webcam, você pode usar uma biblioteca externa, como OpenCV para carregar os frames de entrada como numpy matrizes de dados.

Imagem

import mediapipe as mp

# 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

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it 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

import mediapipe as mp

# 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)
    

Executar a tarefa

O ponto de referência do rosto usa detect, detect_for_video e detect_async. para acionar inferências. Para pontos de referência de rostos, isso envolve pré-processar dados de entrada e detectar rostos na imagem;

O código a seguir demonstra como executar o processamento com a tarefa um modelo de machine learning.

Imagem

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the image mode.
face_landmarker_result = landmarker.detect(mp_image)
    

Vídeo

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the video mode.
face_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

Transmissão ao vivo

# Send live image data to perform face landmarking.
# The results are accessible via the `result_callback` provided in
# the `FaceLandmarkerOptions` object.
# The face landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

Observe o seguinte:

  • Ao executar no modo de vídeo ou de transmissão ao vivo, forneça também o O Face Marcer atribui o carimbo de data/hora do frame de entrada.
  • Ao executar na imagem ou no modelo de vídeo, a tarefa do Face Pointser bloqueia na linha de execução atual até terminar de processar a imagem ou o frame de entrada.
  • Quando executada no modo de transmissão ao vivo, a tarefa "Face Markdown" retorna imediatamente e não bloqueia a linha de execução atual. Ele vai invocar o resultado com o resultado da detecção sempre que ele termina de processar um frame de entrada. Se a função de detecção for chamada quando a tarefa "Roteiro do rosto" estiver ocupado processando outro frame, a tarefa ignorará o novo frame de entrada.

Para um exemplo completo de execução de um marco de rosto em uma imagem, consulte o código exemplo para mais detalhes.

Gerenciar e exibir resultados

O Face marcoer retorna um objeto FaceLandmarkerResult para cada detecção. correr. O objeto do resultado contém uma malha de rosto para cada rosto detectado, com coordenadas para cada ponto de referência do rosto. Opcionalmente, o objeto de resultado também pode contêm formas mistas, que indicam expressões faciais, e matriz de transformação para aplicar efeitos faciais aos pontos de referência detectados.

Confira abaixo um exemplo dos dados de saída desta tarefa:

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

A imagem abaixo mostra uma visualização da saída da tarefa:

O código de exemplo do Face marcoer demonstra como exibir os resultados retornados. da tarefa, consulte o código exemplo para mais detalhes.