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

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

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

Пример кода

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

Вы можете использовать это приложение в качестве отправной точки для создания собственного Android-приложения или ссылаться на него при модификации существующего приложения. Пример кода Face Landmarker размещен на GitHub .

Скачать код

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

Чтобы скачать пример кода:

  1. Клонируйте репозиторий Git, используя следующую команду:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. При желании настройте свой экземпляр Git на использование разреженного извлечения (sparse checkout), чтобы у вас были только файлы для примера приложения Face Landmarker:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

После создания локальной версии примера кода вы можете импортировать проект в Android Studio и запустить приложение. Инструкции см. в Руководстве по настройке для Android .

Ключевые компоненты

Следующие файлы содержат важнейший код для данного примера приложения по определению лицевых ориентиров:

  • FaceLandmarkerHelper.kt — инициализирует маркер лицевых ориентиров и обрабатывает выбор модели и делегата.
  • CameraFragment.kt — обрабатывает данные с камеры устройства и включает в себя ввод изображений и видео.
  • GalleryFragment.kt — взаимодействует с OverlayView для отображения выходного изображения или видео.
  • OverlayView.kt — Реализует отображение с использованием сетки лица для обнаруженных лиц.

Настраивать

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

Зависимости

Задача «Маркеры лица» использует библиотеку com.google.mediapipe:tasks-vision . Добавьте эту зависимость в файл build.gradle вашего Android-приложения:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Модель

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

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

<dev-project-root>/src/main/assets

Укажите путь к модели в параметре ModelAssetPath . В примере кода модель определена в файле FaceLandmarkerHelper.kt :

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Создайте задачу

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

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

Изображение

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Видео

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

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

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

В примере кода, демонстрирующем работу Face Landmarker, пользователь может переключаться между режимами обработки. Такой подход усложняет код создания задачи и может не подойти для вашего случая. Этот код можно увидеть в функции setupFaceLandmarker() в файле FaceLandmarkerHelper.kt .

Параметры конфигурации

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

Название варианта Описание Диапазон значений Значение по умолчанию
runningMode Задает режим выполнения задачи. Существует три режима:

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

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

LIVE_STREAM: Режим для потоковой передачи входных данных в реальном времени, например, с камеры. В этом режиме необходимо вызвать функцию resultListener для настройки слушателя, который будет получать результаты асинхронно.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
numFaces Максимальное количество лиц, которые может обнаружить FaceLandmarker . Сглаживание применяется только тогда, когда num_faces установлено на 1. Integer > 0 1
minFaceDetectionConfidence Минимальный показатель достоверности, при котором распознавание лица считается успешным. Float [0.0,1.0] 0.5
minFacePresenceConfidence Минимальный показатель достоверности наличия лица при определении лицевых ориентиров. Float [0.0,1.0] 0.5
minTrackingConfidence Минимальный показатель достоверности, при котором отслеживание лица считается успешным. Float [0.0,1.0] 0.5
outputFaceBlendshapes Выводит ли Face Landmarker морфинги лица. Морфинги лица используются для рендеринга 3D-модели лица. Boolean False
outputFacialTransformationMatrixes Выводит ли FaceLandmarker матрицу преобразования лица. FaceLandmarker использует эту матрицу для преобразования лицевых ориентиров из канонической модели лица в обнаруженное лицо, что позволяет пользователям применять эффекты к обнаруженным ориентирам. Boolean False
resultListener Устанавливает обработчик результатов для асинхронного получения результатов анализа местоположения FaceLandmarker, когда FaceLandmarker находится в режиме прямой трансляции. Может использоваться только при установке режима работы в LIVE_STREAM ResultListener N/A
errorListener Устанавливает необязательный обработчик ошибок. ErrorListener N/A

Подготовка данных

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

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

Изображение

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
    

Видео

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

val argb8888Frame =
    if (frame.config == Bitmap.Config.ARGB_8888) frame
    else frame.copy(Bitmap.Config.ARGB_8888, false)

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(argb8888Frame).build()
    

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

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    

В примере кода Face Landmarker подготовка данных осуществляется в файле FaceLandmarkerHelper.kt .

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

В зависимости от типа обрабатываемых данных используйте метод FaceLandmarker.detect...() , специфичный для данного типа данных. Используйте detect() для отдельных изображений, detectForVideo() для кадров в видеофайлах и detectAsync() для видеопотоков. При выполнении обнаружения объектов в видеопотоке убедитесь, что обнаружение выполняется в отдельном потоке, чтобы избежать блокировки потока пользовательского интерфейса.

Приведенные ниже примеры кода демонстрируют простые способы запуска Face Landmarker в различных режимах обработки данных:

Изображение

val result = FaceLandmarker.detect(mpImage)
    

Видео

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

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

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

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

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

В примере кода Face Landmarker функции detect , detectForVideo и detectAsync определены в файле FaceLandmarkerHelper.kt .

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

Объект 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 демонстрирует, как отображать результаты, полученные в ходе выполнения задачи; более подробную информацию см. в классе OverlayView .