菜单

人脸编码与识别

相关源文件

目的与范围

本文档解释了 face_recognition 库的面部编码和识别组件。这些组件将检测到的面部转换为数值特征向量(编码),并将这些向量进行比较以识别或验证面部。有关在图像中检测面部的信息,请参阅 面部检测,有关定位面部地标的详细信息,请参阅 面部地标

系统概览

面部编码和识别是核心功能,可以在检测到面部后识别图像中的“谁”。该系统包含两个主要组件:

  1. 面部编码 - 将面部图像转换为 128 维的数值特征向量
  2. 面部识别 - 比较面部编码以确定身份或相似性

来源: face_recognition/api.py63-75 face_recognition/api.py203-214 face_recognition/api.py217-226

面部编码

面部编码是将面部图像转换为紧凑的数值表示的过程,该表示捕捉了面部的独特特征。

技术实现

face_encodings 函数使用一个使用 ResNet 架构训练的深度学习模型来为每个面部生成一个 128 维的特征向量。

来源: face_recognition/api.py28-29 face_recognition/api.py203-214

函数签名和参数

face_encodings 函数将检测到的面部转换为编码。

参数

  • face_image:包含一个或多个面部的图像
  • known_face_locations:面部的边界框的可选列表(如果已知)
  • num_jitters:在计算编码时重新采样面部的次数(值越高,准确性越高,处理时间也越长)
  • model:使用哪个地标模型(“small” 更快,“large” 更详细)

返回值

  • 一个 128 维面部编码列表(图像中每个面部一个)

来源: face_recognition/api.py203-214

面部识别

面部识别涉及比较面部编码以确定两个面部是否代表同一个人。

比较方法

该库提供了两种主要的比较面部编码的方法:

  1. 二进制比较compare_faces):返回匹配的 True/False
  2. 距离测量face_distance):返回相似度得分

比较面部

compare_faces 函数确定一个面部是否与任何已知面部匹配。

参数

  • known_face_encodings:已知面部编码列表
  • face_encoding_to_check:要与列表进行比较的编码
  • tolerance:考虑匹配的阈值(值越低,要求越严格)

返回值

  • True/False 值列表,指示哪些已知面部与测试面部匹配

来源: face_recognition/api.py217-226

面部距离

face_distance 函数计算面部编码之间的欧氏距离。

参数

  • face_encodings:要比较的面部编码列表
  • face_to_compare:要进行比较的面部编码

返回值

  • 距离数组,值越小表示面部越相似

来源: face_recognition/api.py63-75

理解容差

容差参数控制面部比较的严格程度。

容差值比较严格程度误报假阴性
0.4非常严格
0.6默认/平衡中等中等
0.8宽松

较低的容差值要求面部更加相似才能被视为匹配,这可以减少假阳性,但可能会增加假阴性。

来源: README.rst179-191

典型用法工作流程

典型的面部识别工作流程包括以下步骤:

示例代码

以下模式演示了基本面部识别。

来源: examples/recognize_faces_in_pictures.py1-29 README.rst316-334

高级用例

处理多个已知面部

与多个已知面部进行比较时,

查找最佳匹配

当存在多个匹配项时,您可以使用面部距离来查找最接近的匹配项。

来源: examples/recognize_faces_in_pictures.py19-29 README.rst198-208

系统架构

面部编码和识别系统依赖于以下组件:

来源: face_recognition/api.py28-29 face_recognition/api.py203-214 face_recognition/api.py217-226

性能考量

优化技术

  1. 预先计算已知面部的编码,而不是重复计算。
  2. 批量处理多个图像(如果可能)。
  3. 根据准确性要求和速度调整 num_jitters
  4. 使用“small”地标模型以实现更快的编码。
  5. 优化面部检测(请参阅 性能优化)。

内存使用

面部编码在存储和比较方面效率很高。

  • 每个面部编码都是一个 128 个元素的浮点向量(约 512 字节)。
  • 可以高效地存储和比较数千个编码。
  • 面部编码可以被序列化(例如,使用 pickle 或 NumPy 的 save 函数)以实现持久化。

来源: face_recognition/api.py203-214 README.rst224-241

常见问题与解决方案

问题可能原因解决方案
未返回编码图像中未检测到面部首先检查面部检测结果。
误报容差过高降低容差值(例如,0.5 而不是 0.6)。
假阴性容差过低增加容差值。
准确性差低质量图像提高图像分辨率、光照和面部定位。
性能缓慢较高的 num_jitters减少抖动次数。
儿童识别问题模型是针对成人训练的。对儿童使用更严格的容差值(约 0.4-0.5)。

来源: README.rst179-191 README.rst397-400 face_recognition/api.py203-214

结论

face_recognition 库的面部编码和识别组件提供了强大而易用的工具,用于将面部图像转换为数字表示并比较这些表示以识别个人。该系统平衡了易用性与 dlib 强大的底层深度学习模型,为面部识别任务提供了最先进的性能。