Android-SDK
概述
- 百度人脸离线识别SDK Android版本,主要支持RK3288、3399芯片平台,且已验证支持高通450/8953、MTK6763/8788(可登陆百度智能云控制台console后台获取SDK部署包)
- 针对其他安卓平台的芯片,例如RK3568/3566、晶晨S905D3(CPU/NPU)、全志A63/T509,为了保障每个芯片平台上算法效果最优,都有专项适配调优的SDK版本,请线下联系商务咨询获取专版SDK。
版本日志
版本 | 日期 | 更新说明 |
---|---|---|
V8.5.0 | 2024.06.07 | 1、修改demo UI,去掉部分模块减少demo工程复杂度,新增1:1比对示例; 2、新增调用云端特征提取接口示例代码; 3、升级支持安卓13、14高阶版本; 4、人证核验增加图片1:1比较功能; 5、优化部分已知问题 |
V8.2.0 | 2024.06.07 | 1、优化了人脸特征提取模型; 2、考勤模块下新增了多人脸识别功能并支持UI横屏识别 |
V8.1.2 | 2023.03.02 | 1、接入动态底库策略,解决由于底库质量差带来的误识别问题; 2、优化口罩检测、安全帽检测模型; 3、添加活体多帧策略,配合阈值设备同解决多镜头泛化问题; 4、添加加密芯片授权支持,软硬授权并线支持; 5、支持多款3D结构光模组兼容适配 |
v8.1 | 2022.11.18 | 1、修复日志信息错误bug; 2、去除应用层的网络判断逻辑,解决每次设备断网重启重新激活的问题; 3、添加安卓11系统兼容性配置 |
v8.0 | 2022.04.20 | 1、检测、活体、识别更新至8.0最新算法版本; 2、解决旧版本偶发崩溃问题,支持边注册、边识别; 3、隐藏情绪识别功能,优化Demo中人脸追踪框的效果 |
v7.0 | 2021.08.24 | 1、更新人脸检测模型,解决部分场景下非人脸误检测的问题; 2、全面更新多模态活体检测模型,提升对新材质活体攻击道具的防御能力; 3、更新人脸识别模型,实现单模型同时支持戴口罩人脸识别和外国人识别; 4、增加业务层二次开发接口,降低SDK集成难度,保障端到端算法效果; 5、完善示例工程功能,优化示例工程交互; 6、修复部分已知Bug |
v6.0 | 2021.02.26 | 1、更新人脸检测模型,提升在强光、暗光、逆光、阴阳光等复杂光线场景下人脸检测的召回率; 2、更新RGB、NIR和Depth三种模态的活体检测模型,提升在复杂光线场景下真人活体检测通过率,同步提升高清2D和高质量3D道具的活体攻击防御效果; 3、更新人脸识别模型,提升复杂光线场景下人脸识别的准确率; 4、新增暗光恢复功能,对暗光场景下的图片进行亮度提升,提高检测和识别的准确率; 5、区分『通用版』和『口罩版』,通用版适用于非戴口罩场景下的人脸识别,口罩版适用于在戴口罩场景下完成人脸识别; 6、修复部分已知Bug |
v5.1 | 2021.01.01 | 1、新增『金融活检』示例工程,该示例工程集成了多帧检测等活体检测策略,提升活体检测准确率; 2、新增『RGB+NIR』混合模态人脸识别示例工程,解决暗光人脸识别问题,提升弱光人脸识别准确率; 3、优化示例工程的功能和代码结构,更有利于直接使用和进行二次开发; 4、修复部分已知Bug |
v5.0 | 2020.10.16 | 1、升级了了人脸检测模型,重点优化了复杂光线场景下的人脸检测能力; 2、升级了RGB、NIR和Depth三种模态的活体检测模型,优化后2D照片攻击防御能力和复杂光线场景下的真人活体检测能力提升明显; 3、升级了最新的人脸特征抽取与比对模型(人脸识别模型),升级后识别模型对老人、儿童等极端年龄群体的泛化行提升明显; 4、在RK3288主板上,端到端全流程耗时缩短到<300ms; 5、增加了最优图像帧功能,提升识别准确率; 6、增加多线程的示例工程,支持边注册、边识别和多模态同时检测功能; 7、解决了部分已知Bug。 注:由于该版本的SDK更换了特征抽取与比对的模型,因此从旧版本升级到该版本的用户需要重新注册人脸底库(刷库) |
v4.2.1 | 2020.07.07 | 1、增加场景化示例工程,针对「闸机通行」、「考勤打卡」、「金融支付」、「属性检测」、「人证核验」、「驾驶员行为分析」和「注意力检测」7大应用场景提供定制化的交互流程和交互界面; 2、优化示例工程中的注册激活功能,提供快速、便捷的「在线激活」、「离线激活」和「批量激活」功能; 3、优化示例工程中人脸库管理功能和设置功能; 4、解决部分已知Bug 注:4.2.1版本主要针对示例工程进行了全面重构和优化,功能和接口与4.1.1版本保持一致 |
v4.1.1 | 2020.03.12 | 1、新增注意力检测模型和接口; 2、新增驾驶行为分析模型和接口; 3、优化口罩检测模型; 4、解决部分已知Bug 注:若使用4.1.1版本中注意力检测功能,请参考章节1.6的内容;若使用4.1.1版本中驾驶员行为分析功能,请参考章节1.7的内容 |
v4.0.0 | 2020.02.25 | 1、新增NIR检测、识别模态; 2、新增RGBD识别模态; 3、优化检测、对齐、活体、证件照/生活照识别模型; 4、优化端到端全流程耗时; 5、新增人脸是否戴口罩分类能力和接口; 6、新增抠图能力和接口 7、解决部分已知Bug 注:若使用4.0版本中口罩检测能力,请务必参考章节1.11.1的内容 |
v3.2.0 | 2019.12.10 | 1、底层支持多线程; 2、增加睁闭眼、张闭嘴模型; 3、优化NIR界面适配效果; 4、修复部分已知Bug 注:由3.0/3.1版本升级到3.2的客户,请按照章节1.11.2的方案进行初始化修改 |
v3.1.0 | 2019.08.13 | 1、优化人脸检测性能; 2、新增离线人脸属性模型,包括年龄、种族、性别、7种细分情绪和3种分类情绪、佩戴眼镜等属性 |
v3.0.0 | 2019.07.25 | 1、新版检测模型,人脸检测及跟踪速度大幅提升; 2、新版RGB、NIR、Depth活体模型,优化活体检测的有效人脸大小尺寸范围,活体通过率大幅提升。增加更多攻击类型样本数据,非活体拒绝率大幅提升; 3、新版生活照模型,特征抽取速度大幅提升; 4、新版接口实现,功能逻辑精简优化,更易集成; 5、新版示例工程,优化功能逻辑,新增大量自定义设置项,效果调节更简单; 6、新增「按应用批量鉴权」,应用初始化时自动联网激活。 |
v2.0.3 | 2019.06.14 | 1、更新硬件指纹获取模块,优化特殊环境下指纹变更的问题 |
v2.0.2 | 2019.04.01 | 1、全新人脸检测模型,检测追踪更流畅; 2、全新证件照模型:体积更小,速度更快 ; 3、部分接口细节优化 |
v2.0.1 | 2019.03.14 | 1、接口设计优化; 2、增加几款结构光镜头支持; 3、已知bug修复 |
v2.0.0 | 2019.01.10 | 1、优化生活照模型精度及速度 2、优化检测模型及策略 3、优化接口设计 4、优化活体检测速度 |
v1.1.0 | 2018.09.03 | 1、增加离线证件照特征抽取模型,可有效处理芯片照、证件照比对需求 2、增加离线人脸属性模型,支持性别、年龄等属性分析 3、增加多线程支持 4、增加离线激活支持,可导入授权文件无网激活 5、增加对奥比中光Astra Pro深度图镜头模组支持 6、增加对华捷艾米深度镜头模组支持 7、其他细节优化及已知bug修复 |
v1.0.1 | 2018.08.03 | 1、修复设备指纹发生变化bug 2、替换近红外活体模型,优化效果 3、修复批量注册人脸到人脸库,失败问题 4、修复注册、图片人脸检测、视频返回图片抽取特征失败,经常出现检测不到人脸问题 |
v1.0.0 | 2018.06.29 | 初版,包括离线人脸采集、离线活体检测、离线对比识别、离线人脸库管理等功能 |
此技术文档主要是针对Android 8.0版本SDK进行说明,从接口文档和示例工程DEMO两个角度详尽地阐述了8.0版本的强大功能及使用方法。
1、SDK示例工程说明
1.1 识别流程图

1.2 工程及接口说明
1.2.1 工程目录图
(1)attrbutelibrary 属性模块,检测年龄,安全帽佩戴,戴口罩等
(2)AuthLibrary 权限模块
(3)datalibrary 数据库模块
(4)faceaar sdk jar包
(5)facelibrary sdk jar包
(6)face-sdk-library 应用层功能封装类
(7)gatelibrary 视频流1:n和m:n识别(闸机,考勤,支付模式)
(8)identifylibrary 人脸比对模块,图片与图片比对,视频流与图片
(9)registerlibrary 人脸注册和人脸管理模块
1.2.2 faceLibrary核心库
所有识别逻辑都要依赖于此库,且其他model逻辑都是基于此库中的接口进行的应用层封装
其中lib为算法库,assets中为检测识别模型包含:
1.align 对齐模型
2.attribute 属性模型
3.best_image 最优人脸模型
4.blur 质量模糊模型
5.detect 人脸检测模型
6.driver_monitor 驾驶行为模型
7.eyes_close 眼睛闭合模型
8.feature 识别模型
9.gaze 注意力模型
10. mouth_close 嘴巴闭合模型
11. mouth_mask 口罩模型
12. occlusion 遮挡模型
13. silent_live 活检模型
1.2.3 app model
此model包含StartActivity启动页,sdk在线、离线、批量激活接口和激活方式和Home首页
SDK激活接口:
1.2.4 功能页面
(1)gatelibrary 1:n模块(闸机,考勤,支付)
(2)identifylibrary 1:1模块 (人证核验)
(3)registerlibrary 人脸注册和人脸管理模块
1.2.5 face-sdk-library high-level api 算法接口封装
face-sdk-library 内部集成了识别流程,其他模块继承 faceLibrary 只需要调取一个方法即可完成整体识别流程,目前只集成了活体检测,人脸特征提取,人脸比对,人脸属性分析,驾驶员行为分析 6 种接口方式(且目前仅支持单线程)

1.3 Demo 使用说明
1.3.1 获取Demo
进入网站进行下载https://console.bce.baidu.com/ai/#/ai/face/offline/index


1.3.2 激活
安装成功后参考上面激活方式进行设备激活,界面如下
1.3.3 配置测试
进入首页后,点击右上角按钮进入设置页面
选择镜头设置, 将视频流回显和检测角度调整到对应合适位置
回到首页,进入右上角设置,点击注册注册人脸,进入闸机模式,测试识别效果
1.4 多人脸识别
demo中其实已经封装了多人脸识别方法,在代码中将多人脸识别开关打开
设置sdk检测参数设置为全图检测
打开考勤模式(目前只有考勤模式会显示所有识别到的人脸,其他模块只会显示所有人脸的人脸框,用户数据只展示数组第一个)
1.5 自定义数据库db文件路径
demo会将注册的用户信息默认储存在data/data/包名/database 数据库的默认路径下
放开demo中的这部分代码即可
1.6 激活失败错误码
错误码 | 错误描述 | 错误码 | 错误描述 |
---|---|---|---|
1 | license未初始化 | 1008 | json异常 |
2 | license数据解密失败 | 1009 | http请求异常 |
3 | license格式错误 | 1010 | http数据异常 |
4 | key校验错误 | 1011 | 网络链接异常 |
5 | 算法id校验错误 | 28200 | 未知错误 |
6 | MD5校验失败 | 216100 | 非法参数 |
7 | 设备id校验失败 | 216102 | 不支持的类型 |
8 | 包名校验错误 | 216101 | 请求参数不足 |
9 | 过期时间不正确 | 290000 | 无操作权限 |
10 | 功能未授权 | 290001 | 序列号生成错误 |
11 | 授权过期 | 290002 | 序列号错误 |
12 | 本地文件读取失败 | 290003 | 设备标识错误 |
13 | 远程数据拉取失败 | 290004 | 序列号被激活 |
14 | 本地时间校验失败 | 290005 | license生成失败 |
1001 | 文件读取失败 | 290006 | license过期时间设置错误,必须比当前过期时间短 |
1002 | 缓存清理失败 | 290007 | license更新失败 |
1003 | zip解析失败 | 290008 | license下载次数超过上限 |
1004 | zip文件读取失败 | 290009 | license被其他设备绑定 |
1005 | 没找到授权文件 | 290010 | license设备绑定失败 |
1006 | context为空 | 290011 | license查询失败 |
1007 | devicesId为空 |
1.7 在线特征值提取
请参考demo中的OnLineFeatureManager类,进行在线特征值提取。
1.8 1:n 识别功能-简单集成方法使用说明:(以闸机模式为例)
1.8.1 将dataLibrary和faceLirbrary引入到项目中
1.8.2 将gateLibrary(1:N模块)中的FaceUtils覆盖到项目中
1.8.3 进入识别前,先进行数据库初始化和模型初始化
1.8.4 更新数据库的人脸信息到sdk内存(首次使用没有人脸库数据,可以参考11 注册人脸库模块说明 添加人脸信息)
1.8.5 注册识别参数
1.8.6 开启摄像头,调用识别接口
1.9 1:1 识别功能-简单集成方法使用说明
1.9.1 将人证核验FaceUtils覆盖到项目中
1.9.2 提取图片人脸特征
1.9.3 进行1:1得分展示判断
1.10 属性模式说明
属性模式,主要包括口罩、眼镜、年龄与性别检测
1.11 注册人脸库模块说明
1.11.1视频流检测人脸并注册
1.11.1.1人脸注册
有2种镜头模式选择注册(注意人脸注册镜头模式以考勤,闸机,支付,认证核验模块其中最后一个设置的镜头模式应用于人脸注册,且demo注册阈值设置为强偶合,比如闸机、考勤模式阈值在程序中修改后注册模式也会对应修改)
1.11.1.2检测部分
1.11.1.3人脸范围、质量、活体判断
1.11.1.4提取完毕的特征人脸信息,注册到本地数据库
注:
1.demo用户名为必填项,支持英文、汉字、数字和下划线。
2.注册成功后的图片命名和格式为设置名.jpg,保存在sd卡下的Success-Import文件夹下,用于人脸库的图片显示。
3.demo使用安卓原生数据库,开发者可根据自己的业务需求场景使用其他安卓开源数据库,添加保存人脸信息。
1.11.2 图片bitmap人脸注册
1.12 特征提取
1.13 识别流程方法和阈值说明
FaceSDKManager.class
每个模块都有相应的FaceSDKManager.class。
1.13.1 模型初始化
1.13.2 将人脸注册数据放进sdk内存
1.13.3 识别流程调用
人脸数据
1.13.4 最优人脸
1.13.5 质量检测
1.13.6 质量检测阈值设置
1.13.7 活体检测
1.13.8 特征提取
1.13.9 1:n接口
1.13.10 1:1接口
1.14 升级指导
注意(更新版本要刷新人脸底库,重新导入人脸)
1.14.1 3.v–4.v
- libs 下所有 jar 和文件替换成 4.0 的
- assets 下所有模型文件替换成 4.0 的, GlobalSet 模型路径要对应到 assets 下相应的文件夹
1.14.2 4.v–7.v
(更新版本要刷新人脸底库,重新导入人脸)
4.0到7.0升级同理,替换sdk与模型路径文件
调整模型加载部分接口逻辑
1.14.3 7.v–8.v
(更新版本要刷新人脸底库,重新导入人脸)
添加最新识别对象
1.15 常见问题
1.15.1 误识别
误识别情况下请保留误识别时的识别图片与误识别底图,以便方便排查,保存方式请参考SaveImageManager文件:
误识别底图和视频流图片获取成功后,可使用demo中的人证核验模块,对比误识别图片得分是否过高
如果得分相似都超过阈值(默认0.8)则说明误识别人员与识别人员五官相似度过高,可修改人脸注册底图解决该问题。
如果相似度不高,说明sdk内存混乱导致,这种情况大概率为多线程边导入边识别造成的,则在人脸注册和识别接口加锁:
1.15.2 识别得分低
识别得分低可先排查识别接口的isprcent参数是否为true,为true情况下可适当降低识别阈值或更换识别底图
2、接口说明
2.1 FaceAuth鉴权接口
2.1.1 鉴权-在线鉴权
说明:用户通过申请授权码,在线授权,激活设备
void initLicenseOnLine(final Context context, final String licenseKey, final AuthCallback callback)
参数名 | 含义 |
---|---|
context | 当前上下文 |
licenseKey | AIPE 鉴权码 |
callback | 鉴权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 response 结果信息 |
2.1.2 鉴权-离线授权
说明:用户申请鉴权文件,放在SD 卡下,点击按钮直接鉴权
void initLicenseOffLine(final Context context, final Callback callback)
参数名 | 含义 |
---|---|
context | 当前上下文 |
callback | 鉴权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 response 结果信息 |
2.1.3 鉴权-在线按应用批量授权
说明:用户通过申请在线licenseID,不需要输入任何信息,直接网络请求获取鉴权文件
void initLicenseBatchLine(final Context context, final String licenseKey, final Callback callback)
参数名 | 含义 |
---|---|
context | 当前上下文 |
licenseKey | 鉴权文件Key |
callback | 鉴权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 response 结果信息 |
2.1.4 开启底层Log输出
说明:用于Debug时候输出Log详细信息
void setActiveLog(BDFaceSDKCommon.BDFaceLogInfo logInfo, int isLog)
参数名 | 含义 |
---|---|
BDFaceLogInfo | 底层log 打印 BDFACE_LOG_ERROR_MESSAGE // 打印输出错误日志 BDFACE_LOG_VALUE_MESSAGE // 打印输出值日志 BDFACE_LOG_TYPE_PERF // 打印性能日志 BDFACE_LOG_TYPE_ALL // 打印全部日志 BDFACE_LOG_TYPE_DEBUG // 打印debug日志 |
isLog | 0:不输出日志;1:输出日志 |
2.1.5 设置核数
说明:根据开发板类型,设置加速对CPU核数依赖,调整参数,提高性能
setCoreConfigure(BDFaceSDKCommon.BDFaceCoreRunMode runMode, int coreNum)
参数名 | 含义 |
---|---|
runMode | 推荐使用0, 1, 3;如果有需要绑核的话,用0和1;如果不需要绑核,系统自动调度的话,用3 BDFACE_LITE_POWER_HIGH=0, 绑定大核运行模式。如果ARM CPU支持big.LITTLE,则优先使用并绑定Big cluster。如果设置的线程数大于大核数量,则会将线程数自动缩放到大核数量。如果系统不存在大核或者在一些手机的低电量情况下会出现绑核失败,如果失败则进入不绑核模式。 BDFACE_LITE_POWER_LOW=1,绑定小核运行模式。如果ARM CPU支持big.LITTLE,则优先使用并绑定Little cluster。如果设置的线程数大于小核数量,则会将线程数自动缩放到小核数量。如果找不到小核,则自动进入不绑核模式。 BDFACE_LITE_POWER_FULL=2,大小核混用模式。线程数可以大于大核数量。当线程数大于核心数量时,则会自动将线程数缩放到核心数量。 BDFACE_LITE_POWER_NO_BIND=3,不绑核运行模式(推荐)。系统根据负载自动调度任务到空闲的CPU核心上。 BDFACE_LITE_POWER_RAND_HIGH=4,轮流绑定大核模式。如果Big cluster有多个核心,则每预测10次后切换绑定到下一个核心。 BDFACE_LITE_POWER_RAND_LOW=5,轮流绑定小核模式。如果Little cluster有多个核心,则每预测10次后切换绑定到下一个核心。 |
coreNum | 根据如下命令,查看cpu 核数,选择线程数 adb shell cat /proc/cpuinfo |
2.1.6 Code返回值
说明: 根据code返回值来判断返回错误信息
参数名 | 含义 |
---|---|
code | code == 0 成功; code == 1 context 为null; code == -1 非法的参数; code == -2 内存分配失败; code == -3 实例对象为空; code == -4 模型内容为空;code == -5 不支持的能力类型; code == -6 不支持预测类型;code == -7 预测库对象创建失败; code == -8 预测库初始化失败;code == -9 图像数据为空; code == -10 人脸能力初始化失败;code == -11 能力未加载 ; code == -12 人脸能力已加载;code == -13 未授权; code == -14 人脸能力运行异常 ;code == -15 不支持的图像类型; code == -16 图像转换失败; |
2.2 FaceDetect 检测接口
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceDetect()
// 有参构造调用(执行自己创建的instance )
public FaceDetect(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.2.1 可见光检测对齐模型加载
说明:检测对齐模型加载,支持可见光模型
void initModel(final Context context, final String visModel,final String nirModel,final String alignModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
visModel | 可见光图片检测模型 |
nirModel | 红外图片检测模型(非必要参数,可以为空) |
alignModel | 对齐类型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.2.2 检测对齐模型加载
说明:检测对齐模型加载,支持可见光、近红外检测模型
public void initModel(final Context context,final String detectModel,final String alignModel,final BDFaceSDKCommon.DetectType detectType,final BDFaceSDKCommon.AlignType alignType,final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
detectModel | 检测模型 |
alignModel | 对齐模型 |
detectType | 检测类型 DETECT_VIS 为可见光; DETECT_NIR为近红外 |
alignType | 对齐类型 BDFACE_ALIGN_TYPE_RGB_ACCURATE 为可见光对齐类型; BDFACE_ALIGN_TYPE_NIR_ACCURATE 为 近红外对齐类型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.2.3 质量检测模型加载
说明:质量检测模型加载,判断人脸遮挡信息,光照信息,模糊信息,模型包含模糊模型,遮挡信息,作用于质量检测接口
void initQuality(final Context context, final String blurModel, final String occlurModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
blurModel | 模糊检测模型 |
occlurModel | 遮挡检测模型 |
callback | 鉴权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 response 结果信息 |
2.2.4 属性情绪模型加载
说明:人脸属性(年龄,性别,戴眼镜等),情绪(喜怒哀乐)模型初始化
void initAttrbute(final Context context, final String atttibuteModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
atttibuteModel | 属性检测模型 |
emotionModel | 7种情绪检测模型 |
callback | 鉴权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 response 结果信息 |
2.2.5 眼睛闭合,嘴巴闭合模型加载
说明:人脸眼睛闭合,嘴巴闭合模型初始化
void initFaceClose(final Context context,
final String eyecloseModel,final String mouthcloseModel,final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
eyecloseModel | 眼睛闭合检测模型 |
mouthcloseModel | 嘴巴闭合检测模型 |
callback | 鉴权结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.2.6 最优人脸模型加载
说明:最优人脸模型初始化
void initBestImage(final Context context,final String bestModel,final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
bestModel | 最优人脸模型地址 |
callback | 鉴权结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.2.7 配置信息加载
说明:检测最小人脸,是否开启内部质量检测,检测或者追踪时间间隔等配置(只适用于3.2及以下版本的detect、track接口)
void loadConfig(BDFaceSDKConfig config)
参数名 | 含义 |
---|---|
config | 参数配置实体 |
2.2.8 人脸框检测
说明:人脸框检测,每一帧图片都会检测,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。
2.2.8.1 根据图片进行检测
FaceInfo[] detect(BDFaceSDKCommon.DetectType type,BDFaceImageInstance imageInstance)
参数名 | 含义 |
---|---|
detectType | 检测类型 |
imageInstance | 图片数据信息 |
FaceInfo[] | 返回参数(人脸参数信息) |
2.2.8.2 根据传入的人脸框信息进行检测
说明:可灵活配置的人脸检测接口,使用输入的faceInfos通过配置bdFaceDetectListConfig可以控制是否进行以下能力的预测:人脸检测,关键点提取,头部姿态角,光照,模糊,属性,情绪,闭眼,闭嘴。输出返回值为预测后的faceInfos,可作用于后续活体,特征抽取入参。(faceInfos[]可配置为空,即为第一帧检测)
FaceInfo[] detect(BDFaceSDKCommon.DetectType type,BDFaceSDKCommon.AlignType alignType, BDFaceImageInstance imageInstance,FaceInfo[] faceInfos,BDFaceDetectListConf bdFaceDetectListConfig)
参数名 | 含义 |
---|---|
detectType | 检测类型 |
alignType | 对齐类型 |
imageInstance | 图片数据信息 |
faceInfos[] | 人脸框数据(可以通过人脸追踪能力获取人脸框) |
bdFaceDetectListConfig | 功能开关 |
FaceInfo[] | 返回参数(人脸参数信息) |
2.2.9 人脸跟踪-多人脸检测(接口只支持RGB追踪)
说明:视频人脸跟踪检测,追踪图片中多个人脸信息,通过参数 num
配置,接口包含检测和跟踪功能,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。
该接口只支持RGB检测和对齐;
FaceInfo[] track(DetectType detectType, BDFaceImageInstance imageInstance)
参数名 | 含义 |
---|---|
detectType | 检测类型(DETECT_VIS ) |
imageInstance | 图片数据信息 |
FaceInfo[] | 返回参数(人脸参数信息) |
2.2.10 人脸跟踪-多人脸检测(接口只支持RGB跟踪)
说明:视频人脸跟踪检测,追踪图片中多个人脸信息,通过参数 num
配置,接口包含检测和跟踪功能,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。
FaceInfo[] track(BDFaceSDKCommon.DetectType detectType, BDFaceSDKCommon.AlignType alignType,BDFaceImageInstance imageInstance)
参数名 | 含义 |
---|---|
detectType | 检测类型 |
alignType | 对齐类型 |
imageInstance | 图片数据信息 |
FaceInfo[] | 返回参数(人脸参数信息) |
2.2.11 人脸抠图
说明:根据人脸检测结果扣图,扣图结果为矫正之后的人脸信息
public BDFaceImageInstance cropFace(BDFaceImageInstance imageInstance, float[] landmark)
参数名 | 含义 |
---|---|
imageInstance | 图片数据信息 |
landmark | 检测后产出数据 |
扣图图像信息,包含宽,高,图片类型,图片数据 |
返回值:扣图图像信息,包含宽,高,图片类型,图片数据
BDFaceImageInstance
2.2.12 检测模型卸载
void uninitModel()
2.2.13 口罩模型加载
说明:检测人脸的口罩。
void initMouthMask(final Context context, final String mouthMaskModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
mouthMaskModel | 口罩检测模型 |
callback | 鉴权结果 void onResponse(int code, String response) code:请参照此文档 1.1.6 code返回值 response 结果信息 |
2.3 FaceLive 活体接口
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceLive()
// 有参构造调用(执行自己创建的instance )
public FaceLive(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.3.1 活体模型加载
说明:静默活体检测模型初始化,可见光活体模型,深度活体,近红外活体模型初始化
void initModel(final Context context, final String visModel, final String vis2dmaskModel, final String visHandModel, final String visReflectionModel, final String nirModel, final String depthModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
visModel | 可见光图片活体模型 |
vis2dmaskModel | 优化rgb活体攻破模型,可以为空 |
visHandModel | 同上 |
visReflectionModel | 同上 |
depthModel | 深度图片活体模型 |
nirModel | 红外图片活体模型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.3.2 人脸静默活体检测
说明:静默活体分值检测,返回0-1结果,建议超过0.9 为活体
public float silentLive(LiveType type, BDFaceImageInstance bdFaceImageInstance, float[] landmarks)
参数名 | 含义 |
---|---|
type | BDFACE_SILENT_LIVE_TYPE_RGB 可见光图像静默活体检测 BDFACE_SILENT_LIVE_TYPE_NIR 红外图像静默活体检测 BDFACE_SILENT_LIVE_TYPE_DEPTH 深度图像静默活体检测 |
bdFaceImageInstance | 图像对象 |
landmarks | 检查后landmark |
2.3.3 活体模型卸载
说明:静默活体模型卸载
void uninitModel()
2.4 FaceFeature 特征抽取接口
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceFeature()
// 有参构造调用(执行自己创建的instance )
public FaceFeature(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.4.1 特征模型加载
说明:离线特征获取模型加载,目前支持可见光模型,近红外检测模型(非必要参数,可以为空),证件照模型;用户根据自己场景,选择相应场景模型
2.4.1.1 旧版本模型加载(3.2及以下版本)
说明:只能使用证件照,生活照初始化
initModel(final Context context,final String idPhotoModel,final String visModel,final String nirModel,final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
idPhotoModel | 证件照图片模型 |
visModel | 可见光图片模型 |
nirModel | 红外图片模型(非必要参数,可以为空) |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.4.1.2 新版本模型加载(4.0及以上版本)
initModel(final Context context,final String idPhotoModel,final String visModel,final String nirModel,final String rgbdModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
idPhotoModel | 证件照图片模型 |
visModel | 可见光图片模型 |
nirModel | 红外图片模型 |
rgbdModel | RGBD图片模型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.4.2 特征提取
说明:离线特征提取接口,通过featureType 提取不同图片特征数据,函数返回特征个数,特征存储在feature 参数中
2.4.2.1 RGB图片(生活照、证件照)、NIR图片特征提取
说明:该接口支持RGB证件照、RGB生活照、NIR图片的识别,仅对一张图片进行特征提取
float feature(FeatureType featureType, BDFaceImageInstance imageInstance,float[] landmarks, byte[] feature)
参数名 | 含义 |
---|---|
featureType | BDFACE_FEATURE_TYPE_LIVE_PHOTO 生活照 BDFACE_FEATURE_TYPE_ID_PHOTO 证件照 BDFACE_FEATURE_TYPE_NIR 红外 |
imageInstance | 图像信息 |
landmarks | 检测后产出的数据 |
feature | 出参:人脸特征 feature 数组,默认初始化512空字节 |
float | 返回128个特征数据 |
2.4.2.2 深度图片特征抽取(3.2及以下版本不支持)
说明:该接口仅支持RGBD识别,需要对两张图片进行特征提取(RGB图片、Depth图片)
float featureRGBD(FeatureType featureType, BDFaceImageInstance imageInstance,BDFaceImageInstance imageInstance_depth, float[] landmarks, byte[] feature)
参数名 | 含义 |
---|---|
featureType | BDFACE_FEATURE_TYPE_LIVE_PHOTO //生活照 BDFACE_FEATURE_TYPE_ID_PHOTO // 证件照 BDFACE_FEATURE_TYPE_NIR // 红外 BDFACE_FEATURE_TYPE_RGBD // RGBD特征提取 |
imageInstance | RGB图像信息 |
imageInstance | Depth图像信息 |
landmarks | 检测后产出的数据 |
feature | 出参:人脸特征 feature 数组,默认初始化512空字节 |
float | 返回256个特征数据 |
2.4.3 特征比对
说明:离线特征比对结果,分值为0--100 之间
float compare(FeatureType featureType, byte[] feature1, byte[] feature2, boolean isPercent)
参数名 | 含义 |
---|---|
featureType | FeatureType.FEATURE_VIS生活照 FeatureType.FEATURE_ID_PHOTO证件照照 |
feature1 | 特征1 |
feature2 | 特征2 |
isPercent | 控制参数:true返回0~100数值;false 返回0~1 |
float | 比对结果 |
2.4.4 1:N特征设置
说明:特征集合预加载接口,继承Feature,必须初始化id 和 feature 字段,用于1:N 内部实现和数据返回。
public int pushPersonById(int pointID, byte[] feature)
参数名 | 含义 |
---|---|
pointID | 人员ID |
features | 人员特征 |
2.4.5 1:N特征比对
说明:当前feature和预加载Feature 集合比对,返回预加载Feature集合中命中的id,feature 字段和比对分值score;用户可以通过id 在数据库中查找全量信息。
public List<? extends Feature> search(BDFaceSDKCommon.FeatureType featureType,
float threshold,
int topNum,
byte[] feature,
boolean isPercent)
参数名 | 含义 |
---|---|
featureType | FeatureType.FEATURE_VIS生活照 FeatureType.FEATURE_ID_PHOTO证件照照 |
threshold | 比对阈值 |
topNum | 获取前num 个feature+id映射数组 |
feature | 当前检查人脸特征值 |
isPercent | 控制参数:true返回0~100数值;false 返回0~1 |
2.4.6 卸载特征模型
void uninitModel()
2.5 BDFaceImageInstance 图片接口
2.5.1 图片构造
说明:创建图片对象
BDFaceImageInstance(byte[] data, int height, int width,BDFaceSDKCommon.BDFaceImageType imageType, float angle, int isMbyteArrayror)
参数名 | 含义 |
---|---|
data | 图片字节数 |
height | 图片高 |
width | 图片宽 |
imageType | 图片类型 |
angle | 图片旋转角度 |
isMbyteArrayror | 是否镜像 |
2.5.2 图片构造
说明:创建图片对象
BDFaceImageInstance(Bitmap bitmap)
参数名 | 含义 |
---|---|
bitmap | 图片bitmap |
2.5.3 图像句柄创建(YUV,DEPTH图像数据流)
说明:创建图片对象
BDFaceImageInstance(byte[] data, int height, int width,BDFaceSDKCommon.BDFaceImageType imageType, float angle, int isMbyteArrayror)
参数名 | 含义 |
---|---|
data | 图像数据流流 |
height | 图像数据流高 |
width | 图像数据流宽 |
imageType | 图像数据流类型 |
angle | 图像数据流旋转角度(YUV 数据生效) |
isMbyteArrayror | 图像数据流是否镜像(YUV 数据生效) |
2.5.4 图像句柄创建(Bitmap 图像信息)
说明:创建图片对象
BDFaceImageInstance(Bitmap bitmap)
参数名 | 含义 |
---|---|
bitmap | 图片bitmap |
2.5.5 图片信息获取(送检)
说明:如果需要校验底层图片,通过该接口获取底层送检图片信息数据
BDFaceImageInstance getImage()
2.5.6 图片销毁
说明:销毁图片对象,每一帧图像数据使用完之后,必须调用,否着会出现内存溢出
int destory();
2.6 FaceGaze注意力检测接口
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceGaze()
// 有参构造调用(执行自己创建的instance )
public FaceGaze(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.6.1 注意力模型加载
说明:眼睛状态检测,同时判断出左眼,右眼6种状态,分别为向上,向下,向左,向右,向前,闭合
public void initModel(final Context context, final String gazeModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
gazeModel | 注意力模型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.6.2 注意力状态获取
说明:通过图片和关键点获取眼睛注意力状态信息
public BDFaceGazeInfo gaze(BDFaceImageInstance imageInstance, float[] landmarks)
参数名 | 含义 |
---|---|
bdFaceImageInstance | 图像对象 |
landmarks | 检测后landmark |
2.6.3 注意力模型卸载
说明:注意力模型卸载
void uninitGazeModel()
说明:0表示成功,非0失败
2.7 FaceDriverMonitor 驾驶行为监测
构造方法:
// 无参构造调用(执行默认创建的instance )
FaceDriverMonitor()
// 有参构造调用(执行自己创建的instance )
FaceDriverMonitor(BDFaceInstance thisBdFaceInstance)
2.7.1 驾驶行为监测能力加载
说明:加载驾驶行为监测能力
void initDriverMonitor(final Context context, final String driverMonitorModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
driverMonitorModel | 驾驶行为监测模型路径 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6code返回值 response 结果信息 |
2.7.2 驾驶行为监测能力能力卸载
void uninitDriverMonitor()
2.7.3 驾驶行为监测检测
public BDFaceDriverMonitorInfo driverMonitor(BDFaceImageInstance imageInstance,
FaceInfo faceinfo)
参数名 | 含义 |
---|---|
imageInstance | 图片数据信息 |
FaceInfo | 人脸参数信息(需要包含人脸检测的人脸框数据) |
BDFaceDriverMonitorInfo | 返回参数:驾驶行为监测结果 |
2.8 FaceCrop抠图能力接口
说明:可以根据人脸框或者人脸关键点进行抠图(该功能3.2及以下版本不支持)
构造方法:
// 无参构造调用(执行默认创建的instance )
FaceCrop()
// 有参构造调用(执行自己创建的instance )
FaceCrop(BDFaceInstance thisBdFaceInstance)
2.8.1 initFaceCrop抠图能力加载
void initFaceCrop(final Callback callback)
参数名 | 含义 |
---|---|
callback | 鉴权结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.8.2 uninitFaceCrop抠图能力卸载
int uninitFaceCrop()
参数名 | 含义 |
---|---|
int | 0 success;other 参数异常; |
2.8.3 cropFaceByBox使用人脸框进行人脸抠图
public static BDFaceImageInstance cropFaceByBox(BDFaceImageInstance imageInstance, FaceInfo faceinfo, float enlargeRatio, AtomicInteger isOutofBoundary)
参数名 | 含义 |
---|---|
imageInstance | 图片数据信息 |
faceinfo | 包含人脸框的人脸信息 |
enlargeRatio | 抠图放大倍数 |
isOutofBoundary | 抠图是否:是否超出图像范围(是否有黑边) 0为未超出,1为超出 |
2.8.4 cropFaceByLandmark使用人脸关键点进行人脸抠图
public BDFaceImageInstance cropFaceByLandmark(BDFaceImageInstance imageInstance,
float[] landmark,
float enlargeRatio,
boolean correction,
AtomicInteger isOutofBoundary)
参数名 | 含义 |
---|---|
imageInstance | 图片数据信息 |
landmark | 检测后产出数据 |
enlargeRatio | 抠图放大倍数 |
correction | 是否进行人脸矫正 |
isOutofBoundary | 抠图是否:是否超出图像范围(是否有黑边) 0为未超出,1为超出 |
2.9 FaceMouthMask口罩检测接口
说明:4.0及以上版本支持该功能
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceMouthMask()
// 有参构造调用(执行自己创建的instance )
public FaceMouthMask(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.9.1 口罩检测模型加载
说明:加载口罩检测模型
int initModel(final Context context, final String mouthMaskModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
mouthMaskModel | 口罩检测模型 |
callback | 鉴权结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.9.2 口罩检测结果获取
说明:通过图片和人脸框数据获取口罩检测置信度数据,0代表不戴口罩,1代表戴口罩
float[] checkMask(BDFaceImageInstance imageInstance, FaceInfo[] faceInfos)
参数名 | 含义 |
---|---|
imageInstance | 图像信息 |
faceInfos | 人脸框数据 |
float[] | 返回的戴口罩置信度 |
2.9.3 口罩检测模型卸载
说明:卸载口罩检测模型
int uninitModel()
说明:0表示成功,非0失败
2.10 ImageIllum 图片光照检测接口
int imageIllum(BDFaceImageInstance imageInstance, AtomicInteger illumScore)
参数名 | 含义 |
---|---|
imageInstance | 图像信息 |
illumScore | 图片光照强度 |
2.11 FaceSafetyHat安全帽检测
构造方法:
// 无参构造调用(执行默认创建的instance )
public FaceSafetyHat()
// 有参构造调用(执行自己创建的instance )
public FaceSafetyHat(BDFaceInstance thisBdFaceInstance)
参数名 | 含义 |
---|---|
thisBdFaceInstance | 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例 |
2.11.1 模型加载
public void initModel(final Context context, final String safetyHatModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
safetyHatModel | 安全帽模型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 2.1.7 code返回值 response 结果信息 |
2.11.2 安全帽检测
public float[] checkHat(BDFaceImageInstance bdFaceImageInstance, FaceInfo[] faceInfos)
参数名 | 含义 |
---|---|
imageInstance | 图像信息 |
faceInfos | 人脸信息 |
2.12 FaceDarkEnhance暗光恢复检测
2.12.1 模型加载
public void initFaceDarkEnhance(final Context context, final String FaceDarkEnhanceModel, final Callback callback)
参数名 | 含义 |
---|---|
context | 上下文context |
FaceDarkEnhanceModel | 暗光恢复模型 |
callback | 模型加载结果 void onResponse(int code, String response) code : 请参照此文档 1.1.6 code返回值 response 结果信息 |
2.12.2 暗光检测
public BDFaceImageInstance faceDarkEnhance(BDFaceImageInstance imageInstance)
参数名 | 含义 |
---|---|
imageInstance | 图像信息 |
返回值 | 暗光增强后的图像信息 |
2.12.3 能力卸载
public int uninitFaceDarkEnhance()
2.13 实体类说明
2.13.1 FaceInfo 实体类
public class FaceInfo {
/**
* ---------detect---------**
* 人脸索引值,标记连续视频帧追踪中人脸ID
*/
public int faceID;
/**
* 人脸中心点x坐标
*/
public float centerX;
/**
* 人脸中心点y坐标
*/
public float centerY;
/**
* 人脸宽度
*/
public float width;
/**
* 人脸高度
*/
public float height;
/**
* 人脸角度
*/
public float angle;
/**
* 人脸置信度
*/
public float score;
/**
* 人脸72个关键点数据(鼻子,眼镜,嘴巴,眉毛)
*/
public float[] landmarks;
/** -------- config head pose ture------**/
/**
* 人脸左右偏转角
*/
public float yaw;
/**
* 人脸平行平面内的头部旋转角
*/
public float roll;
/**
* 人脸上下偏转角
*/
public float pitch;
/** ---------config quality blur illum occluton ture---------**/
/**
* 人脸模糊度信息
*/
public float bluriness;
/**
* 人脸光照信息
*/
public int illum;
/**
* 人脸遮挡信息
*/
public BDFaceOcclusion occlusion;
/**---------config Attribute ture-------**/
/**
* 人脸年龄
*/
public int age;
/**
* 人脸种族(黄,白,黑,印度)
*/
public BDFaceSDKCommon.BDFaceRace race;
/**
* 人脸佩戴眼镜状态(无眼镜,有眼镜,墨镜)
*/
public BDFaceSDKCommon.BDFaceGlasses glasses;
/**
* 人脸性别(男女)状态
*/
public BDFaceSDKCommon.BDFaceGender gender;
/**
* 人脸3种情绪(中性,微笑,大笑)
*/
public BDFaceSDKCommon.BDFaceEmotion emotionThree;
/**---------config emotion ture-------**/
/**
* 人脸7种情绪(生气,恶心,害怕,开心,伤心,惊讶,无情绪)
*/
public BDFaceSDKCommon.BDFaceEmotionEnum emotionSeven;
/**---------config isMouthClose ture-------**/
/**
* 嘴巴闭合置信度
*/
public float mouthclose;
/**---------config isEyeClose ture-------**/
/**
* 左眼闭合的置信度
*/
public float leftEyeclose;
/**
* 右眼闭合的置信度
*/
public float rightEyeclose;
/**
* 最优人脸得分
*/
public float bestImageScore;
}
2.13.2 BDFaceSDKCommon 枚举类
public class BDFaceSDKCommon {
public enum BDFaceImageType {
BDFACE_IMAGE_TYPE_RGB,
BDFACE_IMAGE_TYPE_BGR,
BDFACE_IMAGE_TYPE_RGBA,
BDFACE_IMAGE_TYPE_BGRA,
BDFACE_IMAGE_TYPE_GRAY,
BDFACE_IMAGE_TYPE_DEPTH,
BDFACE_IMAGE_TYPE_YUV_NV21, // YYYYVUVU
BDFACE_IMAGE_TYPE_YUV_NV12, // YYYYUVUV
BDFACE_IMAGE_TYPE_YUV_YV12, // YYYYVVUU
}
// 检测类型
public enum DetectType {
DETECT_VIS, // 可见光图像
DETECT_NIR // 红外图像
}
// 人脸关键点类型枚举
public enum AlignType {
BDFACE_ALIGN_TYPE_RGB_ACCURATE, // 精确RGB对齐
BDFACE_ALIGN_TYPE_RGB_FAST, // 快速RGB对齐
BDFACE_ALIGN_TYPE_NIR_ACCURATE, // 精确NIR对齐
}
/**
* 图片检测类型,目前支持红外,深度图,可见光
*/
public enum LiveType {
BDFACE_SILENT_LIVE_TYPE_RGB,
BDFACE_SILENT_LIVE_TYPE_NIR,
BDFACE_SILENT_LIVE_TYPE_DEPTH,
}
/**
* 特征提取图片类型,证件照,可见光,红外,RGBD
*/
public enum FeatureType {
BDFACE_FEATURE_TYPE_LIVE_PHOTO, // 生活照特征提取
BDFACE_FEATURE_TYPE_ID_PHOTO, // 证件照特征提取
BDFACE_FEATURE_TYPE_NIR, // 近红外特征提取
BDFACE_FEATURE_TYPE_RGBD, // RGBD特征提取
}
// 质量检测类型
public enum FaceQualityType {
BLUR, // 模糊
OCCLUSION, // 遮挡
ILLUMINATION // 光照
}
// 表情类型
public enum BDFaceEmotion {
BDFACE_EMOTION_FROWN, // 皱眉
BDFACE_EMOTION_SMILE, // 笑
BDFACE_EMOTION_CALM, // 平静
}
// 情绪
public enum BDFaceEmotionEnum {
BDFACE_EMOTIONS_ANGRY, // 生气
BDFACE_EMOTIONS_DISGUST, // 恶心
BDFACE_EMOTIONS_FEAR, // 害怕
BDFACE_EMOTIONS_HAPPY, // 开心
BDFACE_EMOTIONS_SAD, // 伤心
BDFACE_EMOTIONS_SURPRISE, // 惊讶
BDFACE_EMOTIONS_NEUTRAL, // 无情绪
}
// 人脸属性种族
public enum BDFaceRace {
BDFACE_RACE_YELLOW, // 黄种人
BDFACE_RACE_WHITE, // 白种人
BDFACE_RACE_BLACK, // 黑种人
BDFACE_RACE_INDIAN, // 印度人
}
// 戴眼镜状态
public enum BDFaceGlasses {
BDFACE_NO_GLASSES, // 无眼镜
BDFACE_GLASSES, // 有眼镜
BDFACE_SUN_GLASSES, // 墨镜
}
// 性别
public enum BDFaceGender {
BDFACE_GENDER_FEMALE, // 女性
BDFACE_GENDER_MALE, // 男性
}
// 凝视方向
public enum 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, // 闭眼
}
public enum BDFaceActionLiveType {
BDFace_ACTION_LIVE_BLINK, // 眨眨眼
BDFACE_ACTION_LIVE_OPEN_MOUTH, // 张张嘴
BDFACE_ACTION_LIVE_NOD, // 点点头
BDFACE_ACTION_LIVE_SHAKE_HEAD, // 摇摇头
BDFACE_ACTION_LIVE_LOOK_UP, // 抬头
BDFACE_ACTION_LIVE_TURN_LEFT, // 向左转
BDFACE_ACTION_LIVE_TURN_RIGHT, // 向右转
}
/**
* log种类枚举
*/
public enum BDFaceLogInfo {
BDFACE_LOG_ERROR_MESSAGE, // 打印输出错误日志
BDFACE_LOG_VALUE_MESSAGE, // 打印输出值日志
BDFACE_LOG_TYPE_PERF, //打印输出性能日志
BDFACE_LOG_TYPE_ALL, //打印输出全部日志
BDFACE_LOG_TYPE_DEBUG, //打印输出debug日志
}
public enum BDFaceCoreRunMode {
BDFACE_LITE_POWER_HIGH, //大核运行模式
BDFACE_LITE_POWER_LOW, // 小核运行模式
BDFACE_LITE_POWER_FULL, // 大小核混用模式
BDFACE_LITE_POWER_NO_BIND, // 不绑核运行模式 (推荐)
BDFACE_LITE_POWER_RAND_HIGH, // 轮流绑定大核模式
BDFACE_LITE_POWER_RAND_LOW // 轮流绑定小核模式
}
}
2.13.3 BDFaceOcclusion 实体类
public class BDFaceOcclusion {
public float leftEye; // 左眼遮挡置信度
public float rightEye; // 右眼遮挡置信度
public float nose; // 鼻子遮挡置信度
public float mouth; // 嘴巴遮挡置信度
public float leftCheek; // 左脸遮挡置信度
public float rightCheek; // 右脸遮挡置信度
public float chin; // 下巴遮挡置信度
}
2.13.4 BDFaceSDKConfig 配置实体类
public class BDFaceSDKConfig {
/**
* 输入图像的缩放系数
*/
public float scaleRatio = -1;
/**
* 需要检测的最大人脸数目
*/
public int maxDetectNum = 10;
/**
* 需要检测的最小人脸大小
*/
public int minFaceSize = 0;
/**
* 人脸置信度阈值(检测分值大于该阈值认为是人脸)
* RGB
*/
public float notRGBFaceThreshold = 0.5f;
/**
* 人脸置信度阈值(检测分值大于该阈值认为是人脸)
* NIR
*/
public float notNIRFaceThreshold = 0.5f;
/**
* 未跟踪到人脸前的检测时间间隔
*/
public float detectInterval = 0;
/**
* 已跟踪到人脸后的检测时间间隔
*/
public float trackInterval = 500;
/**
* 质量检测模糊,默认不做质量检测
*/
public boolean isCheckBlur = false;
/**
* 质量检测遮挡,默认不做质量检测
*/
public boolean isOcclusion = false;
/**
* 质量检测光照,默认不做质量检测
*/
public boolean isIllumination = false;
/**
* 姿态角检测,获取yaw(左右偏转角),roll(人脸平行平面内的头部旋转角),pitch(上下偏转角),默认不检测
*/
public boolean isHeadPose = false;
/**
* 属性检查,获取年龄,种族,是否戴眼镜等信息,默认不检测
*/
public boolean isAttribute = false;
/**
* 7种情绪信息获取,默认不检测(3.2及以下版本不支持)
*/
private boolean isEmotion = false;
/**
* 是否扣图,默认不扣图(3.2及以下版本不支持)
*/
public boolean isCropFace = false;
/**
* 是否检测眼睛闭合,默认不检测
*/
private boolean isEyeClose = false;
/**
* 是否检测嘴巴闭合,默认不检测
*/
private boolean isMouthClose = false;
/**
* 是否检测最优人脸,默认不检测
*/
public boolean isBestImage = false;
}
2.13.5 Feature 实体类
public class Feature {
private int id;
private String faceToken = "";
private byte[] feature;
private String userId = "";
private String groupId = "";
private long ctime;
private long updateTime;
private String imageName = "";
private String userName = "";
private String cropImageName = "";
private boolean isChecked;
private float score;
}
2.13.6 BDFaceGazeInfo 实体类
public class BDFaceGazeInfo {
public float leftEyeConf; // 左眼的置信度
public float rightEyeConf; // 右眼的置信度
public float softmaxEyeConf;
public BDFaceGazeDirection leftEyeGaze; // 左眼的注意力信息
public BDFaceGazeDirection rightEyeGaze; // 右眼的注意力信息
public BDFaceGazeDirection softmaxEyeGaze;
}
2.13.7 BDFaceDetectListConf 实体类
public class BDFaceDetectListConf {
/**
* 检测(在track 精度不足时开启)默认不做检测
*/
public boolean usingDetect = false;
/**
* 检测(在track 精度不足时开启)默认开启对齐
*/
public boolean usingAlign = true;
/**
* 质量检测模糊,默认不做质量检测
*/
public boolean usingQuality = false;
/**
* 姿态角检测,获取yaw(左右偏转角),roll(人脸平行平面内的头部旋转角),pitch(上下偏转角),默认不检测
*/
public boolean usingHeadPose = false;
/**
* 属性检查,获取年龄,种族,是否戴眼镜等信息,默认不检测
*/
public boolean usingAttribute = false;
/**
* 7种情绪信息获取,默认不检测
*/
public boolean usingEmotion = false;
/**
* 是否检测眼睛闭合,默认不检测
*/
public boolean usingEyeClose = false;
/**
* 是否检测嘴巴闭合,默认不检测
*/
public boolean usingMouthClose = false;
/**
* 是否检测最优人脸,默认不检测
*/
public boolean usingBestImage = false;
/**
* 是否检测戴口罩,默认不检测
*/
public boolean usingMouthMask = false;
}
2.13.8 BDFaceDriverMonitorInfo 驾驶检测结果信息
public class BDFaceDriverMonitorInfo {
float normal = 0; // 行为正常
float calling = 0; // 打电话
float drinking = 0; // 喝水
float eating = 0; // 吃东西
float smoking = 0; // 抽烟
}
3、示例参考
3.1 功能介绍
为了方便您快速体验新版SDK的能力,我们为您构建了一个简易的示例工程,包含了人脸识别端上的常用能力,并配以带有交互的UI界面,希望能更直接地让您理解此版SDK的功能。同时,您也可以基于此示例工程进行二次开发,快速构建Demo或业务工程。
- 多种鉴权模式:提供序列号、离线License文件授权的可视化方式。
- 人脸注册:提供全屏跟踪人脸注册,和固定区域人脸注册,满足不同业务场景要求。
- 1:N识别:提供完整的1:N识别功能和界面设计。
- 调试模式:提供多种模态的预览图界面、各模型的实际应用耗时,方便用于评估应用性能。
- 多模态活体检测:提供预设的无活体、RGB活体、RGB+NIR活体、RGB+Depth四种活体设置,并预设适配镜头能力。
- 人脸库管理:提供库、组、用户的三层人脸库管理逻辑,并支持可视化批量导入功能。
- 人证比对:提供证件照模型,并预设在1:1功能中,支持实时采集和照片两种录入模式。
- 高级设置:支持质量检测、活体模态、检测模态等多项可视化配置能力,方便直接上手调节使用。
3.2 代码结构
3.2.1 核心库介绍
facelibrary是SDK的依赖库。
lib目录为动态库so,包含arm64-v8a和armeabi-v7a两个平台。
名称 | 功能 |
---|---|
libbdface_sdk.so | 人脸核心库 |
libbd_license.so、libliantian.so | 授权核心库 |
libaikl_calc_arm.so、libaikl_cluster_arm.so | 加速算法核心库 |
新版sdk以上so库文件都合并至FaceSDK_8.2_20240308-release.so中
assets目录为模型文件。
名称 | 功能 | 是否必须 |
---|---|---|
detect | 人脸检测核心模型 | 是 |
align | 人脸对齐核心模型 | 是 |
blur、occlusion | 质量检测模型 | 否 |
slient_live | 活体检测模型 | 是 |
feature | 识别核心模型 | 是 |
java目录为用户组管理、人脸SDK操作、视频流、图片等操作辅助类
3.2.2 示例代码结构
名称 | 功能 |
---|---|
MainActivity | 主功能页面,包含人脸检索,认证比对,功能设置,授权激活功能入口 |
FaceRegisterNewActivity | 人脸注册 |
BatchImportActivity | 人脸库管理,批量导入功能 |
FaceDetectAngleActivity | 人脸检测角度设置,用于调整实际送去人脸检测的图片的角度,包括0,90,180,270。SDK只能识别人脸朝上的人脸。 |
CameraDisplayAngleActivity | 摄像头视频流回显角度 |
GateMinFaceActivity | 最小人脸设置 |
FaceLivinessType | 活体类型设置,分为无活体、RGB活体、RGB+NIR活体、RGB+Depth活体、RGB+NIR+Depth活体。默认为不使用活体。示例工程里面进行活体设置后,后续的人脸注册、人脸1:1,1:n等操作需选择相应Activity。无活体和rgb活体需要使用单目usb摄像头,rgb+ir活体需要使用rgb+ir双目摄像头。RGB+Depth活体,目前只能使用RGB+Depth活体功能。RGB+NIR+Depth的活体硬件设备适配还在开发中,敬请期待。 |
MirrorSettingActivity | 镜像调节页面 |
3.3 开始集成
3.3.1 鉴权
鉴权初始化
public void init(final Context context, final SdkInitListener listener)
- 参数说明:
参数 | 含义 |
---|---|
context | 上下文 |
listener | 初始化回调 |
- 接口调用:
FaceSDKManager.getInstance().init(mContext, new SdkInitListener())
模型初始化
说明:包含两种检测模型(RGB+NIR)、对齐、质量检测、活体3种(RGB+NIR+Depth)、特征提取两种(生活照+证件照)共10个模型
public void initModel(final Context context, BDFaceSDKConfig config, boolean isLog, final SdkInitListener listener)
- 参数说明:
参数 | 含义 |
---|---|
context | 上下文 |
config | 检测实体类 |
isLog | 是否打印日志 |
listener | 初始化回调 |
- 接口调用:
FaceSDKManager.getInstance().initModel(mContext, new SdkInitListener())
方式一:使用序列号形式的在线鉴权
public void initLicenseOnLine(final Context context, final String licenseID, final Callback callback)
- 参数说明:
参数 | 含义 |
---|---|
context | 上下文 |
licenseID | 后台购买或申请的序列号 |
callback | 授权结果 void onResponse(int code, String response) code 0 : 成功;code 1 加载失败 |
- 接口调用:
FaceAuth faceAuth = new FaceAuth();
faceAuth.initLicenseOnLine(context, licenseID, new callback)
方式二:使用本地文件形式的离线鉴权
public void initLicenseOffLine(final Context context, final Callback callback)
- 参数说明:
参数 | 含义 |
---|---|
context | 上下文 |
callback | 授权结果 void onResponse(int code, String response)code 0 : 成功;code 1 加载失败 |
- 接口调用:
FaceAuth faceAuth = new FaceAuth();
faceAuth.initLicenseOffLine(context, licenseID, new callback)
方式三:使用按应用信息的批量鉴权
public void initLicenseBatchLine(final Context context, final String licenseKey, final Callback callback)
- 参数说明:
参数 | 含义 |
---|---|
context | 上下文 |
licenseKey | 需百度负责人提供 |
callback | 授权结果 void onResponse(int code, String response)code 0 : 成功;code 1 加载失败 |
- 接口调用:
FaceAuth faceAuth = new FaceAuth();
faceAuth.initLicenseBatchLine(context, licenseKey, new callback)
3.3.2 人脸注册
进入该功能之后首先需要录入输入用户名+组名,用户名要求不能含有特殊符号,要求不能超过30个字符,填入成功之后才可进入视频流实时采集页面。FaceRegisterActivity是注册页面。采集页面将会执行人脸检测、人脸活体检测、特征值提取功能。前面都通过即执行注册,注册成功后并将注册成功的图片保存到本地。您可以根据实际使用的硬件进行选择。
注一:为了使注册的图片达到较高的质量,注册默认开启质量检测与远近距离校验。设置里的质量检测开关对注册页面不起作用。
注二:为了使注册效果更好。所有活体状态下注册默认开启固定区域检测,设置里的检测跟踪策略对注册页面不起作用。
1)注册采集,可选择以下3种方式返回人脸
- FaceRegisterNewActivity:无活体或RGB活体(活体检测成功后,注册人脸)
- FaceRegisterNewNIRActivity:进行RGB+NIR活体成功后注册人脸
- FaceRegisterNewDepthActivity:进行RGB+Depth活体成功后注册人脸(目前仅支持奥比中光Atlas镜头)
下面是检测相关代码:
private void faceDetect(byte[] data, final int width, final int height) {
FaceSDKManager.getInstance().onDetectCheck(bdFaceImageConfig, null, null,
bdFaceCheckConfig , new FaceDetectCallBack() {
@Override
public void onFaceDetectCallback(LivenessModel livenessModel) {
// 输出结果
checkFaceBound(livenessModel);
}
@Override
public void onTip(final int code, String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mFaceRoundProView == null) {
return;
}
if (code == 0){
mFaceRoundProView.setTipText("请保持面部在取景框内");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_grey , false);
}else {
mFaceRoundProView.setTipText("请保证人脸区域清晰无遮挡");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_blue , true);
}
}
});
}
@Override
public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
showFrame(livenessModel);
}
});
}
下面是活体判断相关代码:
private void checkLiveScore(LivenessModel livenessModel) {
if (livenessModel == null || livenessModel.getFaceInfo() == null) {
mFaceRoundProView.setTipText("请保持面部在取景框内");
return;
}
// 获取活体类型
int liveType = SingleBaseConfig.getBaseConfig().getType();
// int liveType = 2;
if (livenessModel.isQualityCheck()){
mFaceRoundProView.setTipText("请保证人脸区域清晰无遮挡");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_blue , true);
return;
} else if (bdLiveConfig == null) { // 无活体
getFeatures(livenessModel);
} else { // RGB活体检测
float rgbLivenessScore = livenessModel.getRgbLivenessScore();
float liveThreadHold = SingleBaseConfig.getBaseConfig().getRgbLiveScore();
// Log.e(TAG, "score = " + rgbLivenessScore);
if (rgbLivenessScore < liveThreadHold) {
mFaceRoundProView.setTipText("请保证采集对象为真人");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_blue , true);
return;
}
// 提取特征值
getFeatures(livenessModel);
}
}
下面是人脸特征提取的代码:
private void displayCompareResult(float ret, byte[] faceFeature, LivenessModel model) {
if (model == null) {
mFaceRoundProView.setTipText("请保持面部在取景框内");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_grey , false);
return;
}
// 特征提取成功
if (ret == 128) {
// 抠图
BDFaceImageInstance cropInstance =
FaceSDKManager.getInstance().getCopeFace(
BitmapUtils.getInstaceBmp(model.getBdFaceImageInstance()) ,
model.getLandmarks(),
0
); ;
if (cropInstance == null) {
mFaceRoundProView.setTipText("抠图失败");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_blue , true);
return;
}
mCropBitmap = BitmapUtils.getInstaceBmp(cropInstance);
// 获取头像
if (mCropBitmap != null) {
mCollectSuccess = true;
mCircleHead.setImageBitmap(mCropBitmap);
}
cropInstance.destory();
mRelativeCollectSuccess.setVisibility(View.VISIBLE);
mRelativePreview.setVisibility(View.GONE);
mFaceRoundProView.setTipText("");
for (int i = 0; i < faceFeature.length; i++) {
mFeatures[i] = faceFeature[i];
}
} else {
mFaceRoundProView.setTipText("特征提取失败");
mFaceRoundProView.setBitmapSource(R.mipmap.ic_loading_blue , true);
}
}
下面是将特征值及用户信息注册到人脸库的代码:
String userName = mEditName.getText().toString();
// 姓名过滤
String nameResult = FaceApi.getInstance().isValidName(userName);
if (!"0".equals(nameResult)) {
ToastUtils.toast(getApplicationContext(), nameResult);
return;
}
String imageName = userName + ".jpg";
// 注册到人脸库
boolean isSuccess = FaceApi.getInstance().registerUserIntoDBmanager(null,userName, imageName, null, mFeatures);
if (isSuccess) {
// 保存人脸图片
File faceDir = FileUtils.getBatchImportSuccessDirectory();
File file = new File(faceDir, imageName);
FileUtils.saveBitmap(file, mCropBitmap);
// 数据变化,更新内存
// FaceSDKManager.getInstance().initDatabases();
// 更新UI
mRelativeCollectSuccess.setVisibility(View.GONE);
mRelativeRegisterSuccess.setVisibility(View.VISIBLE);
mCircleRegSucHead.setImageBitmap(mCropBitmap);
} else {
ToastUtils.toast(getApplicationContext(), "保存数据库失败," +"可能是用户名格式不正确");
}
参数填写时请注意:
- 用户名为必填项,支持英文与数字。
- 用户组为可选项,不填默认生成名为default 的用户组;
- 用户信息可不填,用于其他需求;
- 注册成功后生成的图片命名格式为group-username.jpg,保存在sdcard下的Success-Import文件夹下,用于人脸库的图片显示。
3.3.3 1:N识别
RGB搜索
- 打开预览:
public void startPreview(GlMantleSurfacView textureView, int videoDirection ,int width, int height)
- 参数说明:
参数 | 含义 |
---|---|
textureView | 帧图像预览数据 |
videoDirection | 视频流旋转角度 |
width | 图片的宽 |
height | 图片的高 |
- 接口调用:
// 设置相机的ID
if (SingleBaseConfig.getBaseConfig().getRBGCameraId() != -1) {
CameraPreviewManager.getInstance().setCameraFacing(SingleBaseConfig.getBaseConfig().getRBGCameraId());
} else {
CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_USB);
}
// 开启预览
CameraPreviewManager.getInstance().startPreview(glMantleSurfacView,
SingleBaseConfig.getBaseConfig().getRgbVideoDirection() , PREFER_WIDTH, PERFER_HEIGH);
- 人脸检索(包含检测、活体、特征、人脸搜索全流程)
public void onDetectCheck(final BDFaceImageConfig bdFaceImageConfig,
final BDFaceImageConfig bdNirFaceImageConfig,
final BDFaceImageConfig bdDepthFaceImageConfig,
final BDFaceCheckConfig bdFaceCheckConfig,
final FaceDetectCallBack faceDetectCallBack)
- 参数说明:
参数 | 含义 |
---|---|
bdFaceImageConfig | 视频流数据以及相关配置 |
bdNirFaceImageConfig | 红外YUV数据流以及相关配置 |
bdDepthFaceImageConfig | 深度depth数据流以及相关配置 |
bdFaceCheckConfig | 特征提取模式、质量和活体阈值以及相机类型等配置类 |
faceDetectCallBack | 检测结果回调 |
接口调用:
FaceSDKManager.getInstance().onDetectCheck(data, null, null,height, width, mLiveTyenew, FaceDetectCallBack()
RGB+NIR搜索
- 非Debug模式:FaceRGBIRCloseDebugSearchActivity
- Debug模式:FaceRGBIROpenDebugSearchActivity
public void onDetectCheck(final byte[] rgbData,
final byte[] nirData,
final byte[] depthData,
final int srcHeight,
final int srcWidth,
final int liveCheckMode,
final FaceDetectCallBack faceDetectCallBack)
- 参数说明:
参数 | 含义 |
---|---|
rgbData | 可见光YUV 数据流 |
nirData | 红外YUV 数据流 |
depthData | 深度depth 数据流 |
srcHeight | 可见光YUV 数据流-高度 |
srcWidth | 可见光YUV 数据流-宽度 |
liveCheckMode | 活体检测类型: 不使用活体:1; RGB活体:2; RGB+NIR活体:3; RGB+Depth活体:4 |
faceDetectCallBack | 检测结果回调 |
- 接口调用 :
FaceSDKManager.getInstance().onDetectCheck(rgbData, irData, null, PERFER_HEIGH, PREFER_WIDTH, 3, new FaceDetectCallBack())
RGB+Depth搜索
- 非Debug模式:FaceRGBDepthCloseDebugSearchActivity
- Debug模式:FaceRGBDepthOpenDebugSearchActivity
public void onDetectCheck(final byte[] rgbData,
final byte[] nirData,
final byte[] depthData,
final int srcHeight,
final int srcWidth,
final int liveCheckMode,
final FaceDetectCallBack faceDetectCallBack)
- 参数说明:
参数 | 含义 |
---|---|
rgbData | 可见光YUV 数据流 |
nirData | 红外YUV 数据流 |
depthData | 深度depth 数据流 |
srcHeight | 可见光YUV 数据流-高度 |
srcWidth | 可见光YUV 数据流-宽度 |
liveCheckMode | 活体检测类型: 不使用活体:1; RGB活体:2; RGB+NIR活体:3; RGB+Depth活体:4 |
faceDetectCallBack | 检测结果回调 |
- 接口调用 :
FaceSDKManager.getInstance().onDetectCheck(rgbData, null, depthData, RGB_HEIGHT, RGB_WIDTH, 4, new FaceDetectCallBack()
3.3.4 人脸库管理
批量导入
本功能下支持批量导入人脸图片数据,用于将图片录入到人脸库中,即批量注册。该过程不进行活体检测,仅执行批量人脸特征值生成录入,每张图片提取一张最大人脸做为注册人脸,人脸图片较多时可能会耗时较长,请耐心等待。
// 走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值
ret = FaceApi.getInstance().getFeature(bitmap, bytes,
BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
LogUtils.i(TAG, "live_photo = " + ret);
使用步骤:
- 在SD卡根目录,创建一个文件夹,命名为
Face-Import
。 - 将需要导入的每个图片,文件名示例为
username_group.jpg
,即用户名-用户组名的文件命名方式,用户名建议4-20位字符,支持字母、数字、下划线组合。 - 新建一个压缩文件,命名为
Face.zip
,将人脸图片全部放到该zip下,并将zip文件放置到Face-Import
目录下。 - 点击下方按钮开始解压操作,批量注册时间较长,请耐心等待,不要关闭此窗口。
其中:
批量导入的接口如下:
public void batchImport();
获取压缩包导入目录相关代码:
// 获取导入目录 /sdcard/Face-Import
File batchImportDir = FileUtils.getBatchImportDirectory();
遍历该目录下的所有文件相关代码:
// 遍历该目录下的所有文件
File[] picFiles = batchImportDir.listFiles();
if (picFiles == null || picFiles.length == 0) {
Log.i(TAG, "导入数据的文件夹没有数据");
if (mImportListener != null) {
mImportListener.showToastMessage("导入数据的文件夹没有数据");
}
return;
}
判断Face.zip是否存在的相关代码:
// 判断Face.zip是否存在
File zipFile = FileUtils.isFileExist(batchFaceDir.getPath(),
"Face.zip");
if (zipFile == null) {
LogUtils.i(TAG, "导入数据的文件夹没有Face.zip");
if (mImportListener != null) {
mImportListener.showToastMessage("搜索失败,
请检查操作步骤并重试");
}
return;
}
如果Face.zip文件存在,并且解压成功之后,就可以进行导入了。 导入过程中会首先判断图片后缀是不是满足要求:
// 获取图片名
String picName = picFiles[i].getName();
// 判断图片后缀
if (!picName.endsWith(".jpg") && !picName.endsWith(".png")) {
LogUtils.i(TAG, "图片后缀不满足要求");
mFinishCount++;
mFailCount++;
// 更新进度
updateProgress(mFinishCount, mSuccessCount, mFailCount,
((float) mFinishCount / (float) mTotalCount));
continue;
}
如果满足要求,则判断图片命名是否满足要求:
// 获取不带后缀的图片名
String picNameNoEx = FileUtils.getFileNameNoEx(picName);
// 通过既定的图片名格式,按照“-”分割,获取组名和用户名
String[] picNames = picNameNoEx.split("-");
// 如果分割失败,则该图片命名不满足要求
if (picNames.length != 2) {
LogUtils.e(TAG, "图片命名格式不符合要求");
mFinishCount++;
mFailCount++;
continue;
}
根据姓名查询数据库与文件中对应的姓名是否相等,如果相等,则直接过滤
// 根据姓名查询数据库与文件中对应的姓名是否相等,如果相等,则直接过滤
List<User> listUsers = FaceApi.getInstance()
.getUserListByUserName(groupName, userName);
if (listUsers != null && listUsers.size() > 0) {
LogUtils.i(TAG, "与之前图片名称相同");
mFinishCount++;
mFailCount++;
// 更新进度
updateProgress(mFinishCount, mSuccessCount, mFailCount,
((float) mFinishCount / (float) mTotalCount));
continue;
}
导入过程中都会有log提示,出现导入失败情况要根据log提示定位出问题原因。
组列表信息管理
该页面主要是查询、删除组列表操作。
-
获取组列表信息:
public List<Group> getGroupListByGroupId(String groupId)
参数:
参数类型 | 参数名称 | 取值范围 | 说明 |
---|---|---|---|
String | groupId | 不可为空 | 要查询的组名称,为null则返回null |
用户详情信息管理
该页面主要有用户详细信息展示、删除以及用户图片替换功能。
- 用户删除:
public boolean userDelete(String userId);
参数:
参数类型 | 参数名称 | 取值范围 | 说明 |
---|---|---|---|
String | userId | 不可为空 | 当前用户id |
- 更换图片:
public boolean userUpdate(String userName, String imageName, byte[] feature);
参数:
参数类型 | 参数名称 | 取值范围 | 说明 |
---|---|---|---|
String | userName | 不可为空 | 当前用户名 |
String | imageName | 不可为空 | 当前图片名称 |
byte[] | feature | 不可为空 | 人脸特征值 |
3.3.5 人证比对
模拟真实场景下,人脸图片与证件照图片(如小图、身份证芯片照)对比的业务流程,特征抽取默认使用「证件照模型」,以处理对比过程中的证件照图片特征抽取的要求(证件照图片普遍像素较低)。配套使用的活体检测功能,需要在设置-->镜头及活体检测模式中单独选择对应的已经适配的镜头。
比对完成返回核验结果与相似度分值,分值大于相似度阈值则表示核验通过,反之核验不通过。
注:SDK只检测人脸朝上的人脸。
从视频流中采集两张人脸图片进行对比
此种方式的人脸图片需要从视频流中实时采集,如果为无人值守情况,还需配备活体检测以保障业务安全。FaceIdCompareActivity
是比对页面,根据活体策略选择相应的实现,开发者可以根据实际使用的硬件进行选择。
采集人脸,可选择以下3种方式返回人脸
- FaceRGBPersonActivity:无活体或RGB活体(活体检测成功后,返回检测到的人脸)
- FaceIRTestimonyActivity:进行RGB+NIR活体成功后返回检测到RGB人脸
- FaceDepthTestimonyActivity:进行RGB+Depth活体成功后返回检测到RGB人脸(奥比中光Atlas镜头)
1)根据返回人脸抽取特征
final Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri1));
if (bitmap != null) {
byte[] secondFeature = new byte[512];
// 提取特征值
float ret = FaceSDKManager.getInstance().personDetect(bitmap, secondFeature,
FaceUtils.getInstance().getBDFaceCheckConfig() , this);
// 提取特征值
// 上传图片有人脸显示
hintShowIv.setVisibility(View.VISIBLE);
testimonyShowImg.setVisibility(View.VISIBLE);
hintShowIv.setImageBitmap(bitmap);
testimonyShowImg.setImageBitmap(bitmap);
if (ret != -1) {
isFace = false;
// 判断质量检测,针对模糊度、遮挡、角度
if (ret == 128) {
bdFaceCheckConfig.setSecondFeature(secondFeature);
toast("图片特征抽取成功");
hintShowRl.setVisibility(View.VISIBLE);
testimonyShowRl.setVisibility(View.VISIBLE);
testimonyAddIv.setVisibility(View.GONE);
testimonyUploadFilesTv.setVisibility(View.GONE);
developmentAddRl.setVisibility(View.GONE);
} else {
ToastUtils.toast(mContext, "图片特征抽取失败");
}
} else {
isFace = true;
// 上传图片无人脸隐藏
hintShowIv.setVisibility(View.GONE);
testimonyShowImg.setVisibility(View.GONE);
hintShowRl.setVisibility(View.VISIBLE);
testimonyShowRl.setVisibility(View.VISIBLE);
testimonyAddIv.setVisibility(View.GONE);
testimonyUploadFilesTv.setVisibility(View.GONE);
developmentAddRl.setVisibility(View.GONE);
}
}
2)比对两张人脸图片
if (featureCheckMode == 4) {
// 目前仅支持
float score = faceModel.getFaceSearch().compare(
BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
livenessModel.getFeature(), secondFeature, true);
livenessModel.setScore(score);
if (score > threholdScore) {
/*faceId = livenessModel.getFaceInfo().faceID;
trackTime = System.currentTimeMillis();
faceAdoptModel = livenessModel;
failNumber = 0;
isFail = false;*/
setFail(livenessModel);
} else {
setFail(livenessModel);
}
}
3.3.6 功能设置
我们将常用功能设置预设在工程中,sdcard根目录下的 faceConfig.txt
文件保存了人脸识别的各项基础配置,主要功能可以调整人脸镜像,人脸角度等相关配置(详细说明可进入配置页里查看说明)。您也可以基于预设配置,进行自定义配置修改。
配置信息初始化(从sdcard根目录的faceConfig.txt的文件里读取配置)
isConfigExit = ConfigUtils.isConfigExit();
isInitConfig = ConfigUtils.initConfig();
if (isInitConfig && isConfigExit) {
Toast.makeText(MainActivity.this, "初始配置加载成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "初始配置失败,将重置文件内容为默认配置", Toast.LENGTH_SHORT).show();
ConfigUtils.modityJson();
}
每次修改配置之后,需调用以下方法,更新配置文件并重新读取数据。
ConfigUtils.modityJson();
3.4 核心类说明
FaceSDKManager
功能:负责初始检测类FaceAuth、FaceDetector、FaceFeature、FaceLiveness com.baidu.idl.face.main.manager
FaceLiveness
功能:人脸活体相关操作封装类,包含人脸rgb、ir、depth活体检测 com.baidu.idl.main.facesdk
ImportFileManager
功能:批量导入的相关操作 com.baidu.idl.face.main.manager
UserInfoManager
功能:人脸库管理相关操作 com.baidu.idl.face.main.manager
DBManager
功能:数据库相关操作 com.baidu.idl.face.main.db