Przewodnik po wykrywaniu punktów orientacyjnych twarzy w Pythonie

Zadanie MediaPipe Face Markuper umożliwia wykrywanie punktów orientacyjnych i mimiki twarzy na zdjęciach i filmach. W tym zadaniu możesz rozpoznać mimikę oraz użyć filtrów i efektów twarzy, aby utworzyć wirtualny awatar. To zadanie wykorzystuje modele systemów uczących się, które mogą działać z pojedynczymi obrazami lub ciągłym strumieniem obrazów. Zadanie generuje trójwymiarowe punkty orientacyjne, wyniki mieszania (współczynniki reprezentujące wyraz twarzy), aby w czasie rzeczywistym określić szczegółowe dane o twarzach, oraz macierze przekształceń do wykonywania przekształceń wymaganych do renderowania efektów.

Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod aplikacji Face pointer zawiera pełną implementację tego zadania w Pythonie dla ułatwienia. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnego oznaczenia twarzy. Możesz wyświetlać, uruchamiać i edytować przykładowy kod aplikacji Face Pointer w przeglądarce internetowej.

Jeśli wdrażasz edytor twarzy dla Raspberry Pi, zapoznaj się z przykładową aplikacją Raspberry Pi.

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności, jakie należy wykonać, aby skonfigurować środowisko programistyczne i projekty kodu pod kątem użycia funkcji Face Pointer. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji języka Python.

Pakiety

Zadanie MediaPipe Face Punkt orientacyjny wymaga pakietu Mediapipe PyPI. Możesz zainstalować i zaimportować te zależności za pomocą:

$ python -m pip install mediapipe

Importowane dane

Aby uzyskać dostęp do funkcji zadania Oznaczenie twarzy, zaimportuj następujące klasy:

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

Model

Zadanie MediaPipe Face Punkt orientacyjny wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach dla znacznika twarzy znajdziesz w omówieniem zadań w sekcji dotyczącej modeli.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym:

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

Użyj parametru model_asset_path obiektu BaseOptions, aby określić ścieżkę modelu, który ma być używany. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Zadanie MediaPipe Face Pointer używa funkcji create_from_options do konfigurowania tego zadania. Funkcja create_from_options akceptuje wartości opcji konfiguracji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.

W tych przykładach widać też różne wersje konstrukcji zadań dla obrazów, plików wideo i transmisji na żywo.

Obraz

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

Wideo

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

Transmisja na żywo

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

Pełny przykład tworzenia obiektu orientacyjnego do wykorzystania z obrazem znajdziesz w przykładzie kodu.

Opcje konfiguracji

To zadanie ma następujące opcje konfiguracji aplikacji w Pythonie:

Nazwa opcji Opis Zakres wartości Wartość domyślna
running_mode Ustawia tryb działania zadania. Są 3 tryby:

IMAGE: tryb wprowadzania pojedynczych obrazów.

WIDEO: tryb dekodowanych klatek filmu.

TRANSMISJA NA ŻYWO: tryb transmisji danych wejściowych na żywo, np. z kamery. W tym trybie należy wywołać metodę resultListener, aby skonfigurować odbiornik, który będzie odbierał wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces Maksymalna liczba twarzy, które może wykryć FaceLandmarker. Wygładzanie jest stosowane tylko wtedy, gdy num_faces ma wartość 1. Integer > 0 1
min_face_detection_confidence Minimalny stopień pewności, że wykrywanie twarzy zostanie uznane za udane. Float [0.0,1.0] 0.5
min_face_presence_confidence Minimalny wskaźnik ufności wykrywania obecności twarzy w przypadku wykrywania punktów orientacyjnych twarzy. Float [0.0,1.0] 0.5
min_tracking_confidence Minimalny wynik pewności, że śledzenie twarzy zostanie uznane za udane. Float [0.0,1.0] 0.5
output_face_blendshapes Określa, czy kreator twarzy wyświetla kształty twarzy. Do renderowania 3D modelu twarzy używane są kształty mieszania twarzy. Boolean False
output_facial_transformation_matrixes Określa, czy FaceLandmarker generuje macierz transformacji twarzy. FaceLandmarker wykorzystuje macierz do przekształcania punktów orientacyjnych twarzy z kanonicznego modelu twarzy w wykrytą twarz, dzięki czemu użytkownicy mogą stosować efekty na wykryte punkty orientacyjne. Boolean False
result_callback Ustawia detektor wyników, aby asynchronicznie otrzymywać wyniki dotyczące punktów orientacyjnych, gdy FaceLandmarker jest w trybie transmisji na żywo. Tego ustawienia można używać tylko wtedy, gdy tryb biegowy jest ustawiony na LIVE_STREAM ResultListener N/A

Przygotuj dane

Przygotuj dane wejściowe jako plik graficzny lub tablicę numpy, a następnie przekonwertuj je na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z kamery internetowej, możesz użyć zewnętrznej biblioteki, takiej jak OpenCV, aby wczytać klatki wejściowe jako tablice numpy.

Obraz

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)
    

Wideo

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)
    

Transmisja na żywo

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)
    

Uruchamianie zadania

Do wyzwalania wnioskowania służy funkcja detect, detect_for_video i detect_async. W przypadku oznaczenia twarzy wiąże się to z wstępnym przetwarzaniem danych wejściowych i wykrywaniem twarzy na zdjęciu.

Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadań.

Obraz

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

Wideo

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

Transmisja na żywo

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

Uwaga:

  • Gdy urządzenie działa w trybie wideo lub w trybie transmisji na żywo, również dla zadania rozpoznawania twarzy podaj sygnaturę czasową klatki wejściowej.
  • Gdy działasz w obrazie lub modelu wideo, zadanie Oznaczenie punktów orientacyjnych twarzy blokuje bieżący wątek, dopóki nie zakończy się przetwarzanie obrazu wejściowego lub klatki.
  • W trybie transmisji na żywo zadanie Oznaczenie twarzy przywraca natychmiast i nie blokuje bieżącego wątku. Wywoła on detektor wyników z wynikiem wykrywania za każdym razem, gdy zakończy przetwarzanie ramki wejściowej. Jeśli funkcja wykrywania zostanie wywołana, gdy zadanie Oznaczenie twarzy jest zajęte przetwarzaniem innej klatki, to zadanie zignoruje nową ramkę wejściową.

Pełny przykład uruchomienia na zdjęciu obszaru animacji twarzy znajdziesz w przykładowym kodzie.

Obsługa i wyświetlanie wyników

Punkt orientacyjny twarzy zwraca obiekt FaceLandmarkerResult przy każdym uruchomieniu wykrywania. Wynikowy obiekt zawiera siatkę z twarzami dla każdej wykrytej twarzy oraz współrzędne każdego punktu orientacyjnego. Opcjonalnie obiekt wyniku może zawierać również kształty twarzy oznaczające wyraz twarzy oraz macierz przekształceń twarzy do zastosowania efektów twarzy na wykryte punkty orientacyjne.

Poniżej znajdziesz przykład danych wyjściowych z tego zadania:

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]
    ...

Poniższy obraz przedstawia wizualizację wyników zadania:

Przykładowy kod funkcji rozpoznawania twarzy pokazuje, jak wyświetlać wyniki zwrócone z zadania. Szczegółowe informacje znajdziesz w przykładowym kodzie.