Задача MediaPipe Face Landmarker позволяет обнаруживать лицевые ориентиры и выражения лица на изображениях и видео. Вы можете использовать эту задачу для идентификации выражений лица, применения лицевых фильтров и эффектов, а также для создания виртуальных аватаров. В задаче используются модели машинного обучения (ML), которые могут работать как с отдельными изображениями, так и с непрерывным потоком изображений. Задача выдает трехмерные лицевые ориентиры, оценки блендшейпов (коэффициенты, представляющие выражение лица) для определения детализированных поверхностей лица в реальном времени, а также матрицы преобразования для выполнения преобразований, необходимых для рендеринга эффектов.
Пример кода, описанный в этих инструкциях, доступен на GitHub . Более подробную информацию о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе «Обзор» .
Пример кода
Пример кода MediaPipe Tasks представляет собой простую реализацию приложения Face Landmarker для Android. В примере используется камера физического устройства Android для обнаружения лиц в непрерывном видеопотоке. Приложение также может обнаруживать лица на изображениях и видео из галереи устройства.
Вы можете использовать это приложение в качестве отправной точки для создания собственного Android-приложения или ссылаться на него при модификации существующего приложения. Пример кода Face Landmarker размещен на GitHub .
Скачать код
Следующие инструкции показывают, как создать локальную копию примера кода с помощью инструмента командной строки git .
Чтобы скачать пример кода:
- Клонируйте репозиторий Git, используя следующую команду:
git clone https://github.com/google-ai-edge/mediapipe-samples
- При желании настройте свой экземпляр 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 .