Zadanie MediaPipe Face Landmarker umożliwia wykrywanie punktów orientacyjnych twarzy i wyrazów twarzy na zdjęciach i w filmach. Za pomocą tego zadania możesz rozpoznawać ludzkie mimiki i stosować filtry oraz efekty twarzy, aby tworzyć wirtualnego awatara. To zadanie korzysta z modeli uczenia maszynowego, które mogą działać z pojedynczymi obrazami lub ciągłym strumieniem obrazów. Zadanie to generuje 3D-wymiarowe punkty orientacyjne twarzy, wartości blendshape (współczynniki reprezentujące mimikę twarzy), aby w czasie rzeczywistym wywnioskować szczegółowe powierzchnie twarzy, oraz macierze przekształceń, aby wykonać przekształcenia wymagane 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 związanych z tym zadaniem znajdziesz w sekcji Omówienie.
Przykładowy kod
Przykładowy kod usługi Face Landmarker zawiera kompletną implementację tego zadania w Pythonie. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnego narzędzia do wykrywania punktów orientacyjnych twarzy. Przykładowy kod Face Landmarker możesz wyświetlać, uruchamiać i edytować za pomocą przeglądarki.
Jeśli wdrażasz narzędzie Face Landmarker na Raspberry Pi, zapoznaj się z przykładową aplikacją na Raspberry Pi.
Konfiguracja
W tej sekcji opisaliśmy kluczowe kroki konfigurowania środowiska programistycznego i projektów kodu w celu używania narzędzia Face Landmarker. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku po konfigurowaniu Pythona.
Pakiety
Zadanie MediaPipe Face Landmarker wymaga pakietu mediapipe z PyPI. Te zależności możesz zainstalować i zaimportować za pomocą:
$ python -m pip install mediapipe
Importy
Aby uzyskać dostęp do funkcji zadania Face Landmarker, zaimportuj te klasy:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Model
Zadanie MediaPipe Face Landmarker wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach usługi Face Landmarker znajdziesz w sekcji Modele w omówieniu zadania.
Wybierz i pobierz model, a potem zapisz go w katalogu lokalnym:
model_path = '/absolute/path/to/face_landmarker.task'
Aby określić ścieżkę do modelu, którego chcesz użyć, użyj parametru BaseOptions
obiekt model_asset_path
. Przykład kodu znajdziesz w następnej sekcji.
Tworzenie zadania
Zadanie MediaPipe Face Landmarker używa funkcji create_from_options
do konfigurowania zadania. Funkcja create_from_options
przyjmuje wartości opcji konfiguracji, które mają być obsługiwane. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.
Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.
Przykłady te pokazują też różne sposoby tworzenia zadań dotyczących 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 utworzenia narzędzia do wykrywania punktów orientacyjnych twarzy na potrzeby obrazu znajdziesz w przykładzie kodu.
Opcje konfiguracji
W tym zadaniu dostępne są te opcje konfiguracji aplikacji Pythona:
Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
---|---|---|---|
running_mode |
Ustawia tryb działania zadania. Dostępne są 3 tryby: OBRAZ: tryb dla pojedynczych obrazów wejściowych. FILM: tryb dekodowanych klatek filmu. LIVE_STREAM: tryb transmisji na żywo danych wejściowych, takich jak dane z kamery. W tym trybie należy wywołać metodę resultListener, aby skonfigurować odbiornik, który będzie asynchronicznie odbierał wyniki. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
num_faces |
Maksymalna liczba twarzy, którą może wykryć FaceLandmarker . Wygładzanie jest stosowane tylko wtedy, gdy parametr num_faces ma wartość 1.
|
Integer > 0 |
1 |
min_face_detection_confidence |
Minimalny wynik ufności dla wykrywania twarzy, aby uznać go za udany. | Float [0.0,1.0] |
0.5 |
min_face_presence_confidence |
Minimalny wynik ufności wykrywania obecności twarzy w detekcji punktów orientacyjnych twarzy. | Float [0.0,1.0] |
0.5 |
min_tracking_confidence |
Minimalny wynik ufności śledzenia twarzy, aby uznać go za udany. | Float [0.0,1.0] |
0.5 |
output_face_blendshapes |
Określa, czy narzędzie Face Landmarker ma generować blendshape’y twarzy. Blendshape’y twarzy są używane do renderowania modelu 3D twarzy. | Boolean |
False |
output_facial_transformation_matrixes |
Określa, czy FaceLandmarker ma zwrócić macierz przekształceń twarzy. Funkcja FaceLandmarker korzysta z macierzy, aby przekształcać punkty orientacyjne twarzy z kanonicznego modelu twarzy na wykrywaną twarz, dzięki czemu użytkownicy mogą stosować efekty na wykrytych punktach orientacyjnych. | Boolean |
False |
result_callback |
Ustawia odbiornik wyników tak, aby asynchronicznie otrzymywał wyniki wyszukiwania punktów orientacyjnych, gdy usługa FaceLandmarker jest w trybie transmisji na żywo.
Można go używać tylko wtedy, gdy tryb działania ma wartość LIVE_STREAM . |
ResultListener |
N/A |
Przygotuj dane
Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem 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ć biblioteki zewnętrznej, takiej jak OpenCV, aby załadować ramki 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
Narzędzie do wykrywania punktów orientacyjnych na twarzy używa funkcji detect
, detect_for_video
i detect_async
do wywoływania wniosków. W przypadku wykrywania punktów orientacyjnych twarzy obejmuje to wstępną obróbkę danych wejściowych i wykrywanie twarzy na obrazie.
Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadania.
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)
Pamiętaj:
- W trybie wideo lub transmisji na żywo podaj zadaniu Face Landmarker sygnaturę czasową ramki wejściowej.
- Gdy zadanie jest wykonywane w przypadku modelu obrazu lub filmu, blokuje bieżący wątek, dopóki nie zakończy przetwarzania wejściowego obrazu lub klatki.
- W trybie transmisji na żywo zadanie wykrywania punktów orientacyjnych twarzy zwraca dane natychmiast i nie blokuje bieżącego wątku. Za każdym razem, gdy skończy przetwarzać daną klatkę wejściową, wywoła komponent odbiorczy z wynikiem wykrywania. Jeśli funkcja wykrywania jest wywoływana, gdy zadanie wykrywania punktów orientacyjnych twarzy przetwarza inny obraz, zadanie zignoruje nowy obraz wejściowy.
Pełny przykład użycia narzędzia do wykrywania punktów orientacyjnych twarzy na obrazie znajdziesz w przykładowym kodzie.
Obsługa i wyświetlanie wyników
Funkcja Face Landmarker zwraca obiekt FaceLandmarkerResult
dla każdego przebiegu wykrywania. Obiekt result zawiera siatkę twarzy dla każdej wykrytej twarzy wraz z współrzędnymi każdego punktu odniesienia twarzy. Opcjonalnie obiekt wyniku może też zawierać blendshape’y, które oznaczają mimikę twarzy, oraz macierz transformacji twarzy, która pozwala stosować efekty twarzy do wykrytych punktów orientacyjnych.
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]
...
Na ilustracji poniżej widać wynik wykonania zadania:
Przykładowy kod usługi Face Landmarker pokazuje, jak wyświetlać wyniki zwrócone przez zadanie. Więcej informacji znajdziesz w przykładowym kodzie.