Przewodnik po wykrywaniu punktów orientacyjnych twarzy w Pythonie

Zadanie MediaPipe Face wygenerowane przez punkt orientacyjny pozwala wykrywać punkty orientacyjne i wyrazy twarzy (zdjęcia i filmy). Możesz używać tego zadania do rozpoznawania ludzkiej twarzy i stosuj filtry twarzy, aby utworzyć wirtualnego awatara. To zadanie używa modeli systemów uczących się, które mogą pracować z pojedynczymi obrazami wiele obrazów. Zadanie zwraca trójwymiarowe punkty orientacyjne płaszczyzny, kształt połączenia wyniki (współczynniki reprezentujące wyraz twarzy) pozwalające ocenić powierzchnie w czasie rzeczywistym oraz macierze transformacji, aby przeprowadzić przekształcenia wymagane do renderowania efektów.

Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przeglądem.

Przykładowy kod

Przykładowy kod znacznika twarzy zapewnia pełną implementację tego w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać zaczął tworzyć własny punkt orientacyjny twarzy. Możesz wyświetlać, uruchamiać i edytować Przykład oznaczenia twarzy kod tylko za pomocą przeglądarki.

Jeśli wdrażasz punkt orientacyjny twarzy dla Raspberry Pi, zapoznaj się z Przykład Raspberry Pi

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu przeznaczonych konkretnie dla Face Rewards. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy znajdziesz w przewodniku konfiguracji dla Pythona.

Pakiety

Zadanie MediaPipe Face Commiter wymaga pakietu PyPI mediapipe. Możesz zainstalować zaimportuj te zależności z tym kodem:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji zadań znaczników twarzy, zaimportuj te klasy:

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

Model

Zadanie MediaPipe Face Markuper wymaga wytrenowanego modelu zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach na potrzeby rozpoznawania twarzy znajdziesz tutaj: zapoznaj się z omówieniem zadania sekcją Modele.

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ę wybierz model. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Zadanie MediaPipe Face Markuper używa funkcji create_from_options do skonfigurowania zadanie. Funkcja create_from_options akceptuje wartości konfiguracji różnych opcji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji:

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

Przykłady pokazują również odmiany konstrukcji zadań dla obrazów, pliki wideo i transmisję 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 punktu orientacyjnego twarzy do użycia ze zdjęciem znajdziesz w sekcji kod przykład.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji w Pythonie:

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

IMAGE: tryb wprowadzania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces Maksymalna liczba twarzy, które mogą wykryć FaceLandmarker. Wygładzanie jest stosowane tylko wtedy, gdy num_faces ma wartość 1. Integer > 0 1
min_face_detection_confidence Minimalny poziom ufności wymagany do wykrywania twarzy została uznana za udaną. Float [0.0,1.0] 0.5
min_face_presence_confidence Minimalny wskaźnik ufności obecności twarzy punkty w wykrywaniu punktów orientacyjnych twarzy. Float [0.0,1.0] 0.5
min_tracking_confidence Minimalny wskaźnik ufności dla śledzenia twarzy można uznać za udany. Float [0.0,1.0] 0.5
output_face_blendshapes Określa, czy narzędzie Rozpoznania twarzy generuje połączenia kształtów twarzy. Połączenie kształtów twarzy służy do renderowania modelu twarzy 3D. Boolean False
output_facial_transformation_matrixes Określa, czy FaceLandmarker wyświetla twarz macierz przekształceń. FaceLandmarker używa do przekształcenia punktów orientacyjnych twarzy z kanonicznego modelu twarzy na wykrytej twarzy, dzięki czemu użytkownicy mogą stosować efekty na wykrytych punktach orientacyjnych. Boolean False
result_callback Konfiguruje detektor wyników tak, aby otrzymywał wyniki z punktu orientacyjnego asynchronicznie, gdy FaceLandmarker jest w trybie transmisji na żywo. Tej opcji można używać tylko wtedy, gdy tryb działania 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 mediapipe.Image obiekt. 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, który wczytuje klatki wejściowe w formacie numpy tablice.

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

Oznaczenie twarzy używa tych elementów: detect, detect_for_video i detect_async w celu aktywowania zależności. Wyznaczenie punktów orientacyjnych twarzy wymaga: wstępnego przetwarzania danych wejściowych i wykrywania twarzy na zdjęciach.

Ten kod pokazuje, jak wykonać przetwarzanie za pomocą zadania model atrybucji.

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:

  • Jeśli pracujesz w trybie wideo lub w trybie transmisji na żywo, podaj również Zadanie orientacyjne twarzy – sygnatura czasowa ramki wejściowej.
  • W przypadku działania na obrazie lub w modelu wideo zadanie znacznika twarzy blokuje zadanie w bieżącym wątku aż do zakończenia przetwarzania obrazu lub ramki wejściowej.
  • W trybie transmisji na żywo zadanie pomiaru twarzy zostanie przywrócone. od razu i nie zablokuje bieżącego wątku. Wywoła wynik detektor z wynikiem wykrywania po każdym zakończeniu przetwarzania ramki wejściowej. Jeśli funkcja wykrywania jest wywoływana podczas jest zajęty przetwarzaniem innej ramki, zadanie zignoruje nową ramkę wejściową.

Pełny przykład uruchamiania znacznika twarzy na obrazie znajdziesz w kodzie przykład .

Obsługa i wyświetlanie wyników

Znacznik twarzy zwraca obiekt FaceLandmarkerResult przy każdym wykryciu bieganie. Obiekt wynikowy zawiera siatkę twarzy dla każdej wykrytej twarzy, w której dla każdego punktu orientacyjnego twarzy. Opcjonalnie obiekt wyniku może też zawierają elementy łączące mimikę macierz przekształceń pozwalającą zastosować efekty twarzy do wykrytych punktów orientacyjnych.

Poniżej znajdziesz przykładowe dane wyjściowe 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]
    ...

Ten obraz przedstawia wizualizację danych wyjściowych zadania:

Przykładowy kod znacznika twarzy pokazuje, jak wyświetlać zwrócone wyniki z zadania, zobacz kod przykład .