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

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

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

Пример кода

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

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

Настраивать

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

Пакеты

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

$ python -m pip install mediapipe

Импорт

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

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

Модель

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

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

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

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

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

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

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

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

Изображение

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

видео

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

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

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

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

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

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

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

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

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

LIVE_STREAM: режим прямой трансляции входных данных, например, с камеры. В этом режиме необходимо вызвать resultListener, чтобы настроить прослушиватель на асинхронное получение результатов.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
min_detection_confidence Минимальный показатель достоверности, позволяющий считать обнаружение лица успешным. Float [0,1] 0.5
min_suppression_threshold Минимальный, не максимальный порог подавления для обнаружения лиц, который считается перекрытым. Float [0,1] 0.3
result_callback Настраивает прослушиватель результатов на асинхронное получение результатов обнаружения, когда Детектор лиц находится в режиме прямой трансляции. Может использоваться только в том случае, если для режима работы установлено значение LIVE_STREAM . N/A Not set

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

Подготовьте входные данные в виде файла изображения или массива 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)
    

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

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

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

Изображение

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

видео

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

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

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

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

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

Полный пример запуска Детектора лиц на изображении см. в примере кода .

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

Детектор лиц возвращает объект FaceDetectorResult для каждого запуска обнаружения. Объект результата содержит ограничивающие рамки для обнаруженных лиц и оценку достоверности для каждого обнаруженного лица.

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

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)

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

Изображение без ограничивающих рамок см. в исходном изображении .

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