人脸识别开发概述
简介
我们提供了多款支持人脸识别的设备,人脸识别开发相对有一定复杂度,所以专门新建一个主题来仔细阐述人脸识别相关概念和流程,并提供多个示例从简单到复杂来指导用户开发人脸识别相关应用。
基本概念
- 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. 人脸检测流程
- 采集图像: 摄像头(RGB/NIR)开始采集视频流。
- 人脸检测: 从视频流中检测到稳定、清晰的人脸,返回人脸在屏幕上的坐标值。
- 人脸显示: 开发者根据坐标值在屏幕上绘制人脸框,当人脸移动时,人脸框也随之移动。
2. 人脸注册流程
- 触发注册: 应用启动用户注册流程。
- 采集图像: 摄像头(RGB/NIR)开始采集视频流。
- 人脸检测: 从视频流中检测到稳定、清晰的人脸。
- 质量判断: 评估人脸图像的质量(如光照、姿态、清晰度)。
- 提取特征: 从高质量的人脸图像中提取特征值。
- 保存入库: 将用户的身份信息(一般是用户的 ID)与提取的特征值一起存入人脸特征库。
照片注册
照片注册流程更简单,只需要第 5 步和第 6 步。开发者通过网络等方式将照片下发到设备,设备直接从照片中提取特征值并保存入库,之后原始照片即可删除。
人脸注册照片要求
通过照片注册时(设备端 getFeaByFile,或使用人脸特征值提取服务),请使用符合以下要求的图片:
| 项目 | 要求 |
|---|---|
| 人脸像素 | 最小 80,最大 512 |
| 图片大小 | 50~300K |
| 图片高宽 | 宽 512~800,高 640~1024 |
| 图片格式 | JPG |
| 背景 / 内容 | 生活照;无美颜滤镜;无浓妆;无墨镜、围巾、口罩等遮挡 |
3. 人脸识别流程
- 启动识别: 应用开始进行人脸识别。
- 采集图像: 摄像头(RGB/NIR)实时捕捉视频流。
- 人脸检测: 从视频流中检测到人脸。
- 活体检测: 判断检测到的人脸是否为真人,防止照片、视频等攻击。
- 提取特征: 如果活体检测通过,则提取该人脸的实时特征值。
- 特征比对: 将实时特征值与人脸特征库中的数据进行 1:N 比对。
- 输出结果: 如果比对的相似度分数超过预设阈值,则识别成功,返回对应的人员信息(一般是人员的 ID);否则,识别失败。
基本组件
DejaOS 人脸识别组件是 dxFacial,它替代了早期的 dxFace 和 dxCapture 组件。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): 设置屏幕的开关状态。传入true或1开启屏幕,false或0关闭屏幕。
-
屏幕电源模式
dxDisplay.getPowerMode(): 获取屏幕当前的电源模式(0 为正常模式,1 为待机模式)。dxDisplay.setPowerMode(mode): 设置屏幕的电源模式。
总结:
本文档作为人脸识别开发的入门指南,系统性地介绍了从核心概念到实际应用的全景视图。我们首先阐明了 RGB/NIR 摄像头、特征值、活体检测等关键术语的定义;接着,详细拆解了人脸检测、人脸注册与人脸识别这三大核心业务流程;最后,深入介绍了 dxFacial 组件的核心 API 用法以及 dxDisplay 辅助组件的功能。
掌握本文内容将为您后续深入学习打下坚实的基础。后续文档将围绕这三个基本流程,提供从简单到复杂的多个代码示例,详细阐述具体的开发细节。