Python 人脸特征点检测指南

借助 MediaPipe Face Markerer 任务,你可以检测 Google Cloud 上的 图片和视频。您可以使用此任务来识别人类的面部表情 并应用面部滤镜和特效,打造虚拟头像此任务使用 可以处理单张图片或连续图片 图像流。该任务会输出三维人脸特征点、融合变形 分数(表示面部表情的系数)来推断详细的面部 以及转换矩阵 效果渲染所需的转换。

您可在 GitHub 如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

人脸识别特征点的示例代码提供了该技术的完整实现, 供您参考。此代码可帮助您测试此任务, 开始构建您自己的面部特征点。您可以查看、运行和修改 人脸特征点标记器示例 代码 只需使用网络浏览器即可。

如果您要为 Raspberry Pi 实现人脸特征点标记,请参阅 Raspberry Pi 示例 app

设置

本部分介绍了设置开发环境和 代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅适用于 Python

<ph type="x-smartling-placeholder">

软件包

MediaPipe Face Markerer 任务需要 mediapipe PyPI 软件包。你可以安装并 使用以下命令导入这些依赖项:

$ python -m pip install mediapipe

导入

导入以下类以使用 Face Markerer 任务函数:

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

型号

MediaPipe Face Markerer 任务需要一个与此训练兼容的模型, 任务。如需详细了解可用于人脸识别特征器的经过训练的模型,请参阅 任务概览的“模型”部分

选择并下载模型,然后将其存储在本地目录中:

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

使用 BaseOptions 对象 model_asset_path 参数指定 要使用的模型。如需查看代码示例,请参阅下一部分。

创建任务

MediaPipe Face Markerer 任务使用 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.
  # ...
    

如需查看创建与图片搭配使用的面部特征点的完整示例,请参阅 示例

配置选项

此任务具有以下适用于 Python 应用的配置选项:

选项名称 说明 值范围 默认值
running_mode 设置任务的运行模式。有三个 模式:

IMAGE:单图输入的模式。

VIDEO:视频已解码帧的模式。

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 指定面部特征点是否输出面部融合变形。 人脸融合变形用于渲染 3D 人脸模型。 Boolean False
output_facial_transformation_matrixes FaceMarkerer 是否输出面部图像 转换矩阵。FaceMarkerer 使用 矩阵将人脸特征点从规范人脸模型转换为 以便用户可以对检测到的特征点应用效果。 Boolean False
result_callback 设置结果监听器以接收地标器结果 异步触发。 仅在跑步模式设为“LIVE_STREAM”时才能使用 ResultListener N/A

准备数据

将输入准备为图像文件或 Numpy 数组,然后将其转换为 mediapipe.Image 对象。如果您输入的是 网络摄像头,您可以使用外部库,如 OpenCV:以 Numpy 形式加载输入帧 数组。

映像

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)
    

运行任务

人脸特征点标记器使用 detectdetect_for_videodetect_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 Markerer 任务负责输入帧的时间戳。
  • 在图片或视频模型中运行时,人脸特征点标记器任务会受阻 当前线程,直到它处理完输入图像或帧。
  • 在直播模式下运行时,人脸特征码器任务会返回 而且不会阻塞当前线程它将调用结果 并在每次处理完一个监听器后都返回检测结果 输入帧。如果在完成人脸特征点标记任务时调用检测函数, 正忙于处理另一个帧,则任务将忽略新的输入帧。

有关对图片运行人脸特征点标记器的完整示例,请参阅代码 示例 了解详情。

处理和显示结果

人脸特征点标记器会针对每次检测返回一个 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]
    ...

下图直观显示了任务输出:

人脸特征点标记器示例代码演示了如何显示返回的结果 请参阅代码 示例 了解详情。