A tarefa do MediaPipe Face Pointser permite detectar pontos de referência do rosto e expressões faciais em imagens e vídeos. É possível usar essa tarefa para identificar expressões faciais humanas e aplicar filtros e efeitos faciais para criar um avatar virtual. Essa tarefa usa modelos de machine learning (ML) que funcionam com imagens únicas ou um fluxo contínuo de imagens. A tarefa gera pontos de referência tridimensionais de rostos, pontuações de mesclagem (coeficientes que representam expressão facial) para inferir superfícies faciais detalhadas em tempo real e gera matrizes de transformação para realizar as transformações necessárias para a renderização de efeitos.
O exemplo de código descrito nestas instruções está disponível no GitHub. 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 código de exemplo do Face extras fornece uma implementação completa dessa tarefa em Python para sua referência. Esse código ajuda você a testar essa tarefa e começar a criar seu próprio ponto de referência de rosto. É possível visualizar, executar e editar o código de exemplo do Face extras (link em inglês) usando apenas seu navegador da Web.
Se você estiver implementando o Rospberry Pi, consulte o app de exemplo do Raspberry Pi (link em inglês).
Configuração
Nesta seção, descrevemos as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código para usar o recurso de reconhecimento facial. Para informações gerais sobre a configuração do ambiente de desenvolvimento para uso de tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte o Guia de configuração para Python.
Pacotes
A tarefa MediaPipe Face Framework requer o pacote PyPI do MediaPipe. É possível instalar e importar essas dependências com o seguinte:
$ python -m pip install mediapipe
Importações
Importe as seguintes classes para acessar as funções da tarefa do Ponto de referência do rosto:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modelo
A tarefa do MediaPipe Face Framework requer um modelo treinado compatível com essa tarefa. Para mais informações sobre os modelos treinados disponíveis para o ponto de referência facial, consulte a seção Modelos de visão geral da tarefa.
Selecione e faça o download do modelo e 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 modelo a ser usado. Confira um exemplo de código na próxima seção.
Criar a tarefa
A tarefa do MediaPipe Face extras usa a função create_from_options
para configurar a
tarefa. A função create_from_options
aceita valores a serem processados pelas opções de configuração. Para mais informações sobre as opções de configuração, consulte
Opções de configuração.
O código a seguir demonstra como criar e configurar essa tarefa.
Esses exemplos também mostram as variações de construção da tarefa para imagens, arquivos de vídeo e transmissão 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. # ...
Video
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 conferir um exemplo completo de como criar um ponto de referência facial para uso com uma imagem, consulte o exemplo de código.
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. VIDEO: o modo para frames decodificados de um vídeo. LIVE_STREAM: é o modo para 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 |
num_faces |
O número máximo de rostos que podem ser detectados pelo
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 pontuação de presença facial na detecção de pontos de referência de rostos. | Float [0.0,1.0] |
0.5 |
min_tracking_confidence |
A pontuação de confiança mínima para que o rastreamento facial seja considerado bem-sucedido. | Float [0.0,1.0] |
0.5 |
output_face_blendshapes |
Define se o Ponto de referência de rosto gera formas mescladas de rostos. As mesclagens de rostos são usadas para renderizar o modelo de rosto 3D. | Boolean |
False |
output_facial_transformation_matrixes |
Indica se o FaceLandmarker gera a matriz de transformação facial. O FaceLandmarker usa a matriz para transformar os pontos de referência faciais de um modelo de rosto canônico no rosto detectado para que os usuários possam aplicar efeitos a eles. | Boolean |
False |
result_callback |
Define o listener de resultado para receber os resultados do ponto de referência de forma assíncrona quando FaceLandmarker está 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 a converta em um
objeto mediapipe.Image
. Se a entrada for um arquivo de vídeo ou uma transmissão ao vivo de uma
webcam, você poderá usar uma biblioteca externa, como
OpenCV, para carregar os frames de entrada como matrizes
numpy.
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)
Video
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 facial usa as funções detect
, detect_for_video
e detect_async
para acionar inferências. Para o ponto de referência de rostos, isso envolve o pré-processamento de dados de entrada e a detecção de rostos na imagem.
O código a seguir demonstra como executar o processamento com o modelo de tarefa.
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)
Video
# 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:
- Quando a execução é feita no modo de vídeo ou de transmissão ao vivo, forneça também à tarefa do Face Summary (link em inglês) o carimbo de data/hora do frame de entrada.
- Quando executada no modelo de imagem ou vídeo, a tarefa "Marco de rostos" bloqueia a 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 "Marco do rosto" retorna imediatamente e não bloqueia a linha de execução atual. Ele vai invocar o listener de resultados com o resultado da detecção sempre que terminar de processar um frame de entrada. Se a função de detecção for chamada quando a tarefa do Face Markdown estiver ocupada processando outro frame, a tarefa ignorará o novo frame de entrada.
Para conferir um exemplo completo da execução de um ponto de referência facial em uma imagem, consulte o exemplo de código (link em inglês) para mais detalhes.
Gerenciar e mostrar resultados
O Marcador de rosto retorna um objeto FaceLandmarkerResult
para cada execução de
detecção. O objeto de resultado contém uma malha de rostos para cada rosto detectado, com
coordenadas para cada ponto de referência. Opcionalmente, o objeto de resultado também pode
conter mergeshapes, que denotam expressões faciais, e uma matriz de transformação facial para aplicar efeitos faciais nos pontos de referência detectados.
Veja a seguir um exemplo dos dados de saída dessa 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 Marcador de rosto demonstra como mostrar os resultados retornados da tarefa. Consulte o exemplo de código para mais detalhes.