Android-人证核验工程
版本日志
版本 | 日期 | 说明 |
---|---|---|
v2.0.2 | 2019.04.01 | 1、全新人脸检测模型,检测追踪更流畅; 2、全新证件照模型,体积更小,速度更快; 3、部分接口细节优化; 3、版本号与主线SDK对齐 |
v1.1.0 | 2019.03.14 | 1、增加几款镜头模组支持;2、已知bug修复 |
V1.0.0 | 2019.01.10 | 人证核验示例工程初版 |
1、方案介绍
1.1 方案概述
人证核验方案,用于常见的1:1身份核验场景,用于证明用户的身份是否符实(即证明你是你)。常见的核验方式为以下几种:
- 身份证信息 vs 本人身份:常见操作为终端设备上存在身份证读卡器,用于读取身份证内部的芯片照,再与本人人脸信息进行1:1比对,确定当前待核验用户为证件本人。如交通卡口验证、身份核验机等。
- 系统ID信息 vs 本人身份:系统中记录的指定ID信息,通过人脸方式进行本人身份核验,如访客管理、会员验证、支付验证等。
核验终端设备,常置于无人看守场景,需要确保用户不可作弊,则在本人人脸获取过程中,增加活体检测能力,确保是真人操作。不同类型技术方案的活体检测,需要依赖不同的前端镜头模组,则衍生出多种硬件设备适配方案。
此示例工程旨在提供通用的人证核验功能及配套设置,并提供一定的软硬件搭配方案,帮助开发者快速完成人证核验的业务原型搭建,及效果评估。
1.2 适用场景
此示例工程所提供的方案,可广泛应用于1:1身份核验场景,用于满足用户是真人且是本人的业务诉求。
- 人证核验机
- 自助柜机
- 交通卡口身份核验
- 酒店前台核验机
- 社区门禁
- 访客管理
- ......
1.3 功能介绍
1.3.1 设备激活
示例工程中提供两种工程授权激活方式,皆是基于设备维度的授权:
- 在线激活:只需手动填写激活码,便可快速完成联网激活(仅需操作一次)
- 离线激活:在设备完全不可联网的情况下,可将授权文件置于SD卡中,工程会自动寻找授权文件并完成激活。
1.3.2 功能首页
工程首页中,提供几种核心功能的入口和功能说明,方便快速进行演示操作和业务逻辑验证。
1.3.3 人证比对演示
模拟真实场景下,人脸图片与证件照图片对比的业务流程,特征抽取默认使用「证件照模型」,以处理对比过程中的证件照图片特征抽取的要求(证件照图片普遍像素较低)。配套使用的活体检测功能,需要在参数设置中单独选择对应的已经适配的镜头。
1.3.4 活体检测演示
用于体验和测试活体检测效果,界面内会持续显示实时的活体检测结果,可用于评估硬件及算法在真实场景下的真实表现。具体的活体模式可以在参数设置中按需选择。
例如选择RGB+NIR活体模式,界面内则会实时显示两种图像回显,用于反馈实时的视频流画面。同时显示活体判断结果、各项检测耗时、图片预览等。可直观地用于模拟真实应用状态下的活体效果。
1.3.5 参数设置
人脸采集质量参数
如开启此项,则在人脸检测过程中,将会增加实时的人脸质量检测,包括模糊度判断、遮挡判断、光照判断。如实时图片帧不满足这几项中的任何一项阈值,则此图片帧将会被舍弃,不会送到活体步骤判断。
开启此项后,由于处理任务增加,性能开销也会对应增大。
点击「开启质量检测」,则可开启此项。
开启质量检测后,则可以自定义三个检测项的阈值,小于此阈值的图片帧将会被过滤掉。
活体模式设置
工程中提供四种活体模式配置,可根据业务需要自由选择。详细活体策略介绍,请参考 业务策略说明
识别相似度阈值
用于设置对比相似度的阈值,实际对比得分超过已设置的阈值,则可判断为同一人,推荐阈值80分或90分。
活体阈值设置
三种活体的阈值设定,超过此阈值则判断为活体通过。
注意:为业务安全性考虑,如果选择多种活体方式,则每一项活体得分都超过阈值,才会判断活体通过。
最小检测人脸设置
最小检测人脸是指:视频流中可以检测到的人脸的最小面积,相同镜头焦距情况下,此数值设置的越小,人脸越容易被检索到,对应的可识别距离也就越大。
此数值通常和分辨率一同配合使用。数值可调整范围为50px至200px之间,需要同时考虑分辨率大小因素影响。
人脸检测角度设置
此项设置用于管理:从视频流中实际检测人脸的方向,分为0、90、180、270四个角度。选择固定方向后,则只有人脸在此方向角度才会被检测到(RGB)
摄像头预览旋转角度设置
此项设置用于管理:摄像头输出视频流的实际预览界面角度,一经设置,将会作用于所有类型的回显画面(RGB、NIR、Depth回显)
可用于纠正摄像头原本输出图像中,人脸并没有水平朝上的问题,避免人脸检测不到的现象。
1.4 授权激活
详细说明请参考 授权说明
1.5 硬件选型
详细说明请参考 设备选型
2、集成指南
2.1 准备工作
2.1.1 注册开发者
- STEP1:点击百度AI开放平台导航右侧的控制台,页面跳转到百度云登录界面,登录完毕后,将会进入到百度云后台,点击「控制台」进入百度云控制台页面;您也可以在官网直接点击免费试用,登录完毕后将自动进入到百度云控制台。
- STEP2:使用百度账号完成登录,如您还未持有百度账户,可以点击此处注册百度账户。
- STEP3:进入百度云欢迎页面,填写企业和个人基本信息,注册完毕,至此成为开发者。(如您之前已经是百度云用户或百度开发者中心用户,STEP3 可略过)
- STEP4:进入百度云控制台,找到人工智能相关服务面板。
- STEP5:点击进入「人脸识别」
- STEP6:点击进入「离线SDK管理」
2.1.2 设备激活
首次运行示例工程,会弹出激活窗口。1为设备号,自动读取;2为序列号,手动输入。点击激活(激活需要联网,采用的https请求,https要求设备系统时间跟请求服务器时间差距不大,否则请求授权服务器会失败),激活以后使用不需要在连接网络,一个序列号绑定一台设备,卸载应用后重新安装可能需要重新激活,可以使用同一个序列号。可以在你的控制台查看设备号对应的序列号。
SDK的激活界面如下图所示:
2.2 代码结构
2.2.1 核心库介绍
facelibrary是SDK的依赖库。
- lib目录为动态库so和jar包
- assets目录为模型文件
- java目录为用户组管理、人脸SDK操作、视频流、图片等操作辅助类
2.2.2 示例代码介绍
model名称 | 功能说明 |
---|---|
FaceIdCompareActivity | 人证对比,包括选择证件照图片和视频流实时采集人脸进行人脸识别比对,根据比对的结果分数确认是否为同一个人,核验是否通过。 |
LivenessSettingActivity | 活体类型设置,分为无活体、RGB活体、RGB+NIR活体、RGB+Depth活体、RGB+NIR+Depth活体。默认为不使用活体。示例工程里面进行活体设置后,后续的人脸注册、人脸1:1,1:n等操作需选择相应Activity。无活体和rgb活体需要使用单目usb摄像头,rgb+ir活体需要使用rgb+ir双目摄像头(如迪威泰、视派尔双目摄像头,具体推荐型号详见上文设备选型介绍)。RGB+Depth需要使用奥比中光mini/mini-s/Pro-S、或华捷艾米摄像头,且目前只能使用RGB+Depth活体功能。RGB+NIR+Depth的活体硬件设备适配还在开发中。 |
CameraPreviewAngleActivity | 摄像头预览角度设置,可以根据实际预览的情况进行摄像头预览画面角度的旋转调整,包括0,90,180,270 |
FaceMinValueSetActivity | 最小检测人脸设置,此数值设置的越小,人脸越容易被检索到,对应的可识别距离也就越大,可调整数值范围为50px~200px |
FaceQualitySetActivity | 人脸采集质量参数设置,包括模糊度,遮挡和光照的设置。开启质量检测会增加耗时,性能也会下降,默认情况下是不开启质量检测。 |
FaceRecogniseSetActivity | 人脸识别相似度阈值设置,默认值是90。根据次阈值可以判读人脸是否识别成功。 |
MainActivity | 示例主界面入口 |
FaceSettingActivity | 参数设置界面入口 |
FaceTrackAngleSetActivity | 人脸检测角度设置,用于调整实际送去人脸检测的图片的角度,包括0,90,180,270。SDK只能识别人脸朝上的人脸。 |
LivenesThresholdSettingActivity | 活体阈值设置,包括RGB活体阈值,NIR活体阈值,Depth活体阈值。默认值是0.9,活体分数达到0.9左右可以判断活体通过 |
IminectVideoTrackActivity | 华捷艾米摄像头视频预览实时人脸活体检测特征提取 |
OrbbecMiniVideoTrackActivity | 奥比中光mini摄像头视频预览实时人脸活体检测特征提取 |
OrbbecProVideoTrackSecondActivity | 奥比中光Pro摄像头视频预览实时人脸活体检测特征提取 |
RgbNirVideoTrackActivity | 双目近红外摄像头视频预览实时人脸活体检测特征提取 |
RgbVideoTrackActivity | 单目RGB可见光摄像头视频预览实时人脸活体检测特征提取 |
以上所述文件位置如下图所示:
2.3 开始集成
接下来我们详细介绍以下集成步骤。
2.3.1 人脸库集成
- 把facelibrary库添加到自己的工程中:(1)
settings.gradle
添加‘:facelibrary’
;(2)app->build.gradle->dependencies->compile project(":facelibrary")。 - 根据需要把app里面的示例代码添加到自己的工程。
2.3.2 SDK初始化
采用默认参数进行初始化:
如果需要设置SDK的具体参数:
详细参数设置参考如下表格所示:
参数 | 名称 | 默认值 | 取值范围 |
---|---|---|---|
brightnessValue | 图片爆光度 | 40f | 50~255 |
blurnessValue | 图像模糊度 | 0.7f | 0~1.0f |
occlusionValue | 人脸遮挡阈值 | 0.5f | 0~1.0f |
headPitchValue | 低头抬头角度 | 15 | 0~45 |
headYawValue | 左右角度 | 15 | 0~45 |
headRollValue | 偏头角度 | 15 | 0~45 |
minFaceSize | 最小人脸检测值,小于此值的人脸将检测不出来,最小值为50 | 50 | 50~200 |
notFaceSize | 人脸置信度 | 0.8f | 0~1.0f |
isCheckBlur | 是否检测人脸模糊度 | False | True/Flase |
isOcclusion | 是否检测人脸遮挡 | False | True/Flase |
isIllumination | 是否检测人脸曝光度 | False | True/Flase |
2.3.3 按设备授权
SDK初始化的时候会检测设备授权,如果没有授权,会弹出授权框,填入在平台上创建的序列号。授权成功SDK才可初始化成功。
2.3.4 设置Anakin核数说明
SDK在授权初始化模型之前会进行Anakin大小核数的设置,共有两处地方需要修改。 在3399板子上运行,需要设置为4个大核0个小核。在3288板子的上运行,需要设置为2个大核0小核。 示例代码中默认的是是设置为4个大核0个小核的,用户需要根据自己板子情况进行修改,参考下图:
2.3.5 人脸采集质量参数设置
模型介绍
人脸质量阈值用于判断人脸的质量,包括模糊度,遮挡和光照。当质量检测通过之后,才进行活体的检测特征抽取比对识别。
注意事项
温馨提示:开启质量检测会增加耗时,性能也会下降,默认是不开启质量检测。
2.3.6 无感知活体检测模式
活体介绍
详见文档1.3.2部分
使用方法
model名称 | 功能说明 |
---|---|
LivenessSettingActivity | 活体类型设置,分为无活体、RGB活体、RGB+NIR活体、RGB+Depth活体、RGB+NIR+Depth活体。默认为不使用活体。示例工程里面进行活体设置后,后续的人脸注册、人脸1:1,1:n等操作需选择相应Activity。无活体和rgb活体需要使用单目usb摄像头,rgb+ir活体需要使用rgb+ir双目摄像头(如迪威泰、视派尔双目摄像头,具体推荐型号详见上文设备选型介绍)。RGB+Depth需要使用奥比中光mini/mini-s/Pro-S、或华捷艾米摄像头,且目前只能使用RGB+Depth活体功能。RGB+NIR+Depth的活体硬件设备适配还在开发中。 |
温馨提示:业务流程中,只能使用一种活体设置。
2.3.7 人脸识别相似度阈值(FaceRecogniseSetActivity)
人脸识别相似度阈值用于判断是否为同一个人,识别是否通过,包括可见光特征,证件照特征。可以根据此阈值来判断人脸是否识别成功,核验是否通过。
2.3.8 活体阈值设置(LivenesThresholdSettingActivity)
活体阈值用于判断是否活体通过,每种活体模型的阈值单独设定,可以根据次阈值来判断活体的通过率和拒绝率。通常情况下,真人的活体得分极大接近于1,非活体极大接近于0.0,阈值设定视安全性而定。
2.3.9 最小检测人脸设置(FaceMinValueSetActivity)
最小检测人脸是指:视频流中可以检测到的人脸的最小面积,此数值设置的越小,人脸越容易被检索到,对应的可识别距离也就越大。此数值通常和分辨率一同配合使用。数值可调整范围为50px至200px之间,需要同时考虑分辨率大小因素影响。
2.4.0 人脸检测角度设置(FaceTrackAngleSetActivity)
此项设置用于管理:从视频流中实际检测人脸的方向,分为0、90、180、270四个角度。选择固定方向后,则只有人脸在此方向角度才会被检测到(RGB)。
注意事项
温馨提示:SDK只检测人脸朝上的人脸,需要确保送去检测的人脸角度是正的,朝上的。
2.4.1 摄像头预览旋转角度设置(CameraPreviewAngleActivity)
此项设置用于管理:摄像头输出视频流的实际预览界面角度,分为0、90、180、270四个角度。一经设置,将会作用于所有类型的回显画面(RGB、NIR、Depth回显)可用于纠正摄像头原本输出图像中,人脸并没有水平朝上的问题,避免人脸检测不到的现象。
2.4.2 人证对比
2.4.2.1 从相册里选择两张图片进行对比
此种方法无需使用人脸采集及活体等功能。
注意事项
温馨提示:SDK只检测人脸朝上的人脸。
2.4.2.2 从视频流中采集两张人脸图片进行对比
此种方式的人脸图片需要从视频流中实时采集,如果为无人值守情况,还需配备活体检测以保障业务安全。FaceIdCompareActivity
根据活体策略选择相应的实现,开发者可以根据实际使用的硬件进行选择。
1)获取人脸,可选择以下5种方式返回人脸
- RgbLivessDetectActivity:无活体或RGB活体(活体检测成功后,返回检测到的人脸)
- RgbNirLivessDetectActivity:进行RGB+NIR活体成功后返回检测到RGB人脸
- OrbbecMiniVideoTrackActivity:进行RGB+Depth活体成功后返回检测到RGB人脸(奥比中光mini镜头)
- OrbbecProVideoTrackSecondActivity:进行RGB+Depth活体成功后返回检测到RGB人脸(奥比中光Pro镜头)
- IminectVideoTrackActivity:进行RGB+Depth活体成功后返回检测到RGB人脸(华捷艾米镜头)
2)根据返回人脸抽取特征
3)比对两张人脸图片
2.4.3 活体检测(视频流)
您可以根据实际硬件选择活体策略,有下面几种实现:
- RgbVideoTrackActivity 无活体或rgb活体(单目RGB镜头)
- RgbNirVideoTrackActivity rgb+ir活体(双目近红外镜头)
- OrbbecMiniVideoTrackActivity rgb+depth活体(奥比中光mini镜头)
- OrbbecProVideoTrackSecondActivity rgb+depth活体(奥比中光Pro镜头)
- IminectVideoTrackActivity rgb+depth活体(华捷艾米镜头)
开发者可以根据活体策略和实际使用的硬件(连接的摄像头)选择相应的实现。
2.4.3.1 RgbVideoTrackActivity
1)初始化视频流检测
2)选择摄像头类型
3)设置视频流人脸检测回调,在回调进行比对
4)活体检测
5)特征抽取
2.4.3.2 RgbNirVideoTrackActivity
1)初始化视频流:RGB+NIR双目摄像头通过系统api出来的视频流都是yuv420数据,需要区分出RGB还是NIR数据。通过选取一点数量点的取平均值比较,大的为RGB,小的为NIR。
2)人脸活体检测
3)特征抽取(与RgbVideoTrackActivity实现相同)
2.4.3.3 OrbbecMiniVideoTrackActivity
1)初始化视频流+人脸检测+活体:采用奥比中光双目摄像头,Depth数据为16位数据
2)活体检测回调
3)特征抽取(与RgbVideoTrackActivity实现相同)
2.4.3.4 IminectVideoTrackActivity
1)初始化视频流+人脸检测+活体:采用华捷艾米双目深度摄像头,Depth数据为16位数据
2)活体检测回调(与OrbbecMiniVideoTrackActivity实现相同)
3)特征抽取(与RgbVideoTrackActivity实现相同)
2.4 核心类
2.4.1 FaceSDKManager
- 功能:负责授权激活、初始检测类FaceDetector、FaceFeature、FaceLiveness
- 位于:
com.baidu.aip.manager
2.4.2 FaceDetector
- 功能:人脸检测封装类,包含人脸检测功能初始化、人脸检测接口调用
- 位于:
com.baidu.aip.manager
2.4.3 FaceFeature
- 功能:人脸特征抽取封装类,包含人脸特征抽取功能初始化、人脸特征抽取接口调用
- 位于:
com.baidu.aip.manager
2.4.4 FaceLiveness
- 功能:人脸活体相关操作封装类,包含人脸rgb、ir、depth活体检测
- 位于:
com.baidu.aip.manager
2.4.5 FaceEnvironment
- 功能:人脸配置相关操作封装类,包含人脸检测的相关参数及默认值
- 位于:
com.baidu.aip.manager
2.4.6 FaceDetectManager
- 功能:人脸图片和视频人脸检测封装类,可以接受CameraImageSource和FileImageSource源
- 位于:
com.baidu.aip.face
2.4.7 FaceAttribute
- 功能:人脸属性相关操作封装类,包含年龄,性别,表情等
- 位于:
com.baidu.aip.manager
2.4.8 FacefeaturesImage
- 功能:人脸特征抽取封装类,包含人脸特征抽取功能初始化、人脸特征抽取接口调用
- 位于:
com.baidu.aip.manager
3、常见问题
Q:提示硬件指纹变化,导致激活失效?
A:v1.0.1版本以上的SDK,已经修复了硬件指纹变化问题。但由于硬件本身的多样化原因,可能某些情况下,仍会导致指纹变化。
Q:哪些情况可能导致指纹变化?
A:刷机、更换硬件设备将会导致指纹变化。但安卓系统升级、APP卸载重装、恢复系统出厂值并不会导致硬件指纹变化。
Q:同一台设备可以被多个序列号多次激活么?
A:可以。一台设备可以被多个序列号激活,没有限制。
Q:调用getFeature
接口对图片进行特征提取,经常会出现特征提取失败的情况,错误码为6。
A:主要可能为在人脸检测的过程中没有检测到人脸,建议调整设置下人脸的大小set_min_face_size
的值。
Q:视频流人脸检测和图片检测是否可以同时或间隔进行?
A:人脸SDK为单例,同一时间只能进行一个图像源。另外进行人脸检测具体追踪功能,视频流进行检测时,不能插入其他图像帧。想VideoMatchImageActivity
、RgbIrVideoMatchImageActivity
、OrbbecVideoMatchImageActivity
,需要先把图片进行人脸检测后,在把打开视频流检测。中间需要使用FaceSDKManager.getInstance().getFaceDetector().clearTrackedFaces();
清除数据
Q:人脸检测检测不到人脸?
A:人脸SDK检测需要传入检测的人脸图片是人脸朝上,预览和实际传给SDK检测的图片方向不一定相同,需要把实际检测的数据转成(argb->bitmap)图片,显示确定人脸是否朝上。
Q:如何调整人脸检测识别距离,以及调节检测的最小人脸?
A:主要方法有三种,详情如下:
- 调整
FaceDetector
初始化时最小检测人脸大小(FaceEnvironment VALUE_MIN_FACE_SIZE = 100;),可选范围为:50~200(50*50px-200*200px),最小检测人脸越小,能检测到人脸越小。最小检测人脸越小,性能消耗越大。 - 调整人脸检测传入的图像分辨率,分辨率越大,能检测越越远。鉴于目前端设备性能,建议选择640*480,1280*720。分辨率越大,性能消耗越大。
- 选择更大焦距的摄像头,相当于把人脸拉近。同样距离,大焦距的镜头,图像视觉越小,人脸占比越大。通常USB摄像头为3mm、6mm焦距。对性能影响小,调整人脸检测距离明显。
Q:人脸检测返回值问题?
A:一般反馈OK(0)表示检测到合格的人脸,当传入检测数据间隔时间较长上,超过了追踪的时间,会返回DATA_HIT_LAST(9)。所有返回9也是检测到了合格的人脸,如下所示:
public static enum ErrCode {
OK,
PITCH_OUT_OF_DOWN_MAX_RANGE,
PITCH_OUT_OF_UP_MAX_RANGE,
YAW_OUT_OF_LEFT_MAX_RANGE,
YAW_OUT_OF_RIGHT_MAX_RANGE,
POOR_ILLUMINATION,
NO_FACE_DETECTED,
DATA_NOT_READY,
DATA_HIT_ONE,
DATA_HIT_LAST,
IMG_BLURED,
OCCLUSION_LEFT_EYE,
OCCLUSION_RIGHT_EYE,
OCCLUSION_NOSE,
OCCLUSION_MOUTH,
OCCLUSION_LEFT_CONTOUR,
OCCLUSION_RIGHT_CONTOUR,
OCCLUSION_CHIN_CONTOUR,
FACE_NOT_COMPLETE,
UNKNOW_TYPE;
private ErrCode() {
}
}
Q:授权失败?
A:一个序列号只能对应一台设备,一个设备可以绑定多个序列号,测试期间的序列号有使用时间,会过期,过期后需要到AI平台上进行延期,正式使用的序列号是永久授权的。授权不过,人脸SDK将无法返回正确结果。
Q:so加载问题?
A:很多开发者反馈找不到so库,原因是前面只提供了armeabi-v7a
的库,但开发者基本加了其他第三方的库arm64-v8a
、armeabi
、armeabi-v7a
和x86
等都加进去了。so的加载原理是先加载当前CPU对应的so库,比如64位的手机会先加载arm64-v8a
,只有在没有arm64-v8a
目录才会去其他目录(如armeabi-v7a
)下找,所有就算只留个空arm64-v8a
目录也不行,因为这样他只会在arm64-v8a
目录下找,这就要求每个目录下的so齐全一致。同时也不能把armeabi-v7a
里面的so拷到其他目录,不要看名字一样。同时加入arm64-v8a
和armeabi-v7a
库。这样会导致打出来的包大不少。所以如果觉的包太大,只留armeabi-v7a
是可以,他兼容其他cpu架构。注意:aar里面可能包含so,注意检查。