Руководство по обнаружению ориентиров лица для Python

Задача MediaPipe Face Landmarker позволяет обнаруживать ориентиры лиц и выражения лица на изображениях и видео. Эту задачу можно использовать для распознавания выражений лица человека и применения фильтров и эффектов лица для создания виртуального аватара. В этой задаче используются модели машинного обучения (ML), которые могут работать с отдельными изображениями или с непрерывным потоком изображений. Задача выводит трехмерные ориентиры лица, показатели blendshape (коэффициенты, представляющие выражение лица) для определения детальных поверхностей лица в режиме реального времени, а также матрицы преобразования для выполнения преобразований, необходимых для рендеринга эффектов.

Пример кода, описанный в этой инструкции, доступен на GitHub . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

В примере кода Face Landmarker представлена ​​полная реализация этой задачи на Python. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного ориентира лица. Вы можете просматривать, запускать и редактировать пример кода Face Landmarker, используя только веб-браузер.

Если вы реализуете Face Landmarker для Raspberry Pi, обратитесь к примеру приложения Raspberry Pi .

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования Face Landmarker. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке Python .

Пакеты

Для задачи MediaPipe Face Landmarker требуется пакет mediapipe PyPI. Вы можете установить и импортировать эти зависимости следующим образом:

$ python -m pip install mediapipe

Импорт

Импортируйте следующие классы для доступа к функциям задачи Face Landmarker:

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

Модель

Для задачи MediaPipe Face Landmarker требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Face Landmarker смотрите в разделе «Модели» обзора задач.

Выберите и скачайте модель, а затем сохраните ее в локальном каталоге:

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

Используйте параметр model_asset_path объекта BaseOptions , чтобы указать путь к используемой модели. Пример кода см. в следующем разделе.

Создать задачу

Задача MediaPipe Face Landmarker использует функцию create_from_options для настройки задачи. Функция create_from_options принимает значения для обрабатываемых параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код демонстрирует, как создать и настроить эту задачу.

В этих примерах также показаны варианты построения задач для изображений, видеофайлов и прямой трансляции.

Изображение

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

видео

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

Прямая трансляция

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

Полный пример создания Face Landmarker для использования с изображением см. в примере кода .

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для приложений Python:

Название опции Описание Диапазон значений Значение по умолчанию
running_mode Устанавливает режим выполнения задачи. Есть три режима:

ИЗОБРАЖЕНИЕ: Режим для ввода одного изображения.

ВИДЕО: Режим декодированных кадров видео.

LIVE_STREAM: режим прямой трансляции входных данных, например, с камеры. В этом режиме необходимо вызвать resultListener, чтобы настроить прослушиватель на асинхронное получение результатов.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
num_faces Максимальное количество лиц, которые может обнаружить FaceLandmarker . Сглаживание применяется только в том случае, если для num_faces установлено значение 1. Integer > 0 1
min_face_detection_confidence Минимальный показатель достоверности, позволяющий считать обнаружение лица успешным. Float [0.0,1.0] 0.5
min_face_presence_confidence Минимальный показатель достоверности оценки присутствия лица при обнаружении ориентиров лица. Float [0.0,1.0] 0.5
min_tracking_confidence Минимальный показатель достоверности, позволяющий считать отслеживание лиц успешным. Float [0.0,1.0] 0.5
output_face_blendshapes Выводит ли Face Landmarker формы лица. Формы смешивания лиц используются для рендеринга 3D-модели лица. Boolean False
output_facial_transformation_matrixes Выводит ли FaceLandmarker матрицу преобразования лица. FaceLandmarker использует матрицу для преобразования ориентиров лица из канонической модели лица в обнаруженное лицо, поэтому пользователи могут применять эффекты к обнаруженным ориентирам. Boolean False
result_callback Настраивает прослушиватель результатов на асинхронное получение результатов ориентира, когда FaceLandmarker находится в режиме прямой трансляции. Может использоваться только в том случае, если для режима работы установлено значение LIVE_STREAM ResultListener N/A

Подготовьте данные

Подготовьте входные данные в виде файла изображения или массива numpy, а затем преобразуйте их в объект mediapipe.Image . Если ваши входные данные представляют собой видеофайл или прямую трансляцию с веб-камеры, вы можете использовать внешнюю библиотеку, такую ​​как OpenCV, для загрузки входных кадров в виде числовых массивов.

Изображение

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)
    

видео

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)
    

Прямая трансляция

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)
    

Запустить задачу

Face Landmarker использует функции detect , detect_for_video и detect_async для инициирования выводов. Для определения ориентиров по лицам это включает предварительную обработку входных данных и обнаружение лиц на изображении.

Следующий код демонстрирует, как выполнить обработку с помощью модели задачи.

Изображение

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

видео

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

Прямая трансляция

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

Обратите внимание на следующее:

  • При работе в режиме видео или режиме прямой трансляции также предоставьте задаче Face Landmarker временную метку входного кадра.
  • При работе с изображением или видеомоделью задача Face Landmarker блокирует текущий поток до тех пор, пока не завершится обработка входного изображения или кадра.
  • При работе в режиме прямой трансляции задача Face Landmarker немедленно возвращается и не блокирует текущий поток. Он будет вызывать прослушиватель результатов с результатом обнаружения каждый раз, когда завершает обработку входного кадра. Если функция обнаружения вызывается, когда задача Face Landmarker занята обработкой другого кадра, задача будет игнорировать новый входной кадр.

Полный пример использования Face Landmarker на изображении см. в примере кода .

Обработка и отображение результатов

Face Landmarker возвращает объект FaceLandmarkerResult для каждого запуска обнаружения. Объект результата содержит сетку лица для каждого обнаруженного лица с координатами для каждого ориентира лица. При необходимости объект результата также может содержать формы смешивания, которые обозначают выражения лица, и матрицу преобразования лица для применения эффектов лица к обнаруженным ориентирам.

Ниже показан пример выходных данных этой задачи:

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

На следующем изображении показана визуализация результатов задачи:

Пример кода Face Landmarker демонстрирует, как отображать результаты, возвращаемые задачей, подробности см. в примере кода .