菜单

人脸关键点

相关源文件

目的与范围

本文档介绍了 face_recognition 库中的面部地标检测功能。面部地标是指面部上的特定面部特征,例如眼睛、鼻子、眉毛、嘴唇和下巴线,这些特征由面部上的一组点表示。此功能允许您在图像中识别和定位精确的面部特征,这对于各种应用非常有用,例如面部分析、情绪检测、面部滤镜以及作为面部识别的预处理步骤。

有关在图像中检测面部的信息,请参阅 面部检测。有关面部编码和识别的信息,请参阅 面部编码与识别

面部地标模型

该库支持两种具有不同细节程度和性能特征的地标检测模型

大型模型(68 点)

大型模型可识别面部的 68 个特定点,这些点按面部特征分组

  • 下巴(下颌线):17 个点
  • 眉毛:每侧 5 个点(左侧和右侧)
  • 鼻梁:4 个点
  • 鼻尖:5 个点
  • 眼睛:每侧 6 个点(左侧和右侧)
  • 嘴唇:20 个点(上唇和下唇)

小型模型(5 点)

小型模型速度更快,但提供的细节较少,仅识别 5 个点

  • 鼻尖:1 个点
  • 眼睛:每侧 2 个点(左侧和右侧)

来源:face_recognition/api.py168-200

API 使用

主函数

用于面部地标检测的主要函数是 face_landmarks()

参数

参数类型描述
face_imagenumpy 数组包含面部的图像
face_locations列表,可选要分析的预计算面部位置
model字符串使用的模型:“large”(默认,68 点)或“small”(5 点)

返回值

一个字典列表,其中每个字典包含一张脸的特征。键是特征名称,值是每个点(x, y)元组的列表。

对于“large”模型,字典包含

  • “chin”
  • “left_eyebrow”
  • “right_eyebrow”
  • “nose_bridge”
  • “nose_tip”
  • “left_eye”
  • “right_eye”
  • “top_lip”
  • “bottom_lip”

对于“small”模型,字典包含

  • “nose_tip”
  • “left_eye”
  • “right_eye”

来源:face_recognition/api.py168-200

使用示例

来源:examples/find_facial_features_in_picture.py1-27

实现细节

地标检测过程如下

  1. 函数 face_landmarks() 首先调用 _raw_face_landmarks() 来获取原始地标数据。
  2. _raw_face_landmarks() 使用面部位置,通过 dlib 的形状预测器模型来提取地标。
  3. 该库使用两个 dlib 地标预测器模型
    • pose_predictor_68_point:用于“large”模型
    • pose_predictor_5_point:用于“small”模型
  4. 原始地标被转换为坐标元组列表。
  5. 然后根据模型类型将这些坐标组织成面部特征。
  6. 对于“large”模型,点被映射到 9 个面部特征。
  7. 对于“small”模型,点被映射到 3 个面部特征。

来源:face_recognition/api.py154-165 face_recognition/api.py168-200

与其他组件的关系

面部地标检测是面部识别流程中的关键组成部分

  1. 它依赖于面部检测作为定位图像中人脸的先前步骤。
  2. 它为面部编码提供了基本输入,因为地标有助于对齐和标准化面部。
  3. 面部编码功能使用相同的底层地标检测来计算面部描述符。

来源:face_recognition/api.py19-23 face_recognition/api.py203-214

实际应用

面部地标可用于各种应用

  1. 面部特征分析:检测特定的面部特征以进行测量或比较
  2. 情绪识别:分析面部特征的位置以确定情绪
  3. 面部滤镜:将虚拟对象(眼镜、帽子等)放置在特定的面部点上
  4. 面部表情动画:将面部动作映射到动画角色
  5. 面部对齐:在识别前标准化面部位置

可视化示例

该库包含一个示例脚本,演示了如何可视化面部地标

此代码绘制连接每个面部特征点的线条,在原始图像上创建视觉叠加。

来源:examples/find_facial_features_in_picture.py16-24

性能考量

  • “small”模型(5 点)比“large”模型(68 点)速度更快,但细节较少。
  • 面部地标检测的计算成本低于基于 CNN 的面部检测。
  • 对于实时应用,使用“small”模型可以提高性能。
  • 预先计算面部位置并将其传递给 face_landmarks() 可避免重复的面部检测。

来源:face_recognition/api.py154-165 face_recognition/api.py168-200