人脸识别

    Android-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 初版,包括离线人脸采集、离线活体检测、离线对比识别、离线人脸库管理等功能

    目录

    1、接口说明
    	1.1 FaceAuth 鉴权接口
    		1.1.1 鉴权-在线鉴权
    		1.1.2 鉴权-离线授权
            1.1.3 鉴权-在线按应用批量授权
    		1.1.4 开启底层Log输出
    		1.1.5 设置核数
    		1.1.6 Code返回值
    	1.2 FaceDetect 检测接口
    		1.2.1 可见光检测对齐模型加载
            1.2.2 检测对齐模型加载
    		1.2.3 质量检测模型加载
            1.2.4 属性情绪模型加载
            1.2.5 眼睛闭合,嘴巴闭合模型加载
    		1.2.6 配置信息加载
    		1.2.7 人脸框检测 
    		1.2.8 人脸跟踪-多人脸检测(接口只支持RGB追踪)
            1.2.9 人脸跟踪-多人脸检测
    		1.2.10 人脸抠图
    		1.2.11 检测模型卸载
    	1.3 FaceLive 活体接口
    		1.3.1 活体模型加载
    		1.3.2 人脸静默活体检测
    		1.3.3 活体模型卸载
    	1.4 FaceFeature 特征抽取接口
    		1.4.1 特征模型加载
    		1.4.2 特征提取
    		1.4.3 特征比对
    		1.4.4 1:N特征设置
    		1.4.5 1:N特征比对
    		1.4.6 卸载特征模型
    	1.5 BDFaceImageInstance 图片接口
    		1.5.1 图片构造
            1.5.2 图片构造
            1.5.3 图像句柄创建(YUV,DEPTH图像数据流)
    		1.5.4 图像句柄创建(Bitmap 图像信息)
    		1.5.5 图片信息获取(送检)
    		1.5.6 图片销毁
        1.6 FaceGaze 注意力检测接口
            1.6.1 注意力模型加载
            1.6.2 注意力状态获取
            1.6.3 注意力模型卸载 
        1.7 FaceDriverMonitor 驾驶行为监测
            1.7.1 驾驶行为监测能力加载
            1.7.2 驾驶行为监测能力能力卸载
            1.7.3 驾驶行为监测检测
        1.8 FaceCrop 抠图能力接口
    		1.8.1 intFaceCrop 抠图能力加载
    		1.8.2 unintFaceCrop 抠图能力加载
    		1.8.3 cropFaceByBox 使用人脸框进行人脸抠图
    		1.8.4 cropFaceByLandmark 使用人脸关键点进行人脸抠图
        1.9 FaceMouthMask 口罩检测接口
    		1.9.1 口罩检测模型加载
    		1.9.2 口罩检测结果获取
    		1.9.3 口罩检测模型卸载
        1.10 实体类说明
    		1.10.1 FaceInfo 实体类
    		1.10.2 BDFaceSDKCommon 枚举类
    		1.10.3 BDFaceOcclusion 实体类
    		1.10.4 BDFaceSDKConfig 配置实体类 
    		1.10.5 Feature 实体类
            1.10.6 BDFaceGazeInfo 配置实体类 
    		1.10.7 BDFaceDetectListConf 实体类
            1.10.8 BDFaceDriverMonitorInfo 驾驶检测结果信息
        1.11 版本更新注意说明
    		1.11.1 4.0及以上版本口罩检测能力使用
    		1.11.2 3.0/3.1版本升级到3.2版本    
    2、示例参考
    	2.1 功能介绍
    	2.2 代码结构
    		2.2.1 核心库介绍
    		2.2.2 示例代码结构
    	2.3 开始集成
    		2.3.1 鉴权
    		2.3.2 人脸注册
    		2.3.3 1:N识别
    		2.3.4 人脸库管理
    		2.3.5 人证比对
    		2.3.6 功能设置
    	2.4 核心类说明
    3、参考方案
    	3.1 质量控制
    	3.2 活体选型
    	3.3 底库大小
    	3.4 数据同步
    	3.5 鉴权选择

    1、接口说明

    1.1 FaceAuth鉴权接口

    1.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 结果信息

    1.1.2 鉴权-离线授权

    说明:用户申请鉴权文件,放在SD 卡下,点击按钮直接鉴权

     void initLicenseOffLine(final Context context, final Callback callback)
    参数名 含义
    context 当前上下文
    callback 鉴权结果 void onResponse(int code, String response)
    code 0 : 成功;code 1 加载失败
    response 结果信息

    1.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 结果信息

    1.1.4 开启底层Log输出

    说明:用于Debug时候输出Log详细信息

    void setActiveLog(BDFaceLogInfo logInfo)
    参数名 含义
    BDFaceLogInfo 底层log 打印
    BDFACE_LOG_VALUE_MESSAGE, // 打印输出值日志
    BDFACE_LOG_ERROR_MESSAGE, // 打印输出错误日志
    BDFACE_LOG_ALL_MESSAGE, // 打印所有日志

    1.1.5 设置核数

    说明:根据开发板类型,设置加速对CPU核数依赖,调整参数,提高性能

    setAnakinConfigure(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

    1.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 图像转换失败;

    1.2 FaceDetect 检测接口

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    public FaceDetect()
    // 有参构造调用(执行自己创建的instance )
    public FaceDetect(BDFaceInstance thisBdFaceInstance)
    参数名 含义
    thisBdFaceInstance 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例

    1.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 结果信息

    1.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 结果信息

    1.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 结果信息

    1.2.4 属性情绪模型加载

    说明:人脸属性(年龄,性别,戴眼镜等),情绪(喜怒哀乐)模型初始化

    void initAttrEmo(final Context context,final String atttibuteModel,final String emotionModel,final Callback callback)
    参数名 含义
    context 上下文context
    atttibuteModel 属性检测模型
    emotionModel 7中情绪检测模型
    callback 鉴权结果 void onResponse(int code, String response)
    code 0 : 成功;code 1 加载失败
    response 结果信息

    1.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 结果信息

    1.2.6 配置信息加载

    说明:检测最小人脸,是否开启内部质量检测,检测或者追踪时间间隔等配置(只适用于3.2及以下版本的detect、track接口)

    void loadConfig(BDFaceSDKConfig config)
    参数名 含义
    config 参数配置实体

    1.2.7 人脸框检测

    说明:人脸框检测,每一帧图片都会检测,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。

    1.2.7.1 根据图片进行检测
    FaceInfo[] detect(BDFaceSDKCommon.DetectType type,BDFaceImageInstance imageInstance)
    参数名 含义
    detectType 检测类型
    imageInstance 图片数据信息
    FaceInfo[] 返回参数(人脸参数信息)
    1.2.7.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[] 返回参数(人脸参数信息)

    1.2.8 人脸跟踪-多人脸检测(接口只支持RGB追踪)

    说明:视频人脸跟踪检测,追踪图片中多个人脸信息,通过参数 num 配置,接口包含检测和跟踪功能,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。 该接口只支持RGB检测和对齐;

    FaceInfo[] track(DetectType detectType, BDFaceImageInstance imageInstance)
    参数名 含义
    detectType 检测类型(DETECT_VIS )
    imageInstance 图片数据信息
    FaceInfo[] 返回参数(人脸参数信息)

    1.2.9 人脸跟踪-多人脸检测

    说明:视频人脸跟踪检测,追踪图片中多个人脸信息,通过参数 num 配置,接口包含检测和跟踪功能,返回基本人脸信息和72 关键点,可以绘制人脸框,描绘眼耳鼻嘴关键点,也可作用于后续活体,特征抽取入参。

    FaceInfo[] track(BDFaceSDKCommon.DetectType detectType, BDFaceSDKCommon.AlignType alignType,BDFaceImageInstance imageInstance)
    参数名 含义
    detectType 检测类型
    alignType 对齐类型
    imageInstance 图片数据信息
    FaceInfo[] 返回参数(人脸参数信息)

    1.2.10 人脸抠图

    说明:根据人脸检测结果扣图,扣图结果为矫正之后的人脸信息

    public BDFaceImageInstance cropFace(BDFaceImageInstance imageInstance, float[] landmark)
    参数名 含义
    imageInstance 图片数据信息
    landmark 检测后产出数据
    扣图图像信息,包含宽,高,图片类型,图片数据

    返回值:扣图图像信息,包含宽,高,图片类型,图片数据

    BDFaceImageInstance

    1.2.11 检测模型卸载

    void uninitModel()

    1.3 FaceLive 活体接口

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    public FaceLive()
    // 有参构造调用(执行自己创建的instance )
    public FaceLive(BDFaceInstance thisBdFaceInstance)
    参数名 含义
    thisBdFaceInstance 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例

    1.3.1 活体模型加载

    说明:静默活体检测模型初始化,可见光活体模型,深度活体,近红外活体模型初始化

    void initModel(final Context context,final String visModel,final String nirModel, final String depthModel,final Callback callback)
    参数名 含义
    context 上下文context
    visModel 可见光图片活体模型
    depthModel 深度图片活体模型
    nirModel 红外图片活体模型
    callback 模型加载结果 void onResponse(int code, String response)
    code : 请参照此文档 1.1.6 code返回值
    response 结果信息

    1.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

    1.3.3 活体模型卸载

    说明:静默活体模型卸载

    void uninitModel()

    1.4 FaceFeature 特征抽取接口

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    public FaceFeature() 
    // 有参构造调用(执行自己创建的instance )
    public FaceFeature(BDFaceInstance thisBdFaceInstance) 
    参数名 含义
    thisBdFaceInstance 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例

    1.4.1 特征模型加载

    说明:离线特征获取模型加载,目前支持可见光模型,近红外检测模型(非必要参数,可以为空),证件照模型;用户根据自己场景,选择相应场景模型

    1.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 结果信息
    1.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 结果信息

    1.4.2 特征提取

    说明:离线特征提取接口,通过featureType 提取不同图片特征数据,函数返回特征个数,特征存储在feature 参数中

    1.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个特征数据
    1.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个特征数据

    1.4.3 特征比对

    说明:离线特征比对结果,分值为0--100 之间

    float featureCompare(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 比对结果

    1.4.4 1:N特征设置

    说明:特征集合预加载接口,继承Feature,必须初始化id 和 feature 字段,用于1:N 内部实现和数据返回。

    public int featurePush(List<? extends Feature> features)
    参数名 含义
    features 特征集合

    1.4.5 1:N特征比对

    说明:当前feature和预加载Feature 集合比对,返回预加载Feature集合中命中的id,feature 字段和比对分值score;用户可以通过id 在数据库中查找全量信息。

    ArrayList<Feature> featureSearch(byte[] firstFaceFeature, FeatureType featureType,int topNum, boolean isPercent)
    参数名 含义
    firstFaceFeature 当前检查人脸特征值
    featureType FeatureType.FEATURE_VIS生活照
    FeatureType.FEATURE_ID_PHOTO证件照
    topNum 获取前num 个feature+id映射数组
    isPercent 控制参数:true返回0~100数值;false 返回0~1
    Feature 检索底库中检索到的feature+id映射数组

    1.4.6 卸载特征模型

    void uninitModel()

    1.5 BDFaceImageInstance 图片接口

    1.5.1 图片构造

    说明:创建图片对象

    BDFaceImageInstance(byte[] data, int height, int width,BDFaceSDKCommon.BDFaceImageType imageType, float angle, int isMbyteArrayror)
    参数名 含义
    data 图片字节数
    height 图片高
    width 图片宽
    imageType 图片类型
    angle 图片旋转角度
    isMbyteArrayror 是否镜像

    1.5.2 图片构造

    说明:创建图片对象

    BDFaceImageInstance(Bitmap bitmap)
    参数名 含义
    bitmap 图片bitmap

    1.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 数据生效)

    1.5.4 图像句柄创建(Bitmap 图像信息)

    说明:创建图片对象

    BDFaceImageInstance(Bitmap bitmap)
    参数名 含义
    bitmap 图片bitmap

    1.5.5 图片信息获取(送检)

    说明:如果需要校验底层图片,通过该接口获取底层送检图片信息数据

    BDFaceImageInstance getImage()

    1.5.6 图片销毁

    说明:销毁图片对象,每一帧图像数据使用完之后,必须调用,否着会出现内存溢出

    int destory();

    1.6 FaceGaze注意力检测接口

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    public FaceGaze() 
    // 有参构造调用(执行自己创建的instance )
    public FaceGaze(BDFaceInstance thisBdFaceInstance) 
    参数名 含义
    thisBdFaceInstance 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例

    1.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 结果信息

    1.6.2 注意力状态获取

    说明:通过图片和关键点获取眼睛注意力状态信息

    public BDFaceGazeInfo gaze(BDFaceImageInstance imageInstance, float[] landmarks)
    参数名 含义
    bdFaceImageInstance 图像对象
    landmarks 检测后landmark

    1.6.3 注意力模型卸载

    说明:注意力模型卸载

    void uninitGazeModel()

    说明:0表示成功,非0失败

    1.7 FaceDriverMonitor 驾驶行为监测

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    FaceDriverMonitor()
    // 有参构造调用(执行自己创建的instance )
    FaceDriverMonitor(BDFaceInstance thisBdFaceInstance)
    1.7.1 驾驶行为监测能力加载

    说明:加载驾驶行为监测能力

    void initDriverMonitor(final Context context, final String driverMonitorModel, final Callback callback)
    参数名 含义
    context 上下文context
    driverMonitorModel 驾驶行为监测模型路径
    callback 模型加载结果 void onResponse(int code, String response)
    code : 请参照此文档 2.1.7 code返回值
    response 结果信息
    1.7.2 驾驶行为监测能力能力卸载
    void uninitDriverMonitor()
    1.7.3 驾驶行为监测检测
    public BDFaceDriverMonitorInfo driverMonitor(BDFaceImageInstance imageInstance,
                                             FaceInfo faceinfo)
    参数名 含义
    imageInstance 图片数据信息
    FaceInfo 人脸参数信息(需要包含人脸检测的人脸框数据)
    BDFaceDriverMonitorInfo 返回参数:驾驶行为监测结果

    1.8 FaceCrop抠图能力接口

    说明:可以根据人脸框或者人脸关键点进行抠图(该功能3.2及以下版本不支持)

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    FaceCrop()
    // 有参构造调用(执行自己创建的instance )
    FaceCrop(BDFaceInstance thisBdFaceInstance)

    1.8.1 initFaceCrop抠图能力加载

    void initFaceCrop(final Callback callback) 
    参数名 含义
    callback 鉴权结果 void onResponse(int code, String response)
    code : 请参照此文档 1.1.6 code返回值
    response 结果信息

    1.8.2 uninitFaceCrop抠图能力卸载

    int uninitFaceCrop()
    参数名 含义
    int 0 success;other 参数异常;

    1.8.3 cropFaceByBox使用人脸框进行人脸抠图

    public static BDFaceImageInstance cropFaceByBox(BDFaceImageInstance imageInstance, FaceInfo faceinfo, float enlargeRatio, AtomicInteger isOutofBoundary)
    参数名 含义
    imageInstance 图片数据信息
    faceinfo 包含人脸框的人脸信息
    enlargeRatio 抠图放大倍数
    isOutofBoundary 抠图是否:是否超出图像范围(是否有黑边) 0为未超出,1为超出

    1.8.4 cropFaceByLandmark使用人脸关键点进行人脸抠图

    public BDFaceImageInstance cropFaceByLandmark(BDFaceImageInstance imageInstance,
                                                      float[] landmark,
                                                      float enlargeRatio,
                                                      boolean correction,
                                                      AtomicInteger isOutofBoundary)
    参数名 含义
    imageInstance 图片数据信息
    landmark 检测后产出数据
    enlargeRatio 抠图放大倍数
    correction 是否进行人脸矫正
    isOutofBoundary 抠图是否:是否超出图像范围(是否有黑边) 0为未超出,1为超出

    1.9 FaceMouthMask口罩检测接口

    说明:4.0及以上版本支持该功能

    构造方法:

    // 无参构造调用(执行默认创建的instance )
    public FaceMouthMask() 
    // 有参构造调用(执行自己创建的instance )
    public FaceMouthMask(BDFaceInstance thisBdFaceInstance) 
    参数名 含义
    thisBdFaceInstance 绑定指定的BDFaceInstance实例,否则使用默认的BDFaceInstance实例

    1.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 结果信息

    1.9.2 口罩检测结果获取

    说明:通过图片和人脸框数据获取口罩检测置信度数据,0代表不戴口罩,1代表戴口罩

    float[] checkMask(BDFaceImageInstance imageInstance, FaceInfo[] faceInfos)
    参数名 含义
    imageInstance 图像信息
    faceInfos 人脸框数据
    float[] 返回的戴口罩置信度

    1.9.3 口罩检测模型卸载

    说明:卸载口罩检测模型

    int uninitModel()

    说明:0表示成功,非0失败

    1.10 实体类说明

    1.10.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;
       
    }

    1.10.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_VALUE_MESSAGE,   // 打印输出值日志
            BDFACE_LOG_ERROR_MESSAGE,   // 打印输出错误日志
            BDFACE_LOG_ALL_MESSAGE,     // 打印所有日志
        }
    
        public enum BDFaceAnakinRunMode {
            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   // 轮流绑定小核模式
        }
    }	

    1.10.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;        // 下巴遮挡置信度
        } 

    1.10.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;
    
    }

    1.10.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;
    }

    1.10.6 BDFaceGazeInfo 实体类

       public class BDFaceGazeInfo {
        public float leftEyeConf;                // 左眼的置信度
        public float rightEyeConf;               // 右眼的置信度
        public BDFaceGazeDirection leftEyeGaze;  // 左眼的注意力信息
        public BDFaceGazeDirection rightEyeGaze; // 右眼的注意力信息
        } 

    1.10.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;
        } 

    1.10.8 BDFaceDriverMonitorInfo 驾驶检测结果信息

    public class BDFaceDriverMonitorInfo {
        float normal = 0;    // 行为正常
        float calling = 0;   // 打电话
        float drinking = 0;  // 喝水
        float eating = 0;    // 吃东西
        float smoking = 0;   // 抽烟
    }

    1.11 版本更新注意说明

    1.11.1 4.0及以上版本口罩检测能力使用

    说明:4.0及以上版本的SDK支持口罩检测能力(检测用户是否佩戴口罩),而不是戴口罩场景下的人脸识别能力。若有戴口罩场景下人脸识别能力的需求请点击进行咨询:咨询

    4.0.0及以上版本中的口罩检测能力对应的代码区块(获取口罩分值的代码区块)如下:

    4.0.0口罩检测代码区块1

    4.0.0口罩检测代码区块2

    1.11.2 3.0/3.1版本升级到3.2版本

    对于从3.0或3.1版本,升级到3.2.0版本的老用户,请注意修改以下区域的代码,避免无法正常使用SDK。

    3.0及3.1的位置 3.2需要修改的位置

    2、示例参考

    2.1 功能介绍

    为了方便您快速体验新版SDK的能力,我们为您构建了一个简易的示例工程,包含了人脸识别端上的常用能力,并配以带有交互的UI界面,希望能更直接地让您理解此版SDK的功能。同时,您也可以基于此示例工程进行二次开发,快速构建Demo或业务工程。

    1. 多种鉴权模式:提供序列号、离线License文件授权的可视化方式。
    2. 人脸注册:提供全屏跟踪人脸注册,和固定区域人脸注册,满足不同业务场景要求。
    3. 1:N识别:提供完整的1:N识别功能和界面设计。
    4. 调试模式:提供多种模态的预览图界面、各模型的实际应用耗时,方便用于评估应用性能。
    5. 多模态活体检测:提供预设的无活体、RGB活体、RGB+NIR活体、RGB+Depth四种活体设置,并预设适配镜头能力。
    6. 人脸库管理:提供库、组、用户的三层人脸库管理逻辑,并支持可视化批量导入功能。
    7. 人证比对:提供证件照模型,并预设在1:1功能中,支持实时采集和照片两种录入模式。
    8. 高级设置:支持质量检测、活体模态、检测模态等多项可视化配置能力,方便直接上手调节使用。

    2.2 代码结构

    2.2.1 核心库介绍

    facelibrary是SDK的依赖库。

    lib目录为动态库so和jar包,包含arm64-v8aarmeabi-v7a两个平台。

    名称 功能
    libbdface_sdk.so 人脸核心库
    libbd_license.so、libliantian.so 授权核心库
    libaikl_calc_arm.so、libaikl_cluster_arm.so 加速算法核心库

    assets目录为模型文件。

    名称 功能 是否必须
    detect 人脸检测核心模型
    align 人脸对齐核心模型
    blur、occlusion 质量检测模型
    slient_live 活体检测模型
    feature 识别核心模型

    java目录为用户组管理、人脸SDK操作、视频流、图片等操作辅助类

    2.2.2 示例代码结构

    名称 功能
    SplashActivity 主页,显示版本号等相关信息
    MainActivity 主功能页面,包含人脸检索,认证比对,功能设置,授权激活功能入口
    FaceAuthActicity 授权页面,目前支持离线授权和在线激活码授权,更多授权功能,参考开发文档
    FaceMainSearchActivity 1:N 人脸检索,包含人脸搜索,人脸注册,人脸库管理,批量导入功能入口
    FaceRGBOpenDebugSearchActivity
    FaceRGBCloseDebugSearchActivity
    启动RGB 摄像头配置,1:N 人脸搜索,包含调试页面和非调试页面
    FaceRGBIROpenDebugSearchActivity
    FaceRGBIRCloseDebugSearchActivity
    启动RGB+NIR 双目摄像头配置,1:N 人脸搜索,包含调试页面和非调试页面
    FaceRGBDepthOpenDebugSearchActivity
    FaceRGBDepthCloseDebugSearchActivity
    启动RGB+Depth 结构光摄像头配置,1:N 人脸搜索,包含调试页面和非调试页面
    FaceRegisterActivity 人脸注册
    BatchImportActivity 人脸库管理,批量导入功能
    FaceIdCompareActivity 1:1 人证对比,包括选择证件照图片和视频流实时采集人脸进行人脸识别比对,根据比对的结果分数确认是否为同一个人,核验是否通过。
    SettingMainActivity 参数设置界面入口
    FaceDetectAngleActivity 人脸检测角度设置,用于调整实际送去人脸检测的图片的角度,包括0,90,180,270。SDK只能识别人脸朝上的人脸。
    CameraDisplayAngleActivity 摄像头视频流回显角度
    MinFaceActivity 最小人脸设置
    RecognizeModleThresholdActivity 人脸识别相似度阈值设置,默认值是90。根据次阈值可以判读人脸是否识别成功。
    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的活体硬件设备适配还在开发中,敬请期待。
    FaceLivenessThresholdActivity 活体阈值设置,活体阈值设置,包括RGB活体阈值,NIR活体阈值,Depth活体阈值。默认值是0.9,活体分数达到0.9左右可以判断活体通过
    DetectTrailStrategyActivity 检测追踪策略设置
    DebugModeActivity 调试模式配置
    RecognizeModleTypeAcctivity 识别模型选择
    DetectFllowStrategyActivity 检测跟踪策略
    QualityControlActivity 人脸采集质量参数设置,包括模糊度,遮挡和光照的设置。开启质量检测会增加耗时,性能也会下降,默认情况下是不开启质量检测。
    MirrorSettingActivity 镜像调节页面

    2.3 开始集成

    2.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, final SdkInitListener listener) 
    • 参数说明:
    参数 含义
    context 上下文
    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)

    2.3.2 人脸注册

    进入该功能之后首先需要录入输入用户名+组名,用户名要求不能含有特殊符号,要求不能超过30个字符,填入成功之后才可进入视频流实时采集页面。FaceRegisterActivity是注册页面。采集页面将会执行人脸检测、人脸活体检测、特征值提取功能。前面都通过即执行注册,注册成功后并将注册成功的图片保存到本地。您可以根据实际使用的硬件进行选择。

    注一:为了使注册的图片达到较高的质量,注册默认开启质量检测与远近距离校验。设置里的质量检测开关对注册页面不起作用。

    注二:为了使注册效果更好。所有活体状态下注册默认开启固定区域检测,设置里的检测跟踪策略对注册页面不起作用。

    1)注册采集,可选择一下3种方式返回人脸

    • FaceRGBRegisterActivity:无活体或RGB活体(活体检测成功后,注册人脸)
    • FaceIRRegisterActivity:进行RGB+NIR活体成功后注册人脸
    • FaceDepthRegisterActivity:进行RGB+Depth活体成功后注册人脸(目前仅支持奥比中光Atlas镜头)

    下面是检测相关代码:

        private void faceDetect(byte[] data, final int width, final int height) {
            // 摄像头预览数据进行人脸检测
            int liveType = SingleBaseConfig.getBaseConfig().getType();
            if (liveType == 1) { // 无活体检测
                FaceTrackManager.getInstance().setAliving(false);
            } else if (Integer.valueOf(liveType) == 2) { // 活体检测
                FaceTrackManager.getInstance().setAliving(true);
            }
            FaceTrackManager.getInstance().faceTrack(data, width, height, new FaceDetectCallBack() {
                @Override
                public void onFaceDetectCallback(LivenessModel livenessModel) {
                    checkResult(livenessModel);
                }
            });
        }

    下面是活体判断相关代码:

        int liveType = SingleBaseConfig.getBaseConfig().getType();
            // 无活体
            if (Integer.valueOf(liveType) == 1) {
                displayResult(model, null);
                // 注册
                register(model);
            } else if (Integer.valueOf(liveType) == 2) { // RGB活体检测
                displayResult(model, "livess");
                boolean livenessSuccess = false;
                float rgbLiveThreshold = SingleBaseConfig.getBaseConfig().getRgbLiveScore();
                livenessSuccess = (model.getRgbLivenessScore() > rgbLiveThreshold) ? true : false;
                if (livenessSuccess) {
                    // 注册
                    register(model);
                }
            }

    下面是人脸特征提取的代码:

        // 获取选择的特征抽取模型
            int modelType = SingleBaseConfig.getBaseConfig().getActiveModel();
            if (modelType == 1) {
                // 生活照
                FaceSDKManager.getInstance().onFeatureCheck(model.getBdFaceImageInstance(), model.getLandmarks(),
                        BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, new FaceFeatureCallBack() {
                            @Override
                            public void onFaceFeatureCallBack(float featureSize, byte[] feature) {
                                displayCompareResult(featureSize, feature);
                                Log.e("qing", String.valueOf(feature.length));
                            }
    
                        });
    
            } else if (Integer.valueOf(modelType) == 2) {
                // 证件照
                FaceSDKManager.getInstance().onFeatureCheck(model.getBdFaceImageInstance(), model.getLandmarks(),
                        BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO, new FaceFeatureCallBack() {
                            @Override
                            public void onFaceFeatureCallBack(float featureSize, byte[] feature) {
                                displayCompareResult(featureSize, feature);
                            }
                        });
            }

    下面是将特征值及用户信息注册到人脸库的代码:

         // 根据特征抽取的结果 注册人脸
         private void displayCompareResult(float ret, byte[] faceFeature) {
            // 特征提取成功
            if (ret == 128) {
                String imageName = groupId + "-" + username + ".jpg";
                // 注册到人脸库
                boolean isSuccess = FaceApi.getInstance().registerUserIntoDBmanager(groupId, username, imageName,
                        userInfo, faceFeature);
                if (isSuccess) {
                    // 关闭摄像头
                    CameraPreviewManager.getInstance().stopPreview();
                    Log.e("qing", "注册成功");
                    // 数据变化,更新内存
                    FaceApi.getInstance().initDatabases(true);
                    // 防止重复注册
                    username = null;
                    groupId = null;
                }else {
                    // 注册失败
                }
            } else if (ret == -1) {
                displayTip("特征提取失败");
            } else {
              // 特征提取失败
            }
        }

    参数填写时请注意:

    1. 用户名为必填项,支持英文与数字。
    2. 用户组为可选项,不填默认生成名为default 的用户组;
    3. 用户信息可不填,用于其他需求;
    4. 注册成功后生成的图片命名格式为group-username.jpg,保存在sdcard下的Success-Import文件夹下,用于人脸库的图片显示。

    2.3.3 1:N识别

    RGB搜索

    • 非Debug模式:FaceRGBCloseDebugSearchActivity
    • Debug模式:FaceRGBOpenDebugSearchActivity
    • 打开预览:
    public void startPreview(Context context, AutoTexturePreviewView textureView, int width,int height, CameraDataCallback cameraDataCallback) 
    • 参数说明:
    参数 含义
    context 上下文
    textureView 帧图像预览数据
    width 图片的宽
    height 图片的高
    cameraDataCallback 数据结果回调
    • 接口调用:
    // 设置相机的ID
    CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_USB);
    // 开启预览
    CameraPreviewManager.getInstance().startPreview(this, mAutoCameraPreviewView,
                    PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback())
    • 人脸检索(包含检测、活体、特征、人脸搜索全流程)
    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(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()

    2.3.4 人脸库管理

    批量导入

    本功能下支持批量导入人脸图片数据,用于将图片录入到人脸库中,即批量注册。该过程不进行活体检测,仅执行批量人脸特征值生成录入,每张图片提取一张最大人脸做为注册人脸,人脸图片较多时可能会耗时较长,请耐心等待。

    	// 走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值
        ret = FaceApi.getInstance().getFeature(bitmap, bytes, 
    	   BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
        LogUtils.i(TAG, "live_photo = " + ret);

    使用步骤:

    1. 在SD卡根目录,创建一个文件夹,命名为Face-Import
    2. 将需要导入的每个图片,文件名示例为 username-group.jpg ,即用户名-用户组名的文件命名方式。
    3. 新建一个压缩文件,命名为Face.zip,将人脸图片全部放到该zip下,并将zip文件放置到Face-Import目录下。
    4. 点击下方按钮开始解压操作,批量注册时间较长,请耐心等待,不要关闭此窗口。

    其中:

    批量导入的接口如下:

    public void batchImport();

    获取压缩包导入目录相关代码:

    	// 获取导入目录 /sdcard/Face-Import
        File batchFaceDir = FileUtils.getBatchImportDirectory();

    遍历该目录下的所有文件相关代码:

    	// 遍历该目录下的所有文件
        String[] files = batchFaceDir.list();
        if (files == null || files.length == 0) {
            LogUtils.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 void getUserGroupInfo(String groupId, 
      		UserInfoListener listener)

    参数:

    参数类型 参数名称 取值范围 说明
    String groupId 可为空 要查询的组名称,为null则全局查询
    UserInfoListener licenser 不可为空 用于返回结果
    • 删除组列表信息:
    	public void deleteUserGroupListInfo(List<Group> list, 
    		UserInfoListener listener, int selectCount);

    参数:

    参数类型 参数名称 取值范围 说明
    List<Group> list 不可为空 用户组列表信息集合
    UserInfoListener licenser 不可为空 用于返回结果
    int selectCount 不可为空 暂时未用到

    用户列表信息管理

    该页面主要是查询、删除用户列表操作。

    • 获取用户列表信息:
    	public void getUserListInfoByGroupId(String userName, 
    		String groupId, UserInfoListener listener)

    参数:

    参数类型 参数名称 取值范围 说明
    String userName 可为空 要查询的用户名称,为null则全局查询
    String groupId 不可为空 要查询的组名称
    UserInfoListener licenser 不可为空 用于返回结果
    • 删除用户列表信息:
    	public void deleteUserListInfo(List<User> list, 
    		UserInfoListener listener, int selectCount);

    参数:

    参数类型 参数名称 取值范围 说明
    List<User> list 不可为空 用户列表信息集合
    UserInfoListener licenser 不可为空 用于返回结果
    int selectCount 不可为空 暂时未用到

    用户详情信息管理

    该页面主要有用户详细信息展示、删除以及用户图片替换功能。

    • 用户删除:
    	public void deleteUserInfo(String userId, String groupId, 
    		final UserInfoListener listener);

    参数:

    参数类型 参数名称 取值范围 说明
    String userId 不可为空 当前用户id
    String groupId 不可为空 当前组id
    UserInfoListener licenser 不可为空 用于返回结果
    • 打开相机:
    	// 获取根路径
        File root = Environment.getExternalStorageDirectory();
        // 保存的图片文件
        mImageFile = new File(root, "test.jpg");
        Uri uri = Uri.fromFile(mImageFile);
        Intent intent = new 
    	    Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, requestCode);
    • 打开相册:
    	Intent intent = new Intent(Intent.ACTION_PICK,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, REQUEST_LOAD_IMAGE);    
    • 更换图片:
    public void updateImage(Bitmap bitmap, String groupId, 
    String userName, String imageName, UserInfoListener listener);

    参数:

    参数类型 参数名称 取值范围 说明
    Bitmap bitmap 不可为空 从相册或相机返回的图片
    String groupId 不可为空 当前组id
    String userName 不可为空 当前用户名
    String imageName 不可为空 当前图片名
    UserInfoListener licenser 不可为空 用于返回结果

    2.3.5 人证比对

    模拟真实场景下,人脸图片与证件照图片(如小图、身份证芯片照)对比的业务流程,特征抽取默认使用「证件照模型」,以处理对比过程中的证件照图片特征抽取的要求(证件照图片普遍像素较低)。配套使用的活体检测功能,需要在设置-->镜头及活体检测模式中单独选择对应的已经适配的镜头。

    比对完成返回核验结果与相似度分值,分值大于相似度阈值则表示核验通过,反之核验不通过。

    :SDK只检测人脸朝上的人脸。

    从视频流中采集两张人脸图片进行对比

    此种方式的人脸图片需要从视频流中实时采集,如果为无人值守情况,还需配备活体检测以保障业务安全。FaceIdCompareActivity是比对页面,根据活体策略选择相应的实现,开发者可以根据实际使用的硬件进行选择。

    采集人脸,可选择一下3种方式返回人脸

    • FaceRGBDetectActivity:无活体或RGB活体(活体检测成功后,返回检测到的人脸)
    • FaceIRLivenessActivity:进行RGB+NIR活体成功后返回检测到RGB人脸
    • FaceDepthLivenessActivity:进行RGB+Depth活体成功后返回检测到RGB人脸(奥比中光Atlas镜头)

    1)根据返回人脸抽取特征

        private void syncFeature(final Bitmap bitmap, final byte[] feature, final int index, boolean isFromPhotoLibrary) {
            float ret = -1;
            BDFaceImageInstance rgbInstance = new BDFaceImageInstance(bitmap);
            FaceInfo[] faceInfos = FaceSDKManager.getInstance().getFaceDetect()
                    .detect(BDFaceSDKCommon.DetectType.DETECT_VIS, rgbInstance);
            // 检测结果判断
            if (faceInfos != null && faceInfos.length > 0) {
    
                // 判断质量检测,针对模糊度、遮挡、角度
                if (qualityCheck(faceInfos[0], isFromPhotoLibrary)) {
                    ret = FaceSDKManager.getInstance().getFaceFeature().feature(BDFaceSDKCommon.FeatureType.
                            BDFACE_FEATURE_TYPE_ID_PHOTO, rgbInstance, faceInfos[0].landmarks, feature);
                    Log.i("qing", "ret:" + ret);
                    if (ret == 128 && index == 1) {
                        firstFeatureFinished = true;
                    } else if (ret == 128 && index == 2) {
                        secondFeatureFinished = true;
                    }
                    if (ret == 128) {
                        toast("图片" + index + "特征抽取成功");
                    } else if (ret == -100) {
                        toast("未完成人脸比对,可能原因,图片1为空");
                    } else if (ret == -101) {
                        toast("未完成人脸比对,可能原因,图片2为空");
                    } else if (ret == -102) {
                        toast("未完成人脸比对,可能原因,图片1未检测到人脸");
                    } else if (ret == -103) {
                        toast("未完成人脸比对,可能原因,图片2未检测到人脸");
                    } else {
                        toast("未完成人脸比对,可能原因,"
                                + "人脸太小(小于sdk初始化设置的最小检测人脸)"
                                + "人脸不是朝上,sdk不能检测出人脸");
                    }
                }
    
            } else {
                toast("未检测到人脸,可能原因人脸太小");
            }
    
        }

    2)比对两张人脸图片

         private void match() {
            if (!firstFeatureFinished) {
                toast("图片一特征抽取失败");
                return;
            }
            if (!secondFeatureFinished) {
                toast("图片二特征抽取失败");
                return;
            }
            int idFeatureValue = SingleBaseConfig.getBaseConfig().getThreshold();
            float score = 0;
            //  比较两个人脸
            score = FaceSDKManager.getInstance().getFaceFeature().featureCompare(
                    BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
                    firstFeature, secondFeature, true);
            if (score > idFeatureValue) {
                tvState.setTextColor(getResources().getColor(R.color.buttonBg));
                tvState.setText("核验通过");
            } else {
                tvState.setTextColor(getResources().getColor(R.color.red));
                tvState.setText("核验不通过");
            }
        }

    2.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();

    2.4 核心类说明

    FaceSDKManager

    功能:负责初始检测类FaceAuth、FaceDetector、FaceFeature、FaceLiveness com.baidu.idl.face.main.manager

    FaceDetector

    功能:人脸检测封装类,包含人脸检测功能初始化、人脸检测接口调用 com.baidu.idl.main.facesdk

    FaceFeatures

    功能:人脸特征抽取封装类,包含人脸特征抽取功能初始化、人脸特征抽取接口调用 com.baidu.idl.main.facesdk

    FaceLiveness

    功能:人脸活体相关操作封装类,包含人脸rgb、ir、depth活体检测 com.baidu.idl.main.facesdk

    FaceTrackManager

    功能:主要是对人脸检测、质量检测的封装 com.baidu.idl.face.main.manager

    ImportFileManager

    功能:批量导入的相关操作 com.baidu.idl.face.main.manager

    UserInfoManager

    功能:人脸库管理相关操作 com.baidu.idl.face.main.manager

    DBManager

    功能:数据库相关操作 com.baidu.idl.face.main.db

    3、参考方案

    为了更好地在不同环境下应用SDK的能力,我们为了简单整理了一些常见的场景应用策略以供参考。

    3.1 质量控制

    人脸采集是人脸识别业务过程中至关重要的一环。因为设备端一般是从动态视频流中采集人脸,如果采集到的图像质量不佳,那么很难得到期望的业务结果,造成的影响主要如下:

    • 1:N出现「串脸」:由于采集的图片质量不佳,并注册为1:N的底库,将较高频地出现误识情况。
    • 活体通过率不高:人脸质量不佳时,活体检测过程中,往往难以判断为活体,造成难以认证为真人的结果。
    • 人证比对精度不高:一般为生活照vs证件照,如果生活照质量很差,往往会使核验难以得到符合事实的相似度,造成核验一直失败。

    质量指标要求

    如何定义采集到的人脸是一张比较符合要求?从常规图片要求角度,需要确保以下几点:

    • 人脸角度:人脸正面向前,俯仰角、倾斜角、图像旋转角度尽可能较小,以证件照拍摄的照片角度为佳。如果采集条件有限,确保这三个角度都不要超过20°范围。
    • 面部光线:面部区域光线均匀。脸部不应有明显的阴影、过曝、欠曝情况。基于SDK的光照判断,灰度值范围为[0-255],应保持在40以上,80~200之间为最佳。如在室外逆光或强光照射,请使用具备宽动态能力的镜头模组进行动态曝光平衡;或者在设备上增加一些遮挡;在此基础上,也可以在设备上添加补光灯,以保证面部光线符合正常。
    • 人脸模糊度:运动模糊应小于0.15(注册图像可要求到0.13),高斯模糊应小于0.25(注册图像可要求到0.20)。
    • 图像分辨率:图片的分辨率尽量不要小于640*480。
    • 人脸完整度:图片全景情况下,可以准确识别人脸对象。轮廓清晰,无口罩、帽子、深色墨镜遮挡,无浓妆。对于戴眼镜用户,尤其眼镜框不可遮挡眼镜区域(特指镜框),镜片应无色或不严重反光。人脸各区域的遮挡按照[0-1]标识遮挡面积的话,每个部分不可遮挡面积超过0.8,遮挡面积越小越好。
    • 人脸表情:眼睛自然睁开,嘴唇自然闭合或微张。不要有明显搞怪或幅度过大的表情。
    • 人脸大小:人脸瞳间距不小于60px,或人脸轮廓长宽不小于100px。
    • 图像几何失真:镜头输出的图像,几何失真不应大于10%,具体数值可咨询镜头模组厂商,或查看镜头出厂报告。

    注意:在1:N业务中,我们非常不推荐使用证件照作为N的底库,这将造成大量误识情况,请您尽量保证N底库中的人脸图片质量,质量越高越好。

    SDK预设指标

    在SDK示例工程中,我们为您选择了一些默认配置,您可以根据要求调整这些采集阈值,从而让采集条件更加严格、或者更加宽松。

    	// 默认为80px。可传入大于50px的数值,小于此大小的人脸不予检测
        private int minimumFace = 60;
        
        // 模糊度设置,默认0.5。取值范围[0~1],0是最清晰,1是最模糊
        private float blur = 0.5f;
        
        // 光照设置,默认40。取值范围[0~255], 数值越大,光线越强
        private int illumination = 40;
        
        // 姿态阈值,姿态角越小,要求采集越严格,则人脸角度更正。
        private float gesture = 15;
        // 三维旋转之俯仰角度[-90(上), 90(下)],默认20
        private float pitch = 20;
        // 平面内旋转角[-180(逆时针), 180(顺时针)],默认20
        private float roll = 20;
        // 三维旋转之左右旋转角[-90(左), 90(右)],默认20
        private float yaw = 20;
        
        // 遮挡阈值,阈值越小,遮挡检查越严格,0为不允许有遮挡。
        private float occlusion = 0.6f;
        // 左眼被遮挡的阈值,默认0.6
        private float leftEye = 0.6f;
        // 右眼被遮挡的阈值,默认0.6
        private float rightEye = 0.6f;
        // 鼻子被遮挡的阈值,默认0.7
        private float nose = 0.7f;
        // 嘴巴被遮挡的阈值,默认0.7
        private float mouth = 0.7f;
        // 左脸颊被遮挡的阈值,默认0.8
        private float leftCheek = 0.8f;
        // 右脸颊被遮挡的阈值,默认0.8
        private float rightCheek = 0.8f;
        // 下巴被遮挡阈值,默认为0.6
        private float chinContour = 0.6f;
        
        // 人脸完整度,默认为1。0为人脸溢出图像边界,1为人脸都在图像边界内
        private float completeness = 1f;

    业务侧建议

    因为人脸采集环节很多情况下是从终端用户侧操作,如手机、采集设备、甚至是现有业务系统存着的图片,所以尽量在业务软件界面中,给客户友好的提示,以取得用户的主动配合,例如:

    1. 提供示例的采集标准图片:直观地让用户更好地理解如何拍摄图片。
    2. 在采集界面加入人脸轮廓框:有利于引导用户主动配合,从而控制人脸角度和大小。
    3. 做质量校验,并提供友好反馈提示:如果用户拍摄的图片没有满足某个质量要求,可以得到明确反馈并调整。
    4. 尽量不使用模糊的证件照片:尽量使用采集的生活照图片,不要用身份证芯片照作为识别主体,除非为人证核验1:1场景。

    3.2 活体选型

    活体基础原理

    镜头选型,除了光学成像效果外,核心关联的为活体模态的要求,可以基于业务环境特点和对活体安全的要求,灵活选择活体模态。以下为SDK提供的三种活体模态能力组合:

    • RGB可见光活体:可见光单目镜头。主要基于图片破绽,判断目标对象是否为活体。例如图像中的屏幕反光、成像畸形等,最主要的应用情形为屏幕的二次翻拍等攻击防御。此种活体对于待检测图片的要求,主要需要满足画面中除了人脸以外,要尽可能保留一些背景内容,用于查找破绽,通常建议人脸与屏幕的长宽比为1:3。为控制达到此比例,建议通过调整最小检测人脸参数,控制采集的人脸不可过大,避免人脸面积占比过高,而导致图片中没有多少背景信息。同时RGB活体受光线影响较大,所以在强光、暗光等场景,容易数值波动较大,主要影响的是「通过率」,产品策略上需要通过适当的补光、使用宽动态镜头抵消逆光等方式缓解。
    • RGB可见光+NIR近红外活体:在RGB可见光活体能力作用的同时,NIR活体为:基于近红外光线反射成像原理,通过人脸呈现来判断是否为活体。即使是夜间或者没有自然光的情况下,依然可以判断活体。因为其成像特点,对于屏幕、图片等攻击形式,基本可以达到近似于100%的活体防御。同时近红外设备的成本,相对性价比更高。
    • RGB可见光+Depth深度活体:在RGB可见光活体能力作用的同时,Depth活体为:结构光原理是通过主动光发射,在物体上形成光栅,并接受此信息进行活体分析。同样可以不需要自然光。3D结构光的成像更为稳定,抗攻击能力更强,对图像噪声的抗干扰能力也更强,是相对更加安全和稳定的方案,但相应的硬件设备造价也较高,需要根据实际业务成本预算,进行综合考虑。

    场景及应用方案

    • 通行场景:此场景通常保障通行速度为主,确保不影响通行秩序和效率。所以建议无需使用三重活体检测,可仅用NIR活体或Depth活体,保障效率同时仍可保证安全性。
    • 身份核验场景:此场景通常保障业务安全性为主,可尽可能提供更加安全的活体方案。如RGB+NIR,或者RGB+Depth,乃至RGB+NIR+Depth,最大程度确保对攻击的拒绝率较高。
    • 强光/暗光场景:光线较强的场景,RGB活体会受影响比较严重,建议使用NIR或者Depth活体,同时尽量通过产品策略避免这两种情况的光线,例如添加补光灯、配备遮光板等。

    应用方案及模组选择

    • 无需活体:如有人值守的场景下,活体检测并无太大的必要(活体检测也会增加额外的业务耗时),现有设备的单目USB摄像头即可。
    • 仅用RGB可见光活体:如果您的设备已经配备了USB单目摄像头,则无需更换,输出的RGB图像可直接用于RGB可见光活体算法识别。
    • RGB可见光+NIR近红外活体:需要配备能够同时获取RGB、NIR近红外数据的镜头使用。
    • RGB可见光+Depth深度活体:需要配备能够同时获取RGB、Depth深度图像数据的镜头使用。
    • RGB可见光+NIR近红外+Depth深度活体:此种方式安全度最高,目前SDK正在模组适配中,后续会陆续推出已适配的模组方案,敬请期待。

    活体指标解析

    活体检测存在几个标准的指标,如下所示:

    • 拒绝率(TRR):如99%,代表100次作弊假体攻击,会有99次被拒绝。
    • 误拒率(FRR):如0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
    • 通过率(TAR):如99%,指100次真人请求,会有99次因为活体分数高于阈值而通过。
    • 阈值(Threshold):高于此数值,则可判断为活体。

    温馨提示:此SDK涉及多种离线活体检测模型,加上镜头模组效果各异,使用环境也较为复杂,以下给出综合测试值,仅供参考:

    • 拒绝率:> 99.5%
    • 误拒率:< 1%
    • 通过率:> 99%

    阈值选择推荐

    活体分值区间为[0~1],大部分情况的活体攻击,活体分值近似于接近0.0,建议阈值如下,高于此阈值的即可判断为活体。

    • RGB可见光活体:0.8
    • NIR近红外活体:0.8
    • Depth深度活体(3D结构光):0.8

    3.3 底库大小

    SDK内不限底库大小,因模型精度相对于GPU版本大模型精度有限,一般推荐5w人脸以内,实际应用中5k以下人脸库数量最佳

    基于RK3288,5w级人脸库的检索耗时在20ms以内,并不会占用太大的耗时。人脸库大小的主要影响在于识别精度,建议合理运用人脸库大小,确保识别精度符合业务需求。

    3.4 数据同步

    同步图片

    此方案将从各采集终端的图片,由业务侧服务器进行映射user关系,并推送到各个识别终端,再由识别终端进行特征抽取。

    • 优点:服务端仅做业务同步功能,设备端特征抽取处理更加灵活。模型存在多个版本时,不同的设备即使使用不同的模型,也不会影响设备端识别,业务服务器无需更新,照常推送图片即可。
    • 缺点:传输数据量大;对于需要一边注册一边识别频繁的场景,端处理计算压力较大。

    同步特征值(即将推出)

    此方案在业务侧布设特征抽取服务能力,并保持特征抽取模型与端SDK的模型一致。应用此方案:

    • 优点:数据传输量小;端设备处理计算压力小;可频繁更新特征,具备灵活的业务拓展能力。
    • 缺点:端模型更新时,需要保持和服务端完全一致,如有任何一台设备模型没有对齐,则会识别效果会被严重影响。另外如果业务侧图片巨大后,更换模型后需要将这些图片重新提取特征,此时间段服务端的压力较大。

    3.5 鉴权选择

    我们为您提供三种鉴权方式,可以根据业务需要灵活选择。

    1. 在线鉴权-序列号:通过输入序列号进行在线联网激活,由于是序列号方式,方便授权的管理和二次分发,更容易控制应用范围。适合调试测试,或者按需分配的业务模式。适合随着项目少量交付的闸机、门禁设备。
    2. 离线鉴权-本地文件:可完全无网操作,导出License文件到设备本地即可。适合安全要求较高、或网络环境不佳的业务场景。如金融、政府类项目的人脸核验设备。
    3. 按应用批量鉴权:基于应用维度授权,设备必须可首次联网,SDK初始化时自动联网激活,并统计设备数量计费。适合于单品的大批量商用,如考勤机。
    上一篇
    产品定价
    下一篇
    常见问题