跳到主要内容

人脸识别开发概述


简介

我们提供了多款支持人脸识别的设备,人脸识别开发相对有一定复杂度,所以专门新建一个主题来仔细阐述人脸识别相关概念和流程,并提供多个示例从简单到复杂来指导用户开发人脸识别相关应用。


基本概念

  • RGB 及摄像头: 指的是标准的彩色摄像头,能捕捉可见光谱(红、绿、蓝)范围内的图像。它用于获取人脸的彩色照片,是我们日常生活中最常见的摄像头类型。用户可以在屏幕上看到自己的动态人脸,就像镜子一样。
  • NIR 及摄像头: NIR (Near-Infrared) 指的是近红外摄像头。它能捕捉人眼看不到的近红外光图像。NIR 摄像头在暗光或无光环境下表现优异,并且能够抵抗照片、视频等欺骗手段,是活体检测的关键技术之一。
  • IR 补光灯: 指的是红外补光灯 (Infrared Fill Light)。它会发出人眼不可见的红外光,用于在黑暗环境中照亮人脸,以便 NIR 摄像头能够清晰地捕捉到人脸图像。
  • 特征值: 也称为面部特征向量 (Facial Feature Vector)。这是一个由一串数字组成的向量,它从人脸图像中提取出能够唯一标识该个体的关键信息(如眼睛间距、鼻梁宽度等)。特征值是人脸比对的核心依据。我们的设备可以不保存照片,只保存照片对应的特征值就可以实现人脸识别,这个值通常比图片小很多,而且是固定长度,我们大部分人脸特征值长度是 1024 字节。
  • 人脸特征库: 一个专门用于存储已注册用户人脸特征值的数据库。当进行人脸识别时,系统会将实时捕捉到的人脸特征值与库中的数据进行比对。
  • 活体检测: 用于判断摄像头前的人脸是否为真实、有生命的个体,而不是一张照片、一段视频或者一个面具。这是防止恶意攻击、确保系统安全性的重要环节。通常需要结合 RGB 和 NIR 摄像头来实现高精度的活体检测。
  • 人脸检测: 在一张图像或视频流中定位并框选出所有人脸的位置和大小。这是进行后续人脸识别的第一步。
  • 人脸检测阈值: 这是一个置信度分数。系统在检测到疑似人脸的区域后,会给出一个分数。只有当分数高于设定的阈值时,系统才会确认这是一个有效的人脸。适当调整此阈值可以平衡检测的准确率和召回率。这个值通常我们一般不暴露给开发者,我们会写死一个优化好的值。
  • 人脸比对: 将两个不同的人脸特征值进行比较,计算它们之间的相似度分数。这分为两种:
    • 1:1 比对: 判断两张脸是否为同一个人,常用于身份验证(如人脸登录)。
    • 1:N 比对: 将一张脸与人脸特征库中的 N 个特征值进行比对,找出最匹配的一个,常用于身份识别(如门禁系统)。
  • 人脸比对阈值: 这是一个相似度分数。在 1:1 或 1:N 比对后,只有当相似度分数高于设定的阈值时,系统才会判定为匹配成功。这是决定识别精度的关键参数。
  • 人脸识别: 这是一个完整的流程,包括从视频流中实时进行人脸检测、活体检测、提取特征值,并与人脸特征库进行比对,最终识别出人员身份的过程。
  • 人脸注册: 也叫人脸录入。指首次将用户的人脸信息采集并存入人脸特征库的过程。通常需要用户在摄像头前配合做一些动作,以确保采集到高质量的人脸图像,并提取出稳定可靠的特征值。也可以通过人脸照片来注册。

基本流程

一个完整的人脸识别应用通常包含三个核心流程:人脸检测人脸注册人脸识别

1. 人脸检测流程

  1. 采集图像: 摄像头(RGB/NIR)开始采集视频流。
  2. 人脸检测: 从视频流中检测到稳定、清晰的人脸,返回人脸在屏幕上的坐标值。
  3. 人脸显示: 开发者根据坐标值在屏幕上绘制人脸框,当人脸移动时,人脸框也随之移动。

2. 人脸注册流程

  1. 触发注册: 应用启动用户注册流程。
  2. 采集图像: 摄像头(RGB/NIR)开始采集视频流。
  3. 人脸检测: 从视频流中检测到稳定、清晰的人脸。
  4. 质量判断: 评估人脸图像的质量(如光照、姿态、清晰度)。
  5. 提取特征: 从高质量的人脸图像中提取特征值。
  6. 保存入库: 将用户的身份信息(一般是用户的 ID)与提取的特征值一起存入人脸特征库。
照片注册

照片注册流程更简单,只需要第 5 步和第 6 步。开发者通过网络等方式将照片下发到设备,设备直接从照片中提取特征值并保存入库,之后原始照片即可删除。

3. 人脸识别流程

  1. 启动识别: 应用开始进行人脸识别。
  2. 采集图像: 摄像头(RGB/NIR)实时捕捉视频流。
  3. 人脸检测: 从视频流中检测到人脸。
  4. 活体检测: 判断检测到的人脸是否为真人,防止照片、视频等攻击。
  5. 提取特征: 如果活体检测通过,则提取该人脸的实时特征值。
  6. 特征比对: 将实时特征值与人脸特征库中的数据进行 1:N 比对。
  7. 输出结果: 如果比对的相似度分数超过预设阈值,则识别成功,返回对应的人员信息(一般是人员的 ID);否则,识别失败。

基本组件

DejaOS 人脸识别组件是 dxFacial,它替代了早期的 dxFacedxCapture 组件。dxFacial 封装了复杂的底层逻辑,提供了简化的 API 方便开发者使用。其核心功能如下:

1. 核心生命周期

  • 初始化: dxFacial.init(config) 这是使用组件的第一步。通过传入一个配置对象,来初始化人脸识别引擎和摄像头。配置项包括摄像头参数、人脸库路径和容量、检测距离、识别超时、活体检测与识别阈值等。
  • 反初始化: dxFacial.deinit() 退出应用时调用,用于释放所有资源。

2. 事件处理与主循环

dxFacial 采用异步事件驱动模型,开发者需要周期性地调用 loop 函数来处理事件。

  • 设置回调: dxFacial.setCallbacks({ onRecognition: (event) => { ... } }) 设置一个 onRecognition 回调函数,用于接收并处理重要的识别结果,例如识别成功、失败、超时等。
  • 循环处理: dxFacial.loop() 应在 setInterval 中周期性调用此函数(推荐周期 50ms)。它会驱动引擎处理内部的事件队列,并在有结果时触发 onRecognition 回调。
  • 获取实时检测数据: dxFacial.getDetectionData() 此函数用于高频获取实时的人脸检测信息(如人脸框坐标)。它应该在 UI 刷新循环中调用,用于在屏幕上实时绘制人脸跟踪框,与 loop 的低频事件处理相分离。

3. 人脸库管理

  • 从摄像头注册: dxFacial.getFeaByCap(timeout) 启动摄像头,在指定超时时间内捕捉人脸,并返回高质量的人脸特征值。这是真人现场注册的核心函数。
  • 添加特征: dxFacial.addFea(userId, featureBase64) 将用户 ID 与一个 base64 格式的特征值关联,并存入人脸库。
  • 更新特征: dxFacial.updateFea(userId, featureBase64) 根据用户 ID 更新人脸库中已存在的特征值。
  • 删除特征: dxFacial.deleteFea(userId) 根据用户 ID 删除对应的人脸数据。
  • 清空人脸库: dxFacial.cleanFea() 删除人脸库中的所有数据。

4. 引擎控制与配置

  • 设置运行状态: dxFacial.setStatus(isRunning) 动态控制引擎的运行状态。传入 true 启动识别,false 暂停识别。
  • 动态读写配置: dxFacial.getConfig() / dxFacial.setConfig(config) 在运行时动态获取或更新引擎的配置参数,提供了极高的灵活性。

5. 辅助功能

  • 获取环境亮度: dxFacial.getEnvBrightness() 获取当前环境的亮度值,可用于提示用户光照过暗或过亮。

6. 显示控制辅助组件 (dxDisplay)

DejaOS 提供一个辅助组件是 dxDisplay,它封装了对屏幕硬件的底层操作,允许开发者方便地控制屏幕的背光、开关状态和电源模式。这在人脸识别应用中非常有用,例如在无人操作时降低屏幕亮度或关闭屏幕以节省电量。

主要功能:

  • 屏幕背光控制

    • dxDisplay.getBacklight(): 获取当前屏幕背光的亮度值(范围 0-100)。
    • dxDisplay.setBacklight(brightness): 设置屏幕背光的亮度值。
  • 屏幕开关控制

    • dxDisplay.getEnableStatus(): 获取屏幕的开关状态(1 为开启,0 为关闭)。
    • dxDisplay.setEnableStatus(enable): 设置屏幕的开关状态。传入 true1 开启屏幕,false0 关闭屏幕。
  • 屏幕电源模式

    • dxDisplay.getPowerMode(): 获取屏幕当前的电源模式(0 为正常模式,1 为待机模式)。
    • dxDisplay.setPowerMode(mode): 设置屏幕的电源模式。

总结:

本文档作为人脸识别开发的入门指南,系统性地介绍了从核心概念到实际应用的全景视图。我们首先阐明了 RGB/NIR 摄像头、特征值、活体检测等关键术语的定义;接着,详细拆解了人脸检测、人脸注册与人脸识别这三大核心业务流程;最后,深入介绍了 dxFacial 组件的核心 API 用法以及 dxDisplay 辅助组件的功能。

掌握本文内容将为您后续深入学习打下坚实的基础。后续文档将围绕这三个基本流程,提供从简单到复杂的多个代码示例,详细阐述具体的开发细节。