Przewodnik po wykrywaniu twarzy w języku Python

Zadanie MediaPipe Wykrywanie twarzy umożliwia wykrywanie twarzy na zdjęciach lub filmach. Za pomocą to zadanie, aby znajdować twarze i twarze w kadrze. To zadanie używa model uczenia maszynowego, który działa z pojedynczymi obrazami lub wiele obrazów. Zadanie generuje lokalizacje twarzy, a także: charakterystyczne elementy twarzy: lewe i prawe oko, czubek nosa, usta, uraz lewego oka oraz do urazu prawego oka.

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 wykrywania twarzy zapewnia pełną implementację tego w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać zaczął tworzyć własny wykrywacz twarzy. Możesz wyświetlać, uruchamiać edytuj Przykładowy kod Wykrywania twarzy tylko za pomocą przeglądarki.

Jeśli wdrażasz wykrywanie 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 projektów kodu, w których mają być używane wykrywanie twarzy. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy, patrz Przewodnik po konfiguracji Pythona

Pakiety

Zadanie MediaPipe Face Detector wymaga pakietu PyPI mediapipe. Możesz zainstalować i zaimportować te zależności przy użyciu:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji wykrywania twarzy, zaimportuj te klasy:

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

Model

Zadanie wykrywania twarzy MediaPipe wymaga wytrenowanego modelu, który jest z nim zgodny zadanie. Więcej informacji o dostępnych wytrenowanych modelach z wykrywaniem 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_detector.task'

Aby określić ścieżkę, użyj parametru model_asset_path obiektu BaseOptions wybranego modelu. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Zadanie Wykrywanie twarzy w MediaPipe używa funkcji create_from_options do: skonfigurować zadanie. Funkcja create_from_options akceptuje wartości obsługi opcji konfiguracyjnych. Więcej informacji o konfiguracji Więcej informacji znajdziesz w sekcji 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
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face detector instance with the image mode:
options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Wideo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face detector instance with the video mode:
options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Transmisja na żywo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
FaceDetectorResult = mp.tasks.vision.FaceDetectorResult
VisionRunningMode = mp.tasks.vision.RunningMode

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

options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Pełny przykład tworzenia wykrywania twarzy na potrzeby zdjęcia znajdziesz w przykładowego kodu.

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
min_detection_confidence Minimalny wskaźnik ufności, który musi spełniać, aby wykrywanie twarzy zostało uznane za udane. Float [0,1] 0.5
min_suppression_threshold Minimalny niemaksymalny próg wyłączenia funkcji wykrywania twarzy, który może zostać uznany za pokrywający się. Float [0,1] 0.3
result_callback Konfiguruje detektor wyników, który otrzymuje wyniki wykrywania asynchronicznie, gdy funkcja wykrywania twarzy jest włączona w transmisji na żywo. i trybu uzyskiwania zgody. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM. N/A Not set

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem przekonwertować go na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmitowania na żywo z kamery internetowej, możesz użyć biblioteki zewnętrznej, 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

Wykrywanie twarzy używa tych funkcji: detect, detect_for_video i detect_async w celu aktywowania zależności. Wykrywanie twarzy obejmuje wstępnego przetwarzania danych wejściowych i wykrywania twarzy na zdjęciach.

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

Obraz

# Perform face detection on the provided single image.
# The face detector must be created with the image mode.
face_detector_result = detector.detect(mp_image)
    

Wideo

# Perform face detection on the provided single image.
# The face detector must be created with the video mode.
face_detector_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
    

Transmisja na żywo

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

Pamiętaj:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, udostępnia do zadania Wykrywacz twarzy sygnaturę czasową klatki wejściowej.
  • W przypadku uruchomienia na obrazie lub modelu wideo zadanie Wykrywanie twarzy blokuje bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
  • W trybie transmisji na żywo zadanie Wykrywacz twarzy powraca, 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, gdy zadanie Wykrywacz twarzy jest zajęty przetwarzaniem innej ramki, zadanie zignoruje nową ramkę wejściową.

Pełen przykład uruchamiania wykrywania twarzy na zdjęciu znajdziesz w przykładowy kod .

Obsługa i wyświetlanie wyników

Wykrywanie twarzy zwraca obiekt FaceDetectorResult przy każdym wykryciu bieganie. Obiekt wynikowy zawiera ramki ograniczające dla wykrytych twarzy oraz wskaźnik ufności dla każdej wykrytej twarzy.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

Ten obraz przedstawia wizualizację danych wyjściowych zadania:

Zobacz oryginalny obraz obrazu bez ramek ograniczających.

Przykładowy kod Wykrywania twarzy pokazuje, jak wyświetlać wyników zwróconych przez zadanie, patrz przykładowego kodu. .