Android V9.0-SDK
人脸识别Android离线SDK
版本历史
No | 版本号 | 修改内容简介 | 修改日期 |
1 | v5.0 | 1、升级了了人脸检测模型,重点优化了复杂光线场景下的人脸检测能力; | 2020.10.16 |
v5.1 | 新增『金融活检』示例工程,该示例工程集成了多帧检测等活体检测策略,提升活体检测准确率; | 2021.01.01 | |
2 | v6.0 | 1、更新人脸检测模型,提升在强光、暗光、逆光、阴阳光等复杂光线场景下人脸检测的召回率; | 2021.02.26 |
3 | v7.0 | 1、更新人脸检测模型,解决部分场景下非人脸误检测的问题; | 2021.08.24 |
4 | v8.0 | 1、检测、活体、识别更新至8.0最新算法版本; | 2022.04.20 |
v8.1 | 1、修复日志信息错误bug; | 2022.11.18 | |
V8.1.2 | 1、接入动态底库策略,解决由于底库质量差带来的误识别问题; | 2023.03.02 | |
V8.2.0 | 1、优化了人脸特征提取模型; | 2024.06.07 | |
V8.5.0 | 1、修改demo UI,去掉部分模块减少demo工程复杂度,新增1:1比对示例; | 2024.06.07 | |
V8.6.0 | 1、批量激活优化,工程添加静默激活 | ||
5 | V9.0 | 1、支持情绪识别识别接口优化 |
1设计背景
1.1 场景特点
-- 网络:无网、局域网等情况均可使用。如政府单位、金融保险、教育机构等。
-- 安全:行业特点所带来的人脸数据敏感性,许多客户不希望将人脸数据传入百度服务器,即使连接公网也不会请求。
-- 速度:由于各地网络线路、机房部署等诸多原因,网络请求速度往往耗时较高,容易影响业务正常运转,离线SDK不会存在网络延迟问题。
-- 稳定:离线SDK不会受网络抖动、机房故障、线上连带bug等影响,进一步控制可用性影响因素
-- 海外人群:支持海外人脸识别,适用于以海外人群为主的通行、考勤、人证核验等场景下的1:1及1:N人脸比对和搜索
1.2 用户特点
-- 1:N-小型人脸库检索:多为通道通行、固定区域人群验证等需求,如写字楼闸机门禁、企业考勤打卡等,人脸库范围较小,且不易经常变动。
-- 1:1-自有数据源对比:有效应用于人证比对、身份核验等场景,将当前采集的人脸,与其他数据源中的人脸进行对比,如身份证芯片照、教务系统图片、档案图片等,进行快速的1:1对比验证。
1.3 核心功能
-- 离线人脸检测:可在设备端,离线实时检测视频流中的人脸。并对当前检测到的人脸进行持续跟踪、捕获、质量校验等,动态定位人脸轮廓,稳定贴合人脸。
-- RGB+NIR活体检测:可判断可见光RGB成像、NIR近红外成像是否为活体,可有效防止屏幕二次翻拍等作弊攻击
-- DERPTH深度图像(3D结构光)活体检测:通过3D建模判断目标对象是否为活体,基于3D结构光成像原理,可强效防御图片、视频、屏幕、模具等攻击。
-- 本地特征提取:所有在SDK中运行的人脸图片,都可以完成本地特征抽取,以便进行对比或识别操作。
-- 1:1对比:支持两张图片的相似度对比,可直接传入图片,获取图片中人脸特征进行比对、适应于人证核验等场景;
-- 1:N比对:可在指定人脸集合中,找到最相似的人脸,并返回相似度最高的人脸信息及对应分值。人脸库可存储于本地数据库,并支持通过视频流实时采集的人脸特征值比对实现人脸的1:N识别。
1.4 使用场景
-- 通用版SDK:适用于大部分Android5.0以上系统的手机和面板机,由于不同设备、摄像头和cpu等的差异,识别效果可能会存在细微差距。SDK专门针对如RK3399、RK3288主板和迪威泰、视派尔等摄像头进行了模型和识别效果上的优化
-- 3568专版SDK:适用于3568、 3566的npu主板,有npu算法加持,相对通用版SDK专版在处理和识别速度上有明显提升,提升范围在1.5到3倍左右。
2 SDK简介
2.1 SDK环境
| 项目 | 说明 |
|---|---|
| 适用平台 | Android 5.0(API 21)及以上 |
| SDK 版本 | 9.0 |
| Demo 分支 | release_9.0 |
| 开发语言 | Java(源码兼容级别 Java 8) |
| Demo 构建环境 | Gradle 7.4、Android Gradle Plugin 7.3.1、JDK 11 或 17 |
| Demo Android 配置 | compileSdkVersion 31、targetSdkVersion 31、minSdkVersion 21 |
| Demo ABI | armeabi-v7a、arm64-v8a |
2.2 功能架构
SDK具有人脸检测、跟踪、质量检测、特征提取、RGB、 NIR以及3D结构光静默活体、1:1比对、1:N识别、年龄、性别、是否戴口罩、戴眼镜和佩戴安全帽、左右眼球注意力等功能,架构图如下:

2.3 人脸识别流程
人脸识别流程如下图所示,通过SDK的授权激活且模型初始化成功后,根据输入的图片或视频帧进行人脸检测,同时对人脸进行质量、活体和属性等进行过滤判断(通常情况下质量合格的图在1:N人脸识别时候识别率更高),通过对质量通过后的高质量图片进行人脸特征提取后、可根据人脸特征进行人脸1:1的比对和1:N的识别(1:N识别前需要先进行人脸注册入本地库),通常以人脸特征的比对或识别阈值大于80分为比对成功或识别通过。

3 SDK及Demo工程结构说明
3.1SDK能力与接入流程
SDK 支持以下主要能力:
- 人脸检测、跟踪和关键点定位。
- 模糊、光照、姿态角、遮挡和最佳人脸等质量检测。
- RGB、NIR 和 Depth 静默活体检测。
- 人脸特征提取、1:1 比对和 1:N 检索。
- 年龄、性别、情绪、口罩、安全帽和注意力等可选属性能力。
- RGB、RGB+NIR、RGB+Depth 等输入组合。
推荐接入顺序:
- 集成 SDK AAR 和所需模型文件。
- 配置 ABI、权限和混淆。
- 使用最终应用包名申请授权。
- 启动时调用静默鉴权;未激活时进入离线、在线或批量激活流程。
- 鉴权成功后初始化检测、活体、特征等所需模型。
- 初始化业务人脸库,并将 1:N 特征同步到 SDK 内存缓存。
- 创建图像、检测和流程配置,逐帧调用
onDetectCheck。 - 在页面退出时停止摄像头、移除回调并释放图像资源。
授权、模型初始化和底库加载都完成后,才能开放注册、比对和识别功能。
3.2官网工程包结构说明
目前百度AI官网有集成SDK摄像头、人脸数据库统一封装的效果展示的SDK Demo工程,官网的下载地址为:
[https://console.bce.baidu.com/ai-engine/old/#/ai/face/offline/index](https://console.bce.baidu.com/ai-engine/old/" \l "/ai/face/offline/index)

该工程中分为Andorid通用项目、DEPTH 3D结构光项目、SDK、文档,四个板块,主要功能为:
| 文件夹名 | 说明 |
|---|---|
| SDK | SDK核心库,包含SDK的aar以及模型文件 |
| FaceSDKAndroid | Android通用项目,适用于大部分摄像头和安卓设备,支持RGB+NIR双目摄像头识别,集成方式可参考后述5、SDK以及项目的集成 |
| FaceSDKAndroid_depth | DEPTH 3D结构光项目,使用RGB+DEPTH的3D结构光摄像头场景,对3D头模的活体防御有明显提升,改项目仅支持对华捷 和 奥比 两款摄像头进行测试, 集成方式可参考后述5、SDK以及项目的集成 |
| 开发文档 | 项目开发文档 |
3.3工程结构说明
3.3.1 Demo 工程
FaceSDKAndroid 主要包含:
Demo示例工程针对百度离线人脸识别SDK调用,并且对sqlite人脸数据库和相机等功能进行封装,FaceSDKAndroid Demo工程结构如下:
| 路径/模块 | 说明 |
|---|---|
app |
包含闸机、考勤、人证核验、支付、属性、注册功能ui展示界面 包含sdk激活、模型初始化、1:N、1:1、特征提取、注册 功能调用方式 包含sdk模型文件 |
faceaar |
SDK核心库、将目录中的一个 SDK AAR 暴露为 Gradle 模块 |
app/src/main/assets/face-sdk-models |
Demo 使用的模型资源 |
3.3.2 SDK aar文件和模型文件说明
将交付模型按原目录结构放入:
1app/src/main/assets/face-sdk-models/
当前 Demo 包含以下模型目录:
| 目录 | 能力 | 使用条件 |
|---|---|---|
align、detect |
跟踪、检测、关键点 | 基础能力,通常保留 |
blur、occlusion、best_image |
质量检测 | 启用对应质量能力时保留 |
feature |
特征提取、1:1、1:N | 使用识别能力时保留 |
silent_live |
RGB/NIR/Depth 活体 | 按启用的活体模态保留对应模型 |
attribute、emotion |
属性、情绪 | 启用对应能力时保留 |
gaze、eyes_close |
注意力、闭眼 | 启用对应能力时保留 |
mouth_mask、mouth_close |
口罩、闭嘴 | 启用对应能力时保留 |
safetyhat |
安全帽 | 启用对应能力时保留 |
dark_enhance |
暗光恢复 | 启用暗光恢复时保留 |
driver_monitor |
驾驶行为 | 启用对应能力时保留 |
删除可选模型前,必须同时关闭 BDFaceModelConfig 中对应的初始化开关。模型文件名和版本以实际交付包为准,不要混用历史版本模型。
SDK分为aar(历史版本为jar so)和模型资源文件等几个部分、SDK aar库文件位于项目中的faceaar/faceSDK-9.0-*.aar目录下
模型文件储存在项目app\src\main\assets\face-sdk-models文件夹中,各模型文件说明如下:
模型文件名称 | 说明 | 是否可删 | 删减说明 |
align_rgb-customized-pa-fast.model.float32-0.7.5.5 | 人脸快速对其模型 | 否 | 使用人脸跟踪能力可快速进行人脸检测 |
align_rgb-customized-pa-80.model.float32-6.4.14.4 | 人脸对其模型 | 否 | 相比快速对其模型,通常与人脸检测模型同步使用。 再检测过程中更加稳定的模型,且后续的活体检测和识别都需要依赖人脸检测的输出结果,不建议删除 |
attribute-customized-pa-mobile.model.float32-1.0.9.5 | 人脸属性模型 | 是 | 若不使用人脸属性检测功能,该文件夹可删除, |
best_image-mobilenet-pa-dcqe449_live_e51_relu_128.model.float32-1.0.3.1 | 最佳人脸 | 否 | 最佳人脸通常是质量判断的一个环节、不建议删除 |
blur-customized-pa-addcloud_quant_e19.model.float32-3.0.13.3 | 人脸质量模糊度检测 | 否 | 过滤模糊的图片,选择清晰的图片,可提高识别通过率 |
dark_enhance-customized-pa-zero_depthwise.model.float32-1.0.2.2 | 暗光恢复模型 | 是 | 用于暗光情况图像优化,若不使用该功能,该文件夹可删除 |
detect_rgb-customized-pa-192.model.float32-0.0.18.1 | 人脸检测模型 | 否 | 通常与人脸对其模型同时加载,可检测出人脸宽高位置及人脸关键点信息,且后续人脸特征 人脸识别 人脸活体检测中需要用到该模型输出结果,不建议删除 |
driver_monitor_nir-customized-pa-DMS_rgb_nir_detect.model.float32-1.0.1.2 | 驾驶员行为模型 | 是 | 用于喝水 抽烟 打电话 吃东西的行为检测,不需要该功能可删除 |
feature_live-customized-pa-dwtr.model.int8 | 特征提取模型 | 是 | 人脸特征提取模型,需要进行1:N识别或 1:1比对的情况下不建议删除 |
gaze-customized-pa-mobile.model.float32-1.0.3.4 | 注意力检测模型 | 是 | 眼球上下左右注意力检测模型,不需要该功能可删除 |
mouth_mask-customized-pa-faceocc_3classes.model.float32-1.0.9.2 | 口罩检测模型 | 是 | 检测是否戴口罩,不需要该功能可删除 |
occlusion-customized-pa-paddle.model.float32-2.0.7.3 | 质量检测遮挡模型 | 否 | 面部遮挡模型,人脸识别时候,建议通过遮挡模型判断 |
attribute-customized-pa-anquanmao2023_v1.model.float32-1.0.73.1 | 安全帽检测模型 | 是 | 安全帽检测模型,不需要可删除 |
liveness_rgb-customized-pa-DCQsdk80.model.float32-1.1.82.1 | RGB活体检测模型 | 是 | 用于RGB可见光单目静默活体,若只使用rgb静默活体,则该文件夹下除该文件外均可删除 |
liveness_nir-customized-pa-DCQ_80.model.float32-1.1.78.1 | NIR活体检测模型 | 是 | 用于NIR可见光单目静默活体,若没有NIR摄像头或不使用NIR活体可删除 |
liveness_depth-customized-pa-paddle_60.model.float32-1.1.13.2 | DEPTH活体检测模型 | 是 | 用于3D结构光静默活体检测,不使用3D结构光摄像头情况下可删除 |
liveness_rgb-customized-pa-DCQsdk80.model.float32-1.1.82.1 | RGB活体多音子检测模型 | 是 | 用于增强RGB可见光静默活体防攻击效果的模型,更好的防御电子设备中人脸图片的攻破效果,不需要可删除 |
liveness_rgb-customized-pa-hand_sdk_224.model.float32-1.1.69.1 | |||
liveness_rgb-customized-pa-model_freeze_2dmask_20211210_sdk_224_epoch7.model.float32-1.1.80.1 |
4、Demo工程的编译和使用
4.1 环境要求
当前 Demo 的实际构建组合是:
1Gradle: 7.4
2Android Gradle Plugin: 7.3.1
3Gradle 运行 JDK: 11 或 17
4Java source/target compatibility: 1.8
5compileSdkVersion: 31
6targetSdkVersion: 31
7minSdkVersion: 21
“Java 8 兼容级别”不等于“可以使用 JDK 8 运行当前 Gradle 构建”。使用 Android Studio 时,将 Gradle JDK 设置为 11 或 17。
4.2 通过 AAR 模块依赖
Demo 默认依赖 :faceaar:
1// settings.gradle
2include ':app'
3include ':faceaar'
1// app/build.gradle
2dependencies {
3 implementation project(':faceaar')
4}
客户工程也可直接把 AAR 放入应用模块的 libs 目录:
1dependencies {
2 implementation files('libs/faceSDK-9.0-core-<date>.aar')
3}
二选一即可,不要重复依赖同一 SDK。
4.3 ABI 配置
Demo 仅打包以下 ABI:
1android {
2 defaultConfig {
3 ndk {
4 abiFilters 'armeabi-v7a', 'arm64-v8a'
5 }
6 }
7
8 packagingOptions {
9 pickFirst 'lib/armeabi-v7a/libc++_shared.so'
10 pickFirst 'lib/arm64-v8a/libc++_shared.so'
11 }
12}
最终支持范围取决于实际 AAR 中的 lib/<abi>/ 内容。不要声明 AAR 未提供的 ABI;常见表现是安装失败或运行时报 UnsatisfiedLinkError。
4.4 权限与应用配置
4.4.1 Manifest 配置
按业务实际需要声明权限。Demo 使用:
1<uses-permission android:name="android.permission.CAMERA" />
2<uses-permission android:name="android.permission.INTERNET" />
3<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4<uses-permission android:name="android.permission.READ_PHONE_STATE" />
5<uses-permission android:name="android.permission.WRITE_SETTINGS" />
6<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
7<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
8
9<uses-feature android:name="android.hardware.camera" />
10<uses-feature
11 android:name="android.hardware.camera.autofocus"
12 android:required="false" />
13<uses-feature
14 android:name="android.hardware.camera.front"
15 android:required="true" />
说明:
CAMERA用于图像采集,Android 6.0 及以上需要动态申请。INTERNET、ACCESS_NETWORK_STATE用于在线和批量激活等联网能力。- Demo 保留
WRITE_SETTINGS、READ_PHONE_STATE,用于授权 SDK 获取和备份设备指纹;客户应结合目标 Android 版本、设备 ROM 和授权方案实测。 - Demo 的存储权限及
requestLegacyExternalStorage=true是历史兼容方案,不应直接作为新应用模板。Android 10 及以上应按实际授权文件路径、图片导入和调试存图需求设计存储访问。 - 只申请业务真正需要的权限,并在调用摄像头或读取用户文件前完成告知和授权。
如应用本地保存人脸特征或截图,建议关闭系统备份:
1<application
2 android:allowBackup="false"
3 ... />
4.4.2 包名与授权
授权会校验设备指纹、包名、有效期和授权能力。申请 License 前,使用下面的值确认最终运行包名:
1String packageName = context.getPackageName();
授权申请的包名必须与最终安装包一致。修改 applicationId、更换应用变体或重新打包后,应重新核对授权。Demo 的 Gradle applicationId 与 Manifest 源文件中的 package 不同,因此不要照抄 Manifest 的 package 作为授权依据。
> 9.0 更新了设备指纹提取方式。由 9.0 以前版本升级时,设备指纹可能变化,已激活设备可能需要使用新的授权重新激活。
4.5 编译与使用
SDK Demo工程下载解压后,FaceSDKAndroid工程如下:

使用android studio打开FaceSDKAndroid项目


注:部分版本的android studio在编译的时候会出现错误,或者提示需要升级gradle8.0以上版本,该问题为java jdk不适配导致,目前demo的gradle版本为7.4,可在android studio中设置11或17版本的java jdk,截图如下:
相关报错


解决方案


Jdk设置完成后,等待项目编译完成,运行项目

注:andorid手机需开启开发者模式和usb调试才可以正常运行,通常在手机设置-关于手机-找到系统版本连点7下即可开启开发者模式,不同型号手机位置不同

demo主要运行流程为,其中激活须设备能连接网络(离线激活不需要),激活用到的序列号可在百度AI官网申请,官网具体位置和激活流程请参考[4.1 授权激活](#_4.1 授权激活),demo主要流程如下:

4.6 授权激活
SDK分为离线激活、在线激活、批量激活三种激活方式(可使用其中任何一种进行激活),SDK需要通过授权激活后才能正常使用,三种激活方式可从官网申请激活文件或激活序列号(三种激活方式均会对通过指纹对设备进行绑定,如果存在系统更新、硬件更新、固件刷新的情况会导致设备指纹改变从而激活失败),官网申请激活序列号以及离线激活地址如下:
[https://console.bce.baidu.com/ai/?_=1670415860750&fromai=1#/ai/face/offline/index](https://console.bce.baidu.com/ai/?_=1670415860750&fromai=1" \l "/ai/face/offline/index)
注:9.0版本sdk更新了设备指纹提取方式,获取的指纹会与9.0以前的历史版本sdk不同,已经激活过的设备使用9.0版本sdk需使用新的序列号从新激活
4.6.1离线激活(适应于无网或弱网环境)
SDK Demo运行后,首先会进入激活界面,在离线激活选项中可找到当前设备的设备指纹,在官网填入指纹信息,可获取授权文件(License.zip)无需解压,将授权文件放到设备sdcard(/sdcard/License.zip)目录下,进入离线激活界面,点击激活,即可完成激活,百度官网的离线激活页面如下:

先获取设备指纹,再在授权平台生成与设备及包名匹配的 License:
1BdFaceAuth faceAuth = new BdFaceAuth();
2String deviceId = faceAuth.getDeviceId(context);
将 License.zip 放到 SDK 要求的位置后调用:
1faceAuth.initLicenseOffLine(context, (code, response) -> {
2 if (code == 0) {
3 initFaceModels();
4 } else {
5 handleAuthError(code, response);
6 }
7});
Demo 使用 /sdcard/License.zip。在 Android 10 及以上系统上,应在目标设备验证该固定路径及存储权限是否可访问;不要在未验证时承诺所有系统版本均可直接读取。
4.6.2在线激活(需要设备能连网)
SDK Demo运行后(首次需联网),首先会进入激活界面,点击在线激活,在激活选项中输入官网的16位序列号,点击激活,即可完成在线激活,激活授权序列号可参考如下页面(百度AI官网登录账号购买后可显示):


在线激活需要首次联网,Demo 使用四组共 16 位激活码:
1String licenseId = "XXXX-XXXX-XXXX-XXXX";
2faceAuth.initLicenseOnLine(context, licenseId, (code, response) -> {
3 if (code == 0) {
4 initFaceModels();
5 } else {
6 handleAuthError(code, response);
7 }
8});
禁止把真实激活码提交到代码仓库或写入日志。
4.6.3批量激活(需要设备能联网)
SDK Demo运行后(首次需联网),首先会进入激活界面,点击批量激活,该激活方法需要在代码中添加批量激活序列号,在官网-批量授权选项中可申请批量激活授权序列号,批量激活序列号可参考如下页面在百度AI官网获取、获取后填写到如下页面代码中(红色标记处):


1String batchLicenseId = obtainBatchLicenseIdSecurely();
2faceAuth.initLicenseBatchLine(context, batchLicenseId, (code, response) -> {
3 if (code == 0) {
4 initFaceModels();
5 } else {
6 handleAuthError(code, response);
7 }
8});
当前 Demo 的 BatchFragment 传入空字符串,仅是待填写占位代码,不能直接用于交付。客户必须填写在授权平台申请的批量 License ID,并妥善保护该凭据。
4.6.4 激活过后启动时静默鉴权
已成功激活过的设备,应用启动时先调用:
1FaceSDKManager.getInstance().startAuth(context, new SdkInitListener() {
2 @Override
3 public void initModelSuccess(int code) {
4 // 鉴权成功,再初始化模型。
5 initFaceModels();
6 }
7
8 @Override
9 public void initModelFail(int errorCode, String msg) {
10 // 跳转到首次激活页面或展示可恢复的错误信息。
11 showActivationPage(errorCode, msg);
12 }
13});
Demo 的 FaceSDKManager.startAuth 是对 FaceSdkController.startAuth 的薄封装。
4.7 SDK Demo使用说明(可直接编译Demo生成apk体验)
4.7.1模型加载及初始化
鉴权成功后,按业务能力初始化模型。以下示例与 Demo 的初始化方式一致:
1private void initFaceModels() {
2 BDFaceModelConfig modelConfig = new BDFaceModelConfig();
3 modelConfig.setInitCrop(true);
4 modelConfig.setInitLive(true);
5 modelConfig.setInitRGBLive(true);
6 modelConfig.setInitNIRLive(false);
7 modelConfig.setInitDepthLive(false);
8 modelConfig.setInitDetect(true);
9 modelConfig.setInitTrack(true);
10 modelConfig.setInitFeature(true);
11 modelConfig.setInitGaze(false);
12 modelConfig.setInitMouthMask(false);
13 modelConfig.setInitSafetyHat(false);
14 modelConfig.setInitDark(false);
15 modelConfig.setMultiIdentify(false);
16
17 BDFaceSDKConfig sdkConfig = FaceUtils.getInstance().getBDFaceSDKConfig();
18
19 FaceSDKManager.getInstance().initModel(
20 getApplicationContext(),
21 sdkConfig,
22 modelConfig,
23 new SdkInitListener() {
24 @Override
25 public void initModelSuccess(int code) {
26 loadFaceDatabase();
27 }
28
29 @Override
30 public void initModelFail(int errorCode, String msg) {
31 handleModelError(errorCode, msg);
32 }
33 });
34}
注意:
- 只开启业务需要的能力,并保留对应模型文件。
setInitLive(false)会关闭活体模型总开关。- 1:1、1:N 和注册需要启用特征模型。
- 快速人脸框绘制需要启用跟踪模型。
- 不要在模型初始化成功前提交图像帧。
- 错误码
-12表示能力已加载;是否可忽略应结合调用时机和实际 SDK 返回信息判断。
4.7.2模型加载及镜头角度设置
SDK激活成功后(激活可参考[4.1 授权激活](#_4.1 授权激活))会进入demo首页,此时会自动进行模型初始化加载操作,等待首页提示模型初始化成功后,再进行后续操作,模型初始化接口及弹窗提示效果如下:

模型初始化成功后,部分设备还不能进行注册和人脸识别,需在设置界面中调整人脸检测和摄像头的角度(须人脸正向),角度正确后可进行注册和人脸识别操作,界面如下:

在设置界面中找到镜头设置

镜头设置中分为:人脸检测图像设置为SDK对视频流进行解码的角度(识别角度),视频流回显图像设置为摄像头在屏幕中显示的角度(显示角度),具体界面如下(如人脸不是正向的时候,可点击旋转按钮把人脸摆正):


4.7.3检测配置
Demo 的 FaceUtils.getBDFaceSDKConfig() 主要配置:
1BDFaceSDKConfig config = new BDFaceSDKConfig();
2config.maxDetectNum = 2;
3config.trackInterval = Integer.MAX_VALUE;
4config.minFaceSize = minimumFace;
5config.notRGBFaceThreshold = faceThreshold;
6config.notNIRFaceThreshold = faceThreshold;
其中:
maxDetectNum:单帧最大检测人数。minFaceSize:最小人脸尺寸,Demo 注释建议大于 30 px,默认配置为 80 px。notRGBFaceThreshold、notNIRFaceThreshold:检测置信度,Demo 注释建议大于 0.3,默认配置为 0.5。trackInterval:跟踪过程重新全图检测的间隔策略。
多人脸模式下 Demo 使用:
1modelConfig.setMultiIdentify(true);
2sdkConfig.maxDetectNum = 5;
3sdkConfig.trackInterval = 0f;
人数越多,CPU、内存和单帧耗时越高。应在目标硬件实测后确定上限,不建议直接沿用历史文档中的固定人数承诺。
4.7.4人脸库与特征缓存
4.7.4.1 两层数据的职责
Demo 同时维护:
- SQLite
face.db:持久化人员 ID、姓名、特征和可选头像。 - SDK 内存缓存:用于运行时 1:N 高速检索。
写入数据库不会自动更新 SDK 缓存。新增、删除或全量替换人员时,必须同步更新两处数据。
4.7.4.2 启动加载
模型初始化成功后,在后台线程读取数据库。大底库应分批推送:
1FaceSDKManager.getInstance().featureClean();
2
3for (List<User> batch : batches) {
4 FaceSDKManager.getInstance().pushPersons(batch);
5}
当前 Demo 每批读取 1000 条,避免把全部对象同时保留在内存中。底库加载期间不要开放识别入口。
4.7.4.3 增删改同步
1// 新增
2FaceSDKManager.getInstance().pushPerson(user.getId(), user.getFeature());
3
4// 删除
5FaceSDKManager.getInstance().delFeature(userId);
6
7// 全量替换
8FaceSDKManager.getInstance().pushAllPersons(users);
9
10// 清空
11FaceSDKManager.getInstance().featureClean();
每个人员 ID 必须唯一,并与业务数据库一致。删除数据库记录时同步调用 delFeature;批量刷新时可先 featureClean 再分批 pushPersons。
4.7.5图片及视频流注册
设置好摄像头角度后,返回首页,在右上角按钮中可找到人脸注册和人脸库管理选项(进行人脸1:N识别,需要先进行人脸注册入库,1:N识别时候是实时检测的视频帧和人脸库里的已经注册入库的N个人进行比对识别),其中人脸注册功能支持将摄像头中检测的人脸数据注册到数据库(也支持图片批量导入注册入库),人脸库管理中可查看注册的人脸信息并且也可以对图片进行人脸注册,整体效果截图如下:
视频流注册:
选择人脸注册

检测到人脸后,输入用户信息,点击确认方可完成注册

图片注册:
图片注册需要手动拷贝将需要注册的人脸图片放到设备/sdcard/Face-Imort/文件夹中,在人脸库管理-批量导入中方可进行图片注册,效果如下:

在人脸库管理中还可以看到目前数据库中的人脸数据进行查询和删除的操作,点击右上角批量导入,方可进行图片注册(注:目前demo对图片名进行控制,不得超过5个字、另外可能会有部分不符合质量要求的人脸注册入库时候失败,具体可根据调试信息查看)
推荐注册流程:
- 确保模型和摄像头已就绪。
- 检测到且仅检测到一张人脸。
- 校验人脸框位置、尺寸、姿态、模糊、光照和遮挡。
- 按业务需要校验 RGB/NIR/Depth 活体。
- 确认特征提取返回码为
128。 - 保存人员信息和特征到业务数据库。
- 保存成功后调用
pushPerson更新 SDK 缓存。
视频流结果中可读取特征:
1float featureCode = model.getFeatureCode();
2if (featureCode == 128) {
3 byte[] feature = model.getFeature();
4 boolean saved = saveUserToDatabase(userName, feature);
5 if (saved) {
6 FaceSDKManager.getInstance().pushPerson(userId, feature);
7 }
8}
对单张 Bitmap 提取特征:
1byte[] feature = new byte[512];
2BDFaceCheckConfig config = FaceUtils.getInstance()
3 .getBDFaceCheckConfig(new BDFaceUtilityConfig(false, enableQuality));
4
5FeatureData result = FaceSDKManager.getInstance()
6 .personDetect(bitmap, feature, config);
7
8if (result.code == 128) {
9 saveFeature(feature);
10} else {
11 handleFeatureError(result.code, result.msg);
12}
通用 9.0 Demo 使用 512 字节特征数组。不同专版可能不同,必须以实际 SDK 交付说明为准。
4.7.6 图像输入与视频流识别
4.7.6.1 创建图像配置
Demo 摄像头输出 NV21:
1BDFaceImageConfig rgbConfig = new BDFaceImageConfig(
2 height,
3 width,
4 rgbDetectDirection,
5 mirrorRgb,
6 BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21);
NIR 图像使用独立的 BDFaceImageConfig,并配置对应旋转方向和镜像。传入的 height、width、方向、镜像和图像格式必须与实际帧一致,否则会出现检测失败、坐标偏移或图像旋转错误。
Bitmap 输入可使用:
1BDFaceImageConfig imageConfig = new BDFaceImageConfig(bitmap);
4.7.6.2 创建流程配置
Demo 通过 BDFaceUtilityConfig 决定识别流程,再由 FaceUtils 组装质量、活体和业务阈值:
1BDFaceUtilityConfig utilityConfig = new BDFaceUtilityConfig();
2utilityConfig.isLive = enableLiveness;
3
4BDFaceCheckConfig checkConfig =
5 FaceUtils.getInstance().getBDFaceCheckConfig(utilityConfig);
阈值必须根据摄像头、距离、光照、目标设备和业务误识率要求调优。不要把“相似度大于 80”作为所有场景的通用结论。
4.7.6.3 调用识别接口
在摄像头帧回调中更新数据并调用:
1rgbConfig.setData(rgbNv21);
2if (nirNv21 != null) {
3 nirConfig.setData(nirNv21);
4}
5
6FaceSDKManager.getInstance().onDetectCheck(
7 rgbConfig,
8 nirConfig,
9 null,
10 checkConfig,
11 new FaceDetectCallBack() {
12 @Override
13 public void onFaceDetectCallback(List<LivenessModel> models) {
14 handleFaceResults(models);
15 }
16
17 @Override
18 public void onTip(int code, String msg) {
19 handlePipelineTip(code, msg);
20 }
21
22 @Override
23 public void onFaceDetectDarwCallback(List<LivenessModel> models) {
24 drawFaceFrames(models);
25 }
26 });
回调职责:
| 回调 | 用途 |
|---|---|
onFaceDetectCallback |
获取质量、活体、特征和识别结果,执行业务判断 |
onTip |
获取流程提示或错误信息 |
onFaceDetectDarwCallback |
获取快速跟踪结果,用于绘制人脸框 |
回调线程不应被视为主线程。所有 UI 更新应显式切换到主线程;不要在逐帧回调中执行数据库全表查询、网络请求、同步文件写入或大量日志拼接。
4.7.7 1:N识别和1:1比对
1:N识别:
SDK Demo提供了闸机模式、支付模式、考勤模式,这几种场景化示例Demo均为1:N人脸识别功能,除界面不同外识别效果和接口基本相同,开发者可根据项目需求选择不同界面进行集成,通过操作可将人脸注册入库,并且在识别时候对视频流中的人脸进行人脸框绘制、活体、质量检测的判断、提取摄像头中人脸特征、最后跟前述已经注册入库的人脸特征值进行识别比对,返回相似度最高的人员信息和各个SDK原子接口的识别耗时以及总耗时,具体页面展示效果如下:

1:N 识别前必须完成底库缓存加载。识别回调中,从 LivenessModel 获取命中结果:
1for (LivenessModel model : models) {
2 Feature featureInfo = model.getFeatureInfo();
3 if (featureInfo == null) {
4 continue;
5 }
6
7 int userId = featureInfo.getId();
8 float score = featureInfo.getScore();
9 User user = findUserById(userId);
10 handleIdentifyResult(user, score);
11}
业务层还应同时判断:
model.getFaceInfo()是否为空。- 质量检测是否通过。
- 已开启的活体分值是否达到对应阈值。
- 命中分值是否达到经过实测确定的识别阈值。
- 同一个跟踪 ID 是否需要去重或冷却,避免连续帧重复触发业务动作。
1:1比对:
SDK Demo中的人证核验模块为1:1比对展示界面,点击底部上传证件照按钮,进入相册选择证件照图片方可进行视频流1:1比对,比对展示效果如下:
先从底图提取第二特征:
1byte[] secondFeature = new byte[512];
2FeatureData featureData = FaceSDKManager.getInstance().personDetect(
3 referenceBitmap,
4 secondFeature,
5 FaceUtils.getInstance().getBDFaceCheckConfig(
6 new BDFaceUtilityConfig(false, enableQuality)));
7
8if (featureData.code != 128) {
9 handleFeatureError(featureData.code, featureData.msg);
10 return;
11}
12
13checkConfig.setSecondFeature(secondFeature);
然后把实时视频帧或另一张 Bitmap 传给 onDetectCheck。比对结果从 LivenessModel 中读取,最终通过阈值必须按业务场景评测确定。
4.7.8 结果对象常用字段
以当前 Demo 实际使用为准:
| 对象/方法 | 说明 |
|---|---|
LivenessModel.getFaceInfo() |
人脸位置、尺寸、姿态、置信度等检测结果 |
LivenessModel.getQualityData() |
质量检测结果及错误码 |
LivenessModel.getRgbLivenessScore() |
RGB 活体分值 |
LivenessModel.getIrLivenessScore() |
NIR 活体分值 |
LivenessModel.getDepthLivenessScore() |
Depth 活体分值 |
LivenessModel.getFeatureCode() |
特征提取状态,128 表示成功 |
LivenessModel.getFeature() |
当前人脸特征 |
LivenessModel.getFeatureInfo() |
1:N 命中的人员 ID 和分值 |
LivenessModel.getBdFaceImageInstance() |
当前帧对应的 native 图像实例 |
LivenessModel.getLandmarks() |
人脸关键点 |
FeatureData.code、FeatureData.msg |
图片特征提取状态与提示 |
SDK 实体字段可能随 AAR 小版本调整。编译时应以交付 AAR 的类定义和 IDE 提示为准,不要照搬旧版文档中的字段表。
5、SDK以及项目的集成
5.1 集成说明
集中需要将SDK核心库、SDK模型集成到项目中。(其中sdk核心库中包含了对sdk原子接口和识别流程的封装,对于本地数据库 摄像头等可自行调整)具体位置为:

模块以及核心库导入完成后,将1:N(gateLibrary)或1:1(identifylibrary)模块中的FaceUtils文件和FaceSDKManager文件放入到项目,该文件对SDK初始化以及阈值进行封装,可更好的设置SDK参数,具体可参考[5.3.1 FaceUtils类方法说明](#_5.3.1 FaceUtils类方法说明)

注:后续注册人脸特征需要进行本地或云端存储,以便重启apk后能够识别历史注册过的人脸,demo使用的是本地sqlite存储,可将db目录下的文件导入到项目,具体截图如下:

5.2项目集成流程说明
项目集成中根据自身不同业务场景,可自由定制化开发,其中SDK能力层主要流程和接口截图流程如下:

SDK核心库、FaceUtils、SDK模型集成到项目中后,
先调用激活接口initLicenseOffLine(离线激活)、initLicenseOnLine(在线激活)、initLicenseBatchLine(批量激活),激活成功(OonResponse方法code参数为0则成功)后,才可以进行之后操作,具体代码如下:



激活成功后,需要进行SDK模型初始化和数据库初始化,模型初始化成功后才可以进行后续识别和注册操作,具体代码如下:

其中FaceSDKManager.getInstance().initModel接口包含人脸快速检测模型、人脸检测模型、属性模型、活体、特征提取模型、注意力模型、安全帽模型、口罩模型等能力的初始化,可根据项目需要设置对应能力
数据库初始化代码如下图所示:

模型初始化成功后,需要进行人脸注册才可以正常识别到人脸,
通过FaceSDKManager.getInstance().personDetect获取图片的人脸特征结果,

特征提取成功后,可通过FaceApi的registerUserIntoDBmanager或userAdd接口注册到数据库,

数据库保存成功后,在通过FaceSDKManager.getInstance().pushPerson,将数据库的人脸信息放到SDK缓存中

注册成功后,在识别界面创建识别阈值BDFaceCheckConfig和BDLiveConfig,其中包含识别、活体、质量等阈值的配置信息

识别阈值参数创建完成后,创建BDFaceImageConfig摄像头数据参数类,并使用CameraPreviewManager和GlMantleSurfacView打开摄像头,并展示摄像头界面



摄像头启动成功后,在CameraPreviewManager的setmCameraDataCallback接口可获取到摄像头每帧数据,将每帧数据放到BDFaceImageConfig摄像头数据参数类中,通过FaceSDKManager.getInstance().onDetectCheck对该数据进行人脸识别操作

其中FaceSDKManager.getInstance().onDetectCheck识别接口包含:
人脸快速检测(只返回人脸宽高位置,用于快速绘制人脸框,人脸跟踪)
质量检测(人脸角度 光照 模糊 遮挡)
活体检测(rgb nir depth活体)
属性检测(年龄 岁数 表情)
安全帽检测(是否带安全帽)
口罩检测(是否带口罩)
注意力检测(眼球上下左右位置 睁闭眼检测)
特征提取(人脸特征提取)
1:N识别(与内存中的批量人脸特征识别,返回满足条件得分最高的人脸)
1:1人脸比对(两个人脸特征进行人脸比对返回识别得分)
且可通过BDFaceUtilityConfig配置需要的功能
5.3工程核心类和方法说明
demo应用层对数据库、摄像头、SDK接口使用进行了封装,核心功能类分为;
| 类名 | 功能说明 |
|---|---|
| FaceApi | 数据库封装类,客户可调整内部逻辑或使用其他数据库删除该功能。 会在默认路径创建face.db人脸库文件、进行对人员信息和人脸特征的增删改查、都会保存在该文件中,具体可参考[5.3.1 FaceApi类方法说明](#_5.3.1 FaceApi类方法说明) |
| CameraPreviewManager | 摄像头启动类,客户可调整内部逻辑或使用其他数据库删除该功能。 单例的工具类仅支持一个摄像头的启动,可通过该类进行RGB摄像头的展示,对界面预览中出现的变形问题进行优化处理,并获取摄像头逐帧数据,具体可参考[5.3.2 CameraPreviewManager类方法说明](#_5.3.2 CameraPreviewManager类方法说明) |
| PreviewTexture | 摄像头启动类,相比CameraPreviewManager更加轻量级的效果展示,客户可调整内部逻辑或使用其他数据库删除该功能。 支持创建多个实例进行多个摄像头同时启动 |
| FaceUtils | SDK检测识别阈值封装类 对SDK初始化,SDK识别所需的阈值进行了封装,可快速获取SDK激活和识别时所需的类和阈值字段,可参考[5.3.4 FaceUtils类方法说明](#_5.3.4 FaceUtils类方法说明) |
| FaceSdkController | SDK核心功能类 一个方法可进行人脸检测、活体检测、质量检测、属性检测、口罩检测、1:1比对、1:N识别效果,且提供人脸模型的初始化,人脸特征注册,静默激活功能 |
5.3.1 FaceApi类方法说明
该类为业务层封装类,客户可根据自身业务调整内部逻辑,主要作用为人脸数据库的初始化,和人员信息的增删改查
| 方法名 | 所需参数 | 功能说明 |
|---|---|---|
| init( DBLoadListener dbLoadListener , Context context) |
DBLoadListener:初始化返回结果 Context:上下文 |
初始化数据库 |
| userAdd(User user) | User:用户信息 | 添加用户 |
| GetAllUserList() | 无 | 查询所有用户 |
| getUserListByUserName( String userName) |
String:用户名 | 根据用户名查询用户 |
| getUserListById( int _id) |
_id:用户id | 根据用户id查找用户 |
| userDeleteByName( String userName) |
String:用户名 | 根据用户名删除用户 |
| registerUserIntoDBmanager( String groupName, String userName, String picName, String userInfo, byte[] faceFeature) |
groupName:群组名 userName:用户名 picName:人脸图片名 userInfo:用户信息 faceFeature:人脸特征 |
添加用户,同userAdd |
FaceApi相关接口截图及说明如下:
初始化人脸数据库,会创建数据库并且获取数据库中的所有用户信息(该操作为耗时操作,需要在线程中进行),获取到的所有用户信息建议储存在list(users)中,方便后续进行用户信息提取操作,优化每次获取用户全部信息耗时过高问题

将用户信息注册到数据库,进行识别前需要提取出该信息放入SDK缓存中进行识别,具体识别接口可参考[6.6 FaceSearch识别对象](#_6.6 FaceSearch识别对象)

根据姓名查询用户信息,该接口可用于在人脸信息特征提取成功准备注册到数据库时判断数据库中是否包含该用户

根据用户id查询用户,demo中将数据库id设置为自增的int值,以保证每个id之间不重复,使用该方法可以在人脸识别成功后,通过识别出的用户id在数据库中查询用户信息

根据姓名在数据库删除用户,若产出成功识别前需要在SDK缓存中也删除该接口,或者从新获取一次数据库信息刷新一遍SDK缓存,具体识别接口可参考[6.6 FaceSearch识别对象](#_6.6 FaceSearch识别对象)

5.3.2 CameraPreviewManager类方法说明
| 方法名 | 所需参数 | 功能说明 |
|---|---|---|
| startPreview( GlMantleSurfacView textureView, int videoDirection , int width, int height) |
GlMantleSurfacView:摄像头展示view int(videoDirection):摄像头角度 int(width):摄像头宽度 Int(height):摄像头高度 |
初始化摄像头 |
| setCameraFacing( int cameraFacing) |
Int:摄像头id | 设置摄像头id,通常0为RGB,1为NIR |
| InitCamera() | 无 | 启动摄像头,并返回开启摄像头的宽高 |
| setmCameraDataCallback( CameraDataCallback mCameraDataCallback) |
CameraDataCallback:摄像头逐帧数据监听器 | 监听摄像头每帧数据 |
| StopPreview() | 无 | 关闭摄像头 |
CameraPreviewManager相关接口截图及说明如下:
初始化摄像头接口,设置展示画面,设置绘制人脸框镜像信息,设置摄像头角度,摄像头宽高等信息

设置摄像头id,部分摄像头为双目摄像头,包含RGB和NIR两款摄像头,通常id为0是rgb,1为nir

开启摄像头,并且会返回摄像头的宽高(如果初始化摄像头时设置的宽高 摄像头不适配,会返回当前启动摄像头当前适配的宽高)

摄像头数据监听接口,通过该接口获取摄像头的每帧数据,通常为nv21类型,通过获取的摄像头每帧数据送到SDK进行人脸检测等工作

摄像头关闭接口,在界面关闭时调用,清空摄像头缓存(退出SDK或不使用摄像头的时候注意关闭释放资源)

5.3.3 PreviewTexture类方法说明
| 方法名 | 所需参数 | 功能说明 |
|---|---|---|
| setCamera( Camera camera, int width, int height) |
Camera:摄像头实例 int(width):摄像头宽度 Int(height):摄像头高度 | 开启摄像头 |
PreviewTexture相关接口截图及说明如下:
PreviewTexture为摄像头展示view,继承ViewGroup,可以通过setCamera启动摄像头,并将摄像头信息展示到该view中

5.3.4 FaceUtils类方法说明
该类對识别、质量(光照、遮挡、模糊、角度)、活体等参数的阈值进行了封装,可通过该类快速获取识别和SDK初始化时所需要的阈值信息
| 方法名 | 所需参数 | 返回值 | 功能说明 |
|---|---|---|---|
| GetBDFaceSdkConfig() | 无 | BDFaceSDKConfig:人脸检测配置实体类 | 获取人脸检测实体类,通常在模型初始化时传入 |
| GetBDFaceCheckConfig() | 无 | BDFaceCheckConfig | 获取1:1和1:N时所需要的阈值信息 |
| GetBDLiveConfig() | 无 | BDLiveConfig | 获取活体阈值信息, 可参考 [7.10 BDLiveConfig实体类](#_7.10 BDLiveConfig实体类) |
FaceUtile 相关接口截图及说明如下:
获取模型初始化所需配置

获取识别所需配置

5.3.5 FaceSDKManager类方法说明
| 方法名 | 所需参数 | 功能说明 |
|---|---|---|
| setActiveLog( boolean isLog) |
boolean isLog:是否开启日志 | 底层日志开关 |
| startAuth( Context context, SdkInitListener listener) |
context:上下文 SdkInitListener :激活结果回调 |
如果成功激活一次,下一次重新启动调用该接口会根据上一次使用激活接口从新静默激活 |
| initModel( Context context, BDFaceSDKConfig config, BDFaceModelConfig bdFaceModelConfig , SdkInitListener listener) |
Context:上下文 BDFaceSDKConfig:人脸检测配置类 BDFaceModelConfig:模型初始化设置类 SdkInitListener:模型初始化结果回调 |
模型初始化接口 可配置单次识别检测到的人脸数量,人脸最小值,人脸置信度。控制激活那些模型等 |
| pushAllPersons( List |
List |
获取数据库全部人脸,清空当前sdk缓存中的人脸并从新添加 |
| pushPersons(List |
List |
批量添加人脸,保留缓存中的人脸,追加新的人脸 |
| pushPerson( int id , byte[] feature) |
id 人脸唯一标识,不可与缓存和数据库中其他id相同 feature 人脸特征 |
单个添加人脸,新人脸特征,注册到sdk缓存中 |
| delFeature(int id) | id 人脸唯一标识 | 清空单个缓存数据 |
| featureClean() | 无 | 清空全部缓存数据 |
| getUserNum() | 无 | 获取SDK缓存人脸数量 |
| onDetectCheck( BDFaceImageConfig bdFaceImageConfig, BDFaceImageConfig bdNirFaceImageConfig, BDFaceImageConfig bdDepthFaceImageConfig, BDFaceCheckConfig bdFaceCheckConfig, FaceDetectCallBack faceDetectCallBack) |
bdFaceImageConfig 可见光YUV 数据流 bdNirFaceImageConfig 红外YUV 数据流 bdDepthFaceImageConfig 深度depth 数据流 bdFaceCheckConfig 识别参数 faceDetectCallBack 结果回调接口 |
人脸识别流程 人脸跟踪-检测(质量检测 属性检测)-活体-安全帽-口罩-注意力-特征-人脸检索(1:1 1:n)流程 |
| getCopeFace( Bitmap bitmap, float[]landmarks, float enlargeRatio) |
landmarks 人脸关键点 enlargeRatio 裁剪比例 |
人脸裁剪接口 |
| personDetect( Bitmap bitmap, byte[] feature, BDFaceCheckConfig bdFaceCheckConfig) |
bitmap 原始图片 feature 人脸特征 bdFaceCheckConfig 参数配置可设置是否开启活体 质量 |
图片特征提取接口 |
faceSDKManager相关接口截图及说明如下:
模型初始化接口,针对人脸快速检测、人脸跟踪、活体检测、特征提取、口罩识别、属性检测、注意力检测、等功能进行模型初始化操作(只有初始化加载了模型、后续人脸检测等能力才能生效)
视频流逐帧检测接口,进行RGB和NIR的人脸检测、活体检测、质量检测、特征提取、1:N识别和1:1识别

特征提取接口,对图片进行人脸特征提取

pushAllPersons接口,主要作用为在识别前将人脸数据库中的信息同步到SDK缓存中(在缓存中比对识别速度更快),在人脸识别时会将视频流中提取的人脸特征和SDK缓存中的特征进行比较,并返回得分最大的人脸

视频流人脸识别接口,可以识别摄像头中人脸信息,返回人脸坐标进行应用层快速人脸绘制跟踪,并对人脸进行质量检测、活体检测和识别


5.4工程数据库db文件路径自定义说明
dataLibrary中默认会将注册的用户信息默认储存在data/data/包名/database 数据库的face.db默认路径下,可在DBHelper文件夹中放开这部分代码,即可修改数据库文件存储路径

5.5在线特征提取接口调用方式
5.5.1 接口调用
百度AI官网提供了可从云端进行人脸特征值提取的接口功能(通过http调用传入图片base64,返回人脸特征值),可以实现人脸特征抽取和人脸库的构建,主要用于在服务端(云端)提取与人脸离线识别SDK通用的人脸特征值,通过该接口获取的特征值可直接注册到设备中进行人脸1:1或1:N识别,接口调用文档如下:https://ai.baidu.com/ai-doc/FACE/Okg7edktq
此外,demo工程中添加了该接口的调用方式,代码可以参考 dataLibrary模块中的OnLineFeatureManager类,位置如下:

注:该接口需输入对应SDK版本参数(该参数是为了对齐SDK的版本和云端提取版本的特征值通用、只有版本对齐了,SDK的特征值和云端提取的特征值才能通用),目前常用参数为:
如:8.0(8.0到9.0范围,比如8.1、8.2、8.5)的sdk对齐云端:Android_8001
3568 3.1专版sdk:RV1109_3000

5.5.2 特征字符串转换
在线特征提取接口会返回bsae64位的人脸特征字符串,可使用Base64.decode()方法转换为byte数组,截图如下:

5.6 摄像头模组集成方法说明
此章节为应用层的摄像头模组说明,会对不同摄像头进行简单的描述和调用方式,其中摄像头通常分为三类,类型如下、实际场景中,可根据自身需要选择使用那种摄像头配置:
| 摄像头类型 | 摄像头功能说明 |
|---|---|
| RGB | 标准摄像头,通过红、绿、蓝三原色通道捕获彩色图像的摄像头,安卓手机中自带摄像头准为RGB摄像头 同时也是必不可少的摄像头,在项目中人脸检测、质量检测、1:1和1:N识别都需要使用该摄像头 |
| RGB+NIR | RGB:同上 NIR:近红外摄像头,主要用于辅助活体检测,更好的防御在活体检测过程中电子产品产生的人脸攻破问题 |
| RGB+DEPTH | RGB:同上 DEPTH:3D结构光深度摄像头,主要用于辅助活体检测,更好的防御在活体检测成3D头模产生的人脸攻破问题 |
5.6.1 RGB摄像头模组集成说明
RGB摄像头为标准摄像头,Android手机自带摄像头均可理解为RGB摄像头,使用Android原生自带的Camera类进行界面展示和视频流提取,项目工程可参照官网下载的工程包中的FaceSDKAndroid进行集成,工程文件可参照:3.2节 官网工程包结构说明,并且项目中对Camera进行了封装,具体可参照:4.3.5节 CameraPreviewManager类方法说明

5.6.2 RGB+NIR双目摄像头模组集成说明
RGB和NIR摄像头均可以使用android原生自带的Camera类进行界面展示和视频流提取,可以理解为这两种摄像头启动方式完全相同,唯一不同在一启动时传入id不同(id通常由系统决定,未插入其他usb设备情况下,通常为0是RGB、1是NIR)。项目工程可参照官网下载的工程包中的FaceSDKAndroid进行集成,工程文件可参照:3.2 官网工程包结构说明,集成说明如下:
RGB摄像头:同上,可参照5.6.1节 RGB摄像头模组集成说明
NIR摄像头:demo中使用PreviewTexture对NIR摄像头进行了封装(也可以开启RGB摄像头),具体可参考:[5.3.5 PreviewTexture类方法说明](#__x0001_5.2.5 PreviewTexture类方法说明)

Demo 使用 Android Camera API 获取 NV21 数据。摄像头 ID 由设备决定,不能假设所有设备都固定为 RGB=0、NIR=1。应枚举并校验实际设备。
在 onResume 中初始化摄像头和图像配置,在 onPause 中停止预览:
1@Override
2protected void onPause() {
3 super.onPause();
4 CameraPreviewManager.getInstance().stopPreview();
5
6 if (nirCamera != null) {
7 nirCamera.setPreviewCallback(null);
8 nirCamera.stopPreview();
9 nirCamera.release();
10 nirCamera = null;
11 }
12}
13
14@Override
15protected void onDestroy() {
16 CameraPreviewManager.getInstance().release();
17 super.onDestroy();
18}
检测方向与预览显示方向是两组不同配置。预览看起来正确不代表送入 SDK 的图像方向正确;应以人脸框、关键点和识别结果共同验证方向及镜像。
5.6.3 RGB+DEPTH摄像头模组集成说明
RGB+DEPTH的3D结构光摄像头会根据不同厂家生产的摄像头不同,调用方式各不相同,需要取对应厂家的官网下载摄像头启动的SDK集成到项目中,使用厂家规定的启动开启才行,目前官网项目种仅提供了奥比和华捷两款3D结构光的启动方式,项目工程可参照官网下载的工程包中的FaceSDKAndroid_depth项目进行集成,工程文件可参照:3.2 官网工程包结构说明,集成说明如下:
5.6.3.1 奥比摄像头
奥比摄像头SDK位于工程文件FaceLibrary/libs/orbbec_module-debug.aar下,将该SDK集成到项目可以调取奥比3D结构光摄像头接口

项目代码位于
aobilibrary\src\main\java\com\baidu\idl\main\facesdk\activity\aibi\FaceDepthGateActivity.java
中,提供了RGB和DEPTH的效果展示

RGB摄像头:
奥比RGB摄像头可以使用原生自带camera方式启动,可参照5.5.1 RGB摄像头模组集成说明
DEPTH摄像头:
奥比3D结构光摄像头需要用到奥比SDK中的OpenNIHelper(摄像头启动类) VideoStream(摄像头数据拉取类)和OpenNIView(数据展示类)
首先先在ui中创建摄像头展示view,创建深度摄像头回显


创建完成后,项目中创建OpenNIHelper摄像头启动类,并调用requestDeviceOpen方法开始,监听摄像头状态,

在requestDeviceOpen方法启动摄像头后,会拉起onDeviceOpened,表示摄像头已开启,失败则会拉起onDeviceOpenFailed(摄像头已经启动)或onDeviceNotFound(没有找到深度摄像头)
onDeviceOpened拉起成功后初始化VideoStream摄像头数据拉取类,且由于奥比摄像头种类不同,摄像头宽高比也不同,这里需要使用宽高判断摄像头模组,截图和奥比模组种类如下:

| 奥比摄像头类型 | 宽高比 |
|---|---|
| 奥比中光海燕、大白 | 640*400 |
| 奥比中光海燕Pro、Atlas | 400*640 |
| 奥比中光蝴蝶、Astra Pro\Pro S | 640*480 |
模组宽高设置后,开启一个独立线程,使用VideoStream进行摄像头逐帧数据的拉取,并展示到OpenNIView中,截图如下:

最后,退出界面时(onDestroy ,onPause )需关闭摄像头,关闭当前监听的线程,确保后续功能正确,截图如下

5.6.3.2 华捷摄像头
华捷摄像头SDK位于工程文件FaceLibrary/libs/orbbec_module-debug.aar下,将该SDK集成到项目可以调取奥比3D结构光摄像头接口

项目代码位于
huajielibrary\src\main\java\com\baidu\idl\main\huajie\activity\huajie\FaceLimActivity.java中,提供了RGB和DEPTH的效果展示,截图如下:

并且,需要将datalibrary\src\main\java\com\example\datalibrary\lim华捷摄像头工具类
导入到项目中,集成BaseLimActivity,创建showViewer抽象方法(showViewer会在摄像头启动后被调用),具体截图如下

集成BaseLimActivity后调用BaseLimActivity的openLim方法,可以打开RGB和DEPTH摄像头,启动成功后会调用showViewer的方法,并返回RGB和DEPTH数据

RGB摄像头:
展示华捷RGB摄像头需要用到GLPanel摄像头展示view,在xml中创建该view实例,在activity中获取彩色图像预览对象,截图如下:


创建GLPanel彩色摄像头对象后,在showViewer抽象方法中将GLPanel赋值给RGB展示对象即可完成摄像头效果展示,截图如下:

DEPTH摄像头:
展示华捷DEPTH摄像头需要用到GLPanel摄像头展示view,在xml中创建该view实例,在activity中获取彩色图像预览对象,截图如下:


创建GLPanel深度摄像头对象后,在showViewer抽象方法中将GLPanel 赋值给深度展示对象即可完成摄像头效果展示,截图如下:

RGB和DEPTH摄像头数据获取:
showViewer方法被调用用可以开启独立线程,获取RGB和DEPTH视频流数据,使用华捷SDK的ImiDevice.ImiFrame类获取RGB和DEPTH的每帧数据,并对每帧数据进行过滤,最终获取正确的视频流数组,具体截图如下



5.7 多人脸识别说明
SDK支持多个人脸进行人脸面部ui绘制和识别,可调整SDK的maxDetectNum参数调整人脸识别数量(建议单次识别10个人脸以内),并在FaceSDKManager类中开启多人脸识别测试识别效果,具体截图如下:


5.8 Log日志说明
项目中对激活、模型初始化、识别过程进行了日志打印,可通过LogUtils类设置是否打印日志,且可通过FaceModel(模型初始化)、FaceSDKManager(识别)、BdFaceAuth(激活)文字过滤日志,截图如下:

6 SDK功能接口说明
6.1 BDFaceAuth鉴权接口
| 构造方法 | 参数 | 参数说明 | 说明 |
|---|---|---|---|
| FaceAuth() | 无 | 创建一个FaceAuth |
6.1.1在线授权
方法名 | initLicenseOnLine | |||
说明 | 用户通过申请授权码,在线授权,激活设备 | |||
方法 | initLicenseOnLine(final Context context, final String licenseID, final Callback callback) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
context | 上下文 | 是 | Context | 无 |
licenseKey |
| 是 | String | |
callback | 鉴权结果0 为成功,错误码可参考:9.1在线 和 离线初始化错误码说明 | 是 | Callback | |
6.1.2离线授权
方法名 | initLicenseOffLine | |||
说明 | 用户申请鉴权文件,放在SD 卡下,点击按钮直接鉴权 | |||
方法 | initLicenseOffLine(final Context context, final Callback callback) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
context | 上下文 | 是 | Context | 无 |
callback | 鉴权结果0 为成功,错误码可参考:9.1在线 和 离线初始化错误码说明 | 是 | Callback | |
6.1.3批量授权
方法名 | initLicenseOnLine | |||
说明 | 用户通过申请在线批量licenseID进行激活,可直接网络请求获取鉴权文件 | |||
方法 | initLicenseBatchLine(final Context context, final String licenseKey, final Callback callback) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
context | 上下文 | 是 | Context | 无 |
licenseKey |
| 是 | String | |
callback | 鉴权结果0 为成功,错误码可参考:9.1在线 和 离线初始化错误码说明 | 是 | Callback | |
6.1.4底层log日志接口
方法名 | setActiveLog | |||
说明 | 用于Debug时候输出Log详细信息 | |||
方法 | setActiveLog(BDFaceSDKCommon.BDFaceLogInfo logInfo, int isLog) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
logInfo | 底层log 打印 // 打印输出错误日志 // 打印输出值日志 // 打印性能日志 // 打印全部日志 // 打印debug日志 | 是 | BDFaceLogInfo | 无 |
isLog |
| 是 | int | |
6.1.5 设置cpu核数
方法名 | setCoreConfigure | |||
说明 | 根据开发板类型,设置加速对CPU核数依赖,调整参数,提高性能 | |||
方法 | setCoreConfigure(BDFaceSDKCommon.BDFaceCoreRunMode runMode, int coreNum) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
runMode | 推荐使用0, 1, 3;如果有需要绑核的话,用0和1;如果不需要绑核,系统自动调度的话,用3 | 是 | BDFaceCoreRunMode | 无 |
coreNum | cpu 核数,选择线程数,建议不超过2 | 是 | int | |
6.1.6 获取deviceId设备指纹
方法名 | getDeviceId | |||
说明 | 用于官网离线激活生成授权文件 | |||
方法 | getDeviceId(Context context) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
Context | 上下文 | 是 | Context | String 指纹信息 |
6.2 FaceSdkController对象
该类封装了对人脸全流程1:N 1:1识别比对 、视频流和图片人脸特征提取、模型初始化、静默激活功能
构造方法 | 参数 | 参数说明 | 说明 |
FaceSdkController() | 无 | 创建一个FaceSdkController()实例 | |
FaceSdkController( BDFaceSDKCommon.BDFaceCoreRunMode runMode, int coreNum) | BDFaceCoreRunMode | cpu配置参数 | |
coreNum cpu | 核数 建议最大设置为2 |
6.2.1 开启底层log日志
方法名 | setActiveLog | |||
说明 | 用于Debug时候输出Log详细信息 | |||
方法 | setActiveLog(boolean isLog) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
isLog | 日志启动变量 | 是 | boolean | 无 |
6.2.2 授权接口
方法名 | startAuth | |||
说明 | 成功激活一次后,下一次重新启动调用该接口会根据上一次使用激活接口从新静默激活 | |||
方法 | startAuth(Context context, SdkInitListener listener) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
context | 上下文 | 是 | Context | 无 |
listener | 激活状态回调接口 | 是 | SdkInitListener | |
6.2.3 模型初始化接口
方法名 | initModel | |||
说明 | 模型初始化 | |||
方法 | initModel( Context context, BDFaceSDKConfig config, BDFaceModelConfig bdFaceModelConfig, SdkInitListener listener) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
context | 上下文 | 是 | Context | 无 |
config | 检测功能配置类,具体可参考7.4 BDFaceSDKConfig 实体类 | 是 | BDFaceSDKConfig | |
bdFaceModelConfig | 模型初始化配置类,具体可参考7.5 BDFaceModelConfig 实体类 | 是 | BDFaceModelConfig | |
listener | 模型初始化结果回调 | 是 | SdkInitListener | |
6.2.4 人脸批量注册接口(全量更新)
方法名 | pushAllPersons | |||
说明 | 清空当前sdk缓存中的人脸,并从新导入 | |||
方法 | pushAllPersons(final List<T extends Feature> features) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
features | 人脸特征集 | 是 | Feature | 无 |
6.2.5 人脸批量注册接口
方法名 | pushPersons | |||
说明 | 批量添加人脸 | |||
方法 | pushPersons(final List<T extends Feature> features) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
features | 人脸特征集 | 是 | Feature | 无 |
6.2.6 单个特征注册接口
方法名 | pushPerson | |||
说明 | 单个人脸特征注册到缓存 | |||
方法 | pushPerson(int id, byte[] feature) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
id | 人脸唯一标识,不可与缓存和数据库中其他id相同 | 是 | Int | 无 |
feature | 人脸特征 | 是 | byte[] | 无 |
6.2.7 单个特征删除接口
方法名 | delFeature | |||
说明 | 将缓存中的指定特征删除 | |||
方法 | delFeature(int id) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
id | 人脸唯一标识 | 是 | Int | 无 |
6.2.8 特征全量删除接口
方法名 | featureClean | |||
说明 | 删除缓存中所有特征 | |||
方法 | featureClean() | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
无 | 无 | |||
6.2.9 获取缓存中特征数量
方法名 | getUserNum | |||
说明 | 删除缓存中所有特征 | |||
方法 | getUserNum() | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
无 | Int 返回人脸特征数量 | |||
6.2.10 人脸图片裁剪接口
方法名 | getCopeFace | |||
说明 | 根据检测到的人脸信息裁剪出面部图片 | |||
方法 | getCopeFace(Bitmap bitmap, float[] landmarks, float enlargeRatio) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
bitmap | 图片参数 | 是 | Bitmap | BDFaceImageInstance |
landmarks | 人脸关键点, | 是 | float[] | |
enlargeRatio | 面部外扩比例 | 是 | float | |
6.2.11 人脸识别接口
方法名 | onDetectCheck | |||
说明 | 根据检测传入的参数进行人脸全流程识别,该接口会拆分出两个线程,一个线程进行快速人脸检测用于ui层对人脸进行跟踪绘制(人脸框绘制),一个线程进行人脸识别接口部分的调用,流程为: 人脸快速检测-质量检测-活体检测-口罩检测-安全帽检测-注意力检测-特征提取-人脸1:N识别(1:1比对) | |||
方法 | onDetectCheck( BDFaceImageConfig bdFaceImageConfig, BDFaceImageConfig bdNirFaceImageConfig, BDFaceImageConfig bdDepthFaceImageConfig, BDFaceCheckConfig bdFaceCheckConfig, FaceDetectCallBack faceDetectCallBack) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
bdFaceImageConfig | Rgb视频流数据或图片参数 | 是 | BDFaceImageConfig | 无 |
bdNirFaceImageConfig | Nir视频流数据或图片参数 | 否 | BDFaceImageConfig | |
bdDepthFaceImageConfig | Depth视频流数据参数 | 否 | BDFaceImageConfig | |
bdFaceCheckConfig | 识别配置信息,可参考7.6 BDFaceCheckConfig实体类 | 是 | BDFaceCheckConfig | |
faceDetectCallBack | 识别结果回调,会返回List<LivenessModel>数组,LivenessModel为识别结果,可参考7.6 LivenessModel实体类 | 是 | FaceDetectCallBack | |
6.2.11 图片特征提取接口
方法名 | personDetect | |||
说明 | 单个图片特征提取接口,可与6.2.11 人脸识别接口进行同步操作,同时进行图片注册+人脸识别 | |||
方法 | personDetect(Bitmap bitmap,byte[] feature,BDFaceCheckConfig bdFaceCheckConfig) | |||
请求参数 | 说明 | 必须 | 类型 | 返回参数 |
bitmap | 人脸图片,建议面部清晰无遮挡,分辨率640*480以上 | 是 | Bitmap | FeatureData,可参考7.8 FeatureData实体类 |
feature | 人脸特征参数,通常传入512长度的byte数组 | 是 | byte[] | |
bdFaceCheckConfig | 特征提取配置参数,可通过配置该参数进行活体 质量检测,提升人脸效果 | 否 | BDFaceCheckConfig | |
7 SDK实体类说明
7.1 FaceInfo实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| faceID | Int | 人脸索引值,标记连续视频帧追踪中人脸ID |
| centerX | float | 人脸中心点x坐标 |
| centerY | float | 人脸中心点y坐标 |
| width | float | 人脸宽度 |
| height | float | 人脸高度 |
| angle | float | 人脸角度 |
| score | float | 人脸置信度 |
| landmarks | float[] | 人脸72个关键点数据(鼻子,眼镜,嘴巴,眉毛) |
| yaw | float | 人脸左右偏转角 |
| roll | float | 人脸平行平面内的头部旋转角 |
| pitch | float | 人脸上下偏转角 |
| bluriness | float | 人脸模糊度信息 |
| illum | int | 人脸光照信息 |
| occlusion | BDFaceOcclusion | 人脸遮挡信息,可参考[7.2 BDFaceOcclusion实体类](#_7.2 BDFaceOcclusion实体类) |
| age | Int | 人脸年龄 |
| gender | BDFaceGender | 性别 BDFACE_GENDER_FEMALE, // 女性 BDFACE_GENDER_MALE, // 男性 |
| bestImageScore | float | 最优人脸得分 |
7.2 BDFaceGazeInfo 实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| leftEyeConf | float | 左眼的置信度 |
| rightEyeConf | float | 右眼的置信度 |
| leftEyeGaze | BDFaceGazeDirection | 左眼的注意力信息 BDFACE_GACE_DIRECTION_UP, // 向上看 BDFACE_GACE_DIRECTION_DOWN, // 向下看 BDFACE_GACE_DIRECTION_RIGHT, // 向右看 BDFACE_GACE_DIRECTION_LEFT, // 向左看 BDFACE_GACE_DIRECTION_FRONT, // 向前看 BDFACE_GACE_DIRECTION_EYE_CLOSE, // 闭眼 |
| rightEyeGaze | BDFaceGazeDirection | 右眼的注意力信息 同上 |
7.3 Feature实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| id | int | 人员id |
| feature | byte[] | 人员特征,通常为512字节组数(3568专版SDK为1024字节) |
| score | float | 识别得分 |
7.4 BDFaceSDKConfig 实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| maxDetectNum | int | 设置单次检测几个人脸 |
| minFaceSize | int | 人脸最小值,小于此大小的人脸不予检测 |
| notRGBFaceThreshold | float | RGB人脸置信度,判断检测的人像不像人脸,默认0.5f,越小则会把类似人脸的物体识别为人脸,越大月准确 |
| notNIRFaceThreshold | float | NIR人脸置信度,判断检测的人像不像人脸,默认0.5f,越小则会把类似人脸的物体识别为人脸,越大月准确 |
| trackInterval | float | 设置人脸快速检测(人脸跟踪)全量检测间隔时间,人脸跟踪接口检测到人脸后第二次开始不会对图片全图检测,而是会根据上一次检测的人脸位置进行部分图片检测。 该接口可设置人脸跟踪接口检测多久后对图片进行全图人脸检测 |
7.5 BDFaceModelConfig 实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| isInitLive | boolean | 是否初始化活体模型(这里设置为false所有活体模型均不会初始化和使用) |
| isInitRGBLive | boolean | 是否初始化rgb活体模型 |
| isInitNIRLive | boolean | 是否初始化nir活体模型 |
| isInitDepthLive | boolean | 是否初始化depth活体模型 |
| isInitRGBMaskLive | boolean | 是否初始化rgb多音子模型(增加单目rgb活体识别效果,但会降低活体通过率并提升活体耗时) |
| isInitDetect | boolean | 是否初始化人脸检测模型(建议开启) |
| isInitTrack | boolean | 是否初始化快速人脸检测模型(设置为false无法进行人脸框跟踪绘制) |
| isInitCrop | boolean | 是否初始化抠图功能 |
| isInitFeature | boolean | 是否初始化特征提取模型 |
| isInitGaze | boolean | 是否初始化注意力模型 |
| isInitMouthMask | boolean | 是否初始化口罩检测模型 |
| isInitSafetyHat | boolean | 是否初始化安全帽检测模型 |
| isInitDark | boolean | 是否初始化暗光回复模型 |
| isMultiIdentify | boolean | 是否进行多人脸识别(开启后建议将BDFaceSDKConfig中的trackInterval参数改为0,可参考[7.5 BDFaceModelConfig 实体类](#_7.5 BDFaceModelConfig 实体类)) |
7.6 BDFaceCheckConfig实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| darkEnhance | boolean | 是否开启暗光恢复 |
| scoreThreshold | float | 识别阈值,0-1 |
| bestImage | boolean | 是否开启bestImage图像增强判断 |
| bdFaceDetectListConfig | BDFaceDetectListConf | 人脸检测设置,可设置是否开启 质量检测(人脸角度 模糊 光照 遮挡) 属性检测(性别 年龄 情绪) |
| bdQualityConfig | BDQualityConfig | 质量检测阈值设置,可参考[7.9 BDQualityConfig实体类](#_7.9 BDQualityConfig实体类) |
| bdLiveConfig | BDLiveConfig | 活体检测阈值设置,可参考[7.10 BDLiveConfig实体类](#_7.10 BDLiveConfig实体类) |
| bdFaceUtilityConfig | BDFaceUtilityConfig | 识别功能设置,可设置识别流程中使用那些流程,可参考[7.11 BDFaceUtilityConfig实体类](#_7.11 BDFaceUtilityConfig实体类) |
| secondFeature | byte[] | 人脸特征,如果需要1:1比对,传入该阈值,会与视频流人脸1:1比对 |
| cameraType | cameraType | Depth视频流配置,设置视频流型号 0:奥比中光海燕、大白(640*400) 1:奥比中光海燕Pro、Atlas(400*640) 2:奥比中光蝴蝶、Astra Pro\Pro S(640*480) 3:舜宇Seeker06 4:螳螂慧视天蝎P1 5:瑞识M720N 6:奥比中光Deeyea(结构光) 7:华捷艾米A100S、A200(结构光) 8:Pico DCAM710(ToF) |
7.7 LivenessModel实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| darkEnhance | boolean | 是否开启暗光恢复 |
| scoreThreshold | float | 识别阈值,0-1 |
| bestImage | boolean | 是否开启bestImage图像增强判断 |
| bdFaceDetectListConfig | BDFaceDetectListConf | 人脸检测设置,可设置是否开启 质量检测(人脸角度 模糊 光照 遮挡) 属性检测(性别 年龄 情绪) |
| bdQualityConfig | BDQualityConfig | 质量检测阈值设置,可参考[7.9 BDQualityConfig实体类](#_7.9 BDQualityConfig实体类) |
| bdLiveConfig | BDLiveConfig | 活体检测阈值设置,可参考[7.10 BDLiveConfig实体类](#_7.10 BDLiveConfig实体类) |
| bdFaceUtilityConfig | BDFaceUtilityConfig | 识别功能设置,可设置识别流程中使用那些流程,可参考[7.11 BDFaceUtilityConfig实体类](#_7.11 BDFaceUtilityConfig实体类) |
| secondFeature | byte[] | 人脸特征,如果需要1:1比对,传入该阈值,会与视频流人脸1:1比对 |
| cameraType | cameraType | Depth视频流配置,设置视频流型号 0:奥比中光海燕、大白(640*400) 1:奥比中光海燕Pro、Atlas(400*640) 2:奥比中光蝴蝶、Astra Pro\Pro S(640*480) 3:舜宇Seeker06 4:螳螂慧视天蝎P1 5:瑞识M720N 6:奥比中光Deeyea(结构光) 7:华捷艾米A100S、A200(结构光) 8:Pico DCAM710(ToF) |
7.8 FeatureData实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| code | Int | 错误码 0为成功,可参考9.3图片特征批量提取错误码说明 |
| msg | String | 提示 |
| faceInfo | FaceInfo | 人脸信息 |
7.9 BDQualityConfig实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| code | Int | 错误码 0为成功,可参考9.3图片特征批量提取错误码说明 |
| msg | String | 提示 |
| faceInfo | FaceInfo | 人脸信息 |
7.10 BDLiveConfig实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| rgbLiveScore | float | 错误码 0为成功,可参考9.3图片特征批量提取错误码说明 |
| nirLiveScore | float | 提示 |
| depthLiveScore | float | 人脸信息 |
7.11 BDFaceUtilityConfig实体类
| 变量 | 类型 | 说明 |
|---|---|---|
| checkMouthMask | boolean | 是否开启口罩检测 |
| isCheckHat | boolean | 是否开启安全帽检测 |
| isGaze | boolean | 是否开启注意力检测(睁闭眼) |
| isAttribute | boolean | 是否开启属性检测(年龄 情绪 性别) |
| isQuality | boolean | 是否开启质量检测(人脸角度 光照 遮挡 模糊) |
| isLive | boolean | 是否开启活体检测 |
| isTrack | boolean | 是否进行快速人脸检测(用于绘制人脸ui,人脸框快速跟踪) |
| featureCheckMode | int | 特征抽取模式 【不提取特征:1】; 【提取特征:2】; 【提取特征+1:N 检索:3】; 【提取特征+1:1 检索:4】 |
8 升级指导
注意:不同版本的人脸特征模型不能同步,大版本更新(小版本不需要,如8.1更新到8.2则不需要,7.0到8.0需要)需要删除人脸库,重新导入人脸
8.1 7.v – 8.v
(更新版本要刷新人脸底库,重新导入人脸)
同上所述,版本更新后,SDK对应的识别 活体 人脸检测等模型,需更新GlobaSet文件下的所有模型路径


8.0开始,识别对象从FaceFeature改为了FaceSearch,添加了单个人脸特征注册功能,请添加最新识别对象




其他版本SDK 升级8.1+,需替换模型以及SDK


替换后更新模型路径文件

8.2 8.v – 9.v
注意:
1、9.0版本sdk更新了设备指纹提取方式,获取的指纹会与9.0以前的历史版本sdk不同,已经激活过的设备使用9.0版本sdk需使用新的序列号从新激活
2、9.0版本的特征值和8.0等之前的版本也不同,不能和之前版本混用
删除8.0版本deteLibrary识别模块和sdk与模型

添加9.0版本sdk模型

9激活和模型初始化错误码说明
9.1在线和离线初始化错误码说明
| 错误码 | 描述 |
|---|---|
| 0 | 激活成功 |
| 1 | license未初始化 |
| 2 | license数据解密失败 |
| 3 | license格式错误 |
| 4 | key校验错误 |
| 5 | 算法id校验错误 |
| 6 | MD5校验失败 |
| 7 | 设备id校验失败 |
| 8 | 包名校验错误 |
| 9 | 过期时间不正确 |
| 10 | 功能未授权 |
| 11 | 授权过期 |
| 12 | 本地文件读取失败 |
| 13 | 远程数据拉取失败 |
| 14 | 本地时间校验失败 |
| 15 | 参数错误 |
| 16 | Key 错误 |
| 17 | 其他错误 |
| 30 | 本地无激活记录,需要先完成首次激活 |
| 1001 | 文件读取失败 |
| 1002 | 缓存清理失败 |
| 1003 | zip解析失败 |
| 1004 | zip文件读取失败 |
| 1005 | 没找到授权文件 |
| 1006 | context为空 |
| 1007 | devicesId为空 |
| 1008 | json异常 |
| 1009 | http请求异常 |
| 1010 | http数据异常 |
| 1011 | 网络链接异常 |
| 282000 | 服务端内部错误 |
| 216100 | 非法参数 |
| 216102 | 不支持的类型 |
| 216101 | 请求参数不足 |
| 290000 | 无操作权限 |
| 290001 | 序列号生成错误 |
| 290002 | 序列号错误 |
| 290003 | 设备标识错误 |
| 290004 | 序列号被激活 |
| 290005 | license生成失败 |
| 290006 | license过期时间设置错误 |
| 290007 | license更新失败 |
| 290008 | license下载次数超过上限 |
| 290009 | license被其他设备绑定 |
| 290010 | license设备绑定失败 |
| 290011 | license查询失败 |
9.2模型初始化错误码说明
| 错误码 | 描述 |
|---|---|
| 0 | 激活成功 |
| 1 | context 为null |
| -1 | 非法的参数 |
| -2 | 内存分配失败 |
| -3 | 实例对象为空 |
| -4 | 模型内容为空 |
| -5 | 不支持的能力类型 |
| -6 | 不支持预测类型 |
| -7 | 预测库对象创建失败 |
| -8 | 预测库初始化失败 |
| -9 | 图像数据为空 |
| -10 | 人脸能力初始化失败 |
| -11 | 能力未加载 |
| -12 | 人脸能力已加载 |
| -13 | 未授权 |
| -14 | 人脸能力运行异常 |
| -15 | 不支持的图像类型 |
| -16 | 图像转换失败 |
9.3图片特征提取错误码说明
| 错误码 | 描述 |
|---|---|
| -1 | 特征提取失败 |
| 1 | 图片格式不符合要求 |
| 2 | bitmap为空 |
| 4 | 人脸角度不通过 |
| 5 | 图像模糊 |
| 6 | 人脸遮挡 |
| 7 | 人脸曝光 |
| 8 | 未检测到人脸 |
| 9 | 检测到多个人脸 |
| 10 | 抠图失败 |
| 128 | 特征提取成功 |
评价此篇文章
