方案集成指南
本文档介绍了标准级APP实名认证方案配置流程,以及APP集成开发流程。
一、 准备工作
在正式集成前,需要做一些准备工作,完成一些账号、应用及配置,具体如下:
Step1: 注册成为开发者
在使用百度人脸实名认证方案之前,首先需注册百度智能云账号,账号注册方式请参考账号注册指南。
百度智能云账号注册完成以后,为顺利调用百度AI能力,需完成企业认证。具体认证方式请参考企业认证指南。
Step2:创建应用
2.1 输入应用名称,领取免费额度
- 创建好账号后,在正式调用AI 能力之前,需首先创建应用,应用是调用服务的基础能力单元。
- 同时领取接口所需的免费调用额度,用于接入测试。如下图所示:
- 除人脸服务接口的免费调用额度外,还需领取身份证识别接口的免费调用额度,用来调用身份证OCR识别功能(必须领取,否则会报错服务异常),点击此处,按下图所示进行领取。
- 如您之前已经领取过免费额度,无需重复领取,请跳至下一步骤。
2.2 勾选所需接口
-
人脸识别服务相关接口已默认勾选且不可取消。
- 注:「接口选择」过程中,还需勾选「文字识别」中的「身份证识别」接口,用于实现身份核验流程中的身份证识别功能。如下图所示。
2.3 输入应用包名
- 在「文字识别包名」处选择「需要」,并根据您的APP应用信息填写包名。此处为必要操作,否则将无法顺利下载集成文件。至此应用创建完成。
2.4 获取密钥信息(AK/SK)
完成应用创建后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。您可在控制台的应用管理页面找到以上信息。如下图所示
该AK/SK用于调用在线API 如:身份验证。在之后下载的集成文件(示例工程)中需要填写正确的AK/SK以顺利集成。
注:开发中请注意区分多份AK/SK(API Key、Secret Key),若填写的AK/SK与开发的应用不对应,会产生鉴权错误。
Step3:创建项目
- 进入控制台-人脸实名认证页面,选择『项目管理』页面,点击『新建项目』,进行项目创建,如下图所示。
创建项目前,请确保您在应用控制台已创建应用,若您未创建应用,请参考Step2创建应用后,再进行项目创建.
Step4:创建方案
- 项目创建完成后,点击「方案管理」进入方案管理页面,在这里您可以为您的项目创建不同的方案,如下图所示。
若您的场景为APP场景(安卓/IOS系统),『场景方案』请选择APP实名认证方案;
若您的场景为微信、H5页面,『场景方案』请选择H5实名认证方案。
4.1 身份信息录入
- 身份信息录入支持选择用户手动输入或OCR拍照采集,如下图所示
OCR拍照采集:会在之后生成的APP集成文件内集成OCR采集SDK,在本地进行身份证质量校验,并判断是否为身份证证件。 (OCR拍照采集支持实时采集和相册上传两种形式。推荐您使用实时采集,可以在一定程度增加方案的安全性及便捷性。)
手动输入:支持用户手动输入姓名+身份证号信息。
4.2 离线采集SDK配置
- 填写授权标识:选择SDK的授权标识信息。
若您还未申请授权标识信息,请点击『新建授权』,并填写相关信息进行申请,申请过程如下图所示。
- 图像质量控制(本地):分为严格、正常、宽松三个等级,等级越严格,对采集图片的角度、模糊度、遮挡等信息参数把控越高,推荐使用正常。
此项配置为离线采集SDK端对采集图片的质量要求,推荐实名认证场景选择严格或正常模式。图片质量越好,云端接口传输的通过率越高。
- 活体检测设置(本地):离线采集 SDK在前端要求用户做出指定动作,并检测动作的完成情况。在该过程,SDK 会随机抓取几帧图像进行本地活体检测,检测通过后将图片传至后台进行下一步检测。
此项配置为离线采集SDK端的活体检测动作,可对动作数量及顺序进行配置。推荐采用随机顺序进行三个以上动作的校验。
附录:
质量控制参数 | 「宽松」 | 「正常」 | 「严格」 |
---|---|---|---|
光照最小值 | 30 | 40 | 60 |
光照最大值 | 240 | 220 | 200 |
遮挡-左眼 | 0.95 | 0.8 | 0.4 |
遮挡-右眼 | 0.95 | 0.8 | 0.4 |
遮挡-鼻子 | 0.95 | 0.8 | 0.4 |
遮挡-嘴巴 | 0.95 | 0.8 | 0.4 |
遮挡-左脸 | 0.95 | 0.8 | 0.4 |
遮挡-右脸 | 0.95 | 0.8 | 0.4 |
遮挡-下巴 | 0.95 | 0.8 | 0.4 |
姿态-俯仰角 | 30 | 20 | 15 |
姿态-左右角 | 18 | 18 | 15 |
姿态-旋转角 | 30 | 20 | 15 |
模糊度 | 0.8 | 0.6 | 0.4 |
4.3 人脸实名认证API配置
- 人脸实名认证接口:标准级实名认证方案默认接入 人脸实名认证 API接口。
- 图像质量检测:分为正常与宽松两个等级,等级设置越严格,对图片角度、模糊度、遮挡等信息参数把控越高,推荐使用宽松。
- 活体检测:分为严格、正常、宽松三个等级,不同等级对应不同的活体检测阈值。等级设置越严格,对活体检测相关参数信息的把控越高。不同等级对应指标可参考下表,推荐使用正常。
活体检测阈值:活体检测得分高于此阈值,即判断为活体
误拒率(FRR):指误将活体用户判断为非活体的概率。如误拒率为0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
控制度 | 对应阈值 | 说明 |
---|---|---|
宽松 | 0.05 | 万分之一活体误拒率 |
正常(推荐) | 0.3 | 千分之一活体误拒率 |
严格 | 0.9 | 百分之一活体误拒率 |
- 阈值:用户人脸图片与公安权威数据源中人脸的相似度得分阈值,得分超过此阈值,即被判断为同一人。阈值分数相关指标可参考下表,推荐阈值为80。
阈值分数 | 误识率 | 识别率 |
---|---|---|
60 | 0.781615% | 99.550128% |
70 | 0.096534% | 98.307626% |
78 | 0.015570%(万分之一) | 95.672664% |
80 (推荐) | 0.009342%(低于万分之一) | 94.323051% |
Step5:提交方案,获取示例工程
完成上述方案配置后,点击『提交』,进入方案管理页面,下载IOS/安卓版集成文件(含示例工程)进行SDK端集成使用。
Step4中方案配置的参数会自动生成至集成文件(含示例工程)中,方便开发使用。 注意:请谨慎修改APP方案流程,修改后需要重新下载集成文件进行使用。
具体开发操作请参考以下步骤。
二、 集成逻辑
2.1 IOS集成
1、打开或者新建一个项目。
2、右键点击项目,会出现一个添加菜单,在菜单中选择『Add Files to“此处是你的项目名字”…… 』,如下图所示:
3、在添加文件弹出框里面选择申请到的license和SDK添加进来。如下图:
注意:license为百度官方提供,刚才在后台下载的文件(文件名称:idl-license.face-ios)
SDK包含下面几个文件:
- IDLFaceSDK.framework
- com.baidu.idl.face.faceSDK.bundle
- com.baidu.idl.face.model.bundle
- com.baidu.idl.face.live.action.image.bundle
- AipOcrSdk.framework
- AipBase.framework
- IdcardQuality.framework
4、确认下 Bundle Identifier
是否是申请license时填报的那一个.
5、注意:license 和 Bundle Identifier 为一一对应关系,填错了会导致SDK不可用.
6、 FACE_LICENSE_ID
这个参数填写百度官方给的LicenseID
在 FaceParameterConfig.h
文件中填写下面几项。
7、选择链接C++标准库。
8、如果没有使用pod管理第三方库的话,请在Build Setting Linking Other Linker Flags 上面加入 –ObjC选项。如果用了pod请忽略,因为pod会自动添加上。
以下为示例工程调用身份验证的代码片段:
2.1.1 OCR身份证识别集成
把下载下来的License文件(文件名:aip.license),添加到项目里面,无需更改文件名称,然后在AppDelegate
添加以下代码引用进去。
在FaceParameterConfig.h
里面设置下载下来的License文件的名字和后缀。
通过API调用ViewController
进行身份证扫描
详细调用文档,请参考 OCR-iOS-SDK文档
2.1.2 人脸SDK集成
2.1.2.1 授权初始化
把下载下来的License文件(文件名:idl.license.face-ios),添加到项目里面,无需更改文件名称,然后在AppDelegate
添加以下代码引用进去。
在FaceParameterConfig.h
里面设置下载下来的License文件的名字和后缀。
2.1.2.2 接口参数及调用说明
(1)动作采集
调用IDLFaceLivenessManager类的:
/*带黑边的方法-通过图片质量控制
- (void)livenessStratrgyWithImage:(UIImage *)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(LivenessStrategyCompletion)completion;
/*不带黑边*/
-(void) livenessNormalWithImage:(UIImage *)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(LivenessNormalCompletion)completion;
参数说明
- previewRect 人脸图片大小,类型:Rect
- detectRect 人脸检测区域大小,类型:Rect
- completion 完成后返回照片和状态结果
说明
检测图片中的人脸信息,完成人脸图像采集和人脸活体检测,返回检测状态和结果。
使用方法如下
图片 | key |
---|---|
抠图 | bestImage |
原图 | originalImage |
按要求数量的抠图 | crop%d(%d为第几张,从0开始) |
按要求数量的原图 | original%d(%d为第几张,从0开始) |
(2)人脸采集 调用IDLFaceDetectionManager类的:
/*带黑边的方法-通过图片质量控制*/
- (void)detectStratrgyWithQualityControlImage:(UIImage *)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(DetectStrategyCompletion)completion;
/*不带黑边*/
- (void)detectStratrgyWithNormalImage:(UIImage _)image previewRect:(CGRect)previewRect detectRect:(CGRect)detectRect completionHandler:(DetectStrategyCompletion)completion;
参数说明
previewRect
与detctRect
是为了做距离检测而定义的,为了在上层封装判断脸是否在框内/离太远/离太近。
- image:相机获取的图片
- previewRect:间接定义的最大距离的 maxRect 和最小距离的 minRect。
- detectRect:实际采集区域
- completion:回调
说明
检测图片中的人脸信息,完成人脸图像采集和人脸活体检测,返回检测状态和结果。
使用方法如下
| 图片 | key | | ---- | ------------- | | 原图 | originalImage | | 抠图 | bestImage | (3)设置人脸功能控制参数
具体方法详见如下:
// 设置鉴权
- (void)setLicenseID:(NSString *)licenseID andLocalLicenceFile:(NSString *)licensePath andRemoteAuthorize:(BOOL)remoteAuthorize;
// 最小检测人脸阈值,默认40
- (void)setMinFaceSize:(int)width;
// 截取人脸图片大小,默认400
- (void)setCropFaceSizeWidth:(CGFloat)width;
// 人脸检测精度阈值,默认0.5f
- (void)setNotFaceThreshold:(CGFloat)th;
// 人脸遮挡阈值,默认0.5
- (void)setOccluThreshold:(CGFloat)thr;
// 亮度阈值,默认90
- (void)setIllumThreshold:(CGFloat)thr;
// 图像模糊阈值,默认0.5
- (void)setBlurThreshold:(CGFloat)thr;
// 头部姿态角度,默认12,10,10
- (void)setEulurAngleThrPitch:(float)pitch yaw:(float)yaw roll:(float)roll;
//设置无黑边抠图的数量,默认1
- (void)setMaxCropImageNum:(int)imageNum;
//设置最大人脸检测数量,默认1
- (void)setMaxDetectNum:(int)detectNum;
//设置有黑边抠图方式的旋转角度,默认2.0f
- (void)setCropEnlargeRatio:(float)cropEnlargeRatio;
// 检测时间,默认10
- (void)setConditionTimeout:(CGFloat)timeout;
调用方法:
(4)检测功能初始化
- (int)initCollect;
调用方法:
(5)检测功能释放
- (int)uninitCollect
参数:
- 无
返回:
- 无
(6)活体动作设置
- (void)livenesswithList:(NSArray *)array order:(BOOL)ordernumberOfLiveness:(NSInteger)numberOfLiveness
参数:
- array: 活体动作列表
- order: 是否按顺序进行活体动作
- numberOfLiveness: 活体动作数目(array为nil是起作用)
返回:
- 无
说明:
- 活体动作设置
2.2 安卓集成
2.2.1 OCR身份证识别集成
- 把申请的license(aip.license)放到到项目中app module下的assets目录中
- 修改app的build.gradle包名为申请时填入的包名
- 拷贝ocr-ui到您的工程中
接下来调用具体请看示例工程
1、在首页面初始化OCR SDK(在HomeActivity.java中)
2、跳转至身份证扫描页面进行身份证扫描(在HomeActivity.java中)
3、调用身份证识别请求接口api进行身份证识别(在IdCardRecognizeActivity.java中) 其中请求参数如下:
请求参数 | 说明 |
---|---|
image | 身份证扫描的图像 |
id_card_side | 身份证的正反面类型 |
detect_risk | 是否开启旋转识别 |
4、获得身份证号码和姓名后进入人脸活体验证步骤
详细调用文档,请参考 OCR-Android-SDK文档
2.2.2 人脸SDK集成
1、授权参数
(1)把申请的license(idl-license.face-android")放到到项目中app module下的assets目录中
(2)修改 Config.java
类中的参数
在人脸实名认证控制台创建完APP方案后,会自动生成LicenseID和LicenseFileName信息,这里您只需要填写apiKey和secretkey信息即可。
public class Config {
// 为了apiKey,secretKey为您调用百度人脸在线接口的,如注册,比对等。
// 为了的安全,建议放在您的服务端,端把人脸传给服务器,在服务端端
// license为调用sdk的人脸检测功能使用,人脸识别 = 人脸检测(SDK功能)+ 人脸比对(服务端API)
public static String apiKey = "替换为你的apiKey(ak)";
public static String secretKey = "替换为你的secretKey(sk)";
public static String licenseID = "替换为你的licenseID,后台SDK管理界面中,已经生成的licenseID,如:test-face-android";
public static String licenseFileName = "替换为你的license文件";
}
(3)配置签名(申请license时的md5为打包签名的文件,所以必须用申请license的签名文件)
app->build.gradle->android->signingConfigs
signingConfigs {
def password = "替换为签名密码"
def alias = "替换为签名别名"
def filePath = "替换为签名文件路径" //如 ../facesharp.jks//签名文件路径
debug {
keyAlias alias
keyPassword password
storeFile file(filePath)
storePassword(password)
}
release {
keyAlias alias
keyPassword password
storeFile file(filePath)
storePassword(password)
}
}
(4)修改包名 app->build.gradle->android->defaultConfig ->applicationId您申请license时填的包名
2、初始化人脸相关SDK(在HomeActivity.java**中)
private void initLicense() {
setFaceConfig();
// 为了android和ios 区分授权,appId=appname_face_android ,其中appname为申请sdk时的应用名
// 应用上下文
// 申请License取得的APPID
// assets目录下License文件名
FaceSDKManager.getInstance().initialize(mContext,
Config.licenseID, Config.licenseFileName, new IInitCallback() {
@Override
public void initSuccess() {
// 初始化OCR SDK 使用的license是aip.license,名字不能修改
initOCRSDK();
}
@Override
public void initFailure(final int errCode,
final String errMsg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "初始化失败 = " + errCode + " " + errMsg);
showToast("初始化失败 = " + errCode + ", " + errMsg);
mIsInitSuccess = false;
}
});
}
});
}
3、设置配置参数,如不设置,将使用默认值(在HomeActivity.java中)
private void setFaceConfig() {
FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
mConsoleConfig = ConsoleConfigManager.getInstance(mContext).getConfig();
// -----TODO:以下为通过console平台获取到的配置信息-----
// 设置模糊度阈值
config.setBlurnessValue(mConsoleConfig.getBlur());
// 设置光照阈值(范围0-255)
config.setBrightnessValue(mConsoleConfig.getIllumination());
// 设置遮挡阈值
config.setOcclusionValue(mConsoleConfig.getOcclusion());
// 设置活体动作,通过设置list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
// LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
// LivenessTypeEunm.HeadRight, LivenessTypeEunm.HeadLeftOrRight
config.setLivenessTypeList(mConsoleConfig.getActions());
// 设置动作活体是否随机
config.setLivenessRandom(mConsoleConfig.isFaceVerifyRandom());
// 风控加密类型,0:普通版;1:加密版
config.setSecType(mConsoleConfig.getSecType());
// -----TODO:以下不需要通过console平台配置,需要手动修改-----
// 设置可检测的最小人脸阈值
config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
// 设置可检测到人脸的阈值
config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
// 设置人脸姿态角阈值
config.setHeadPitchValue(FaceEnvironment.VALUE_HEAD_PITCH);
config.setHeadYawValue(FaceEnvironment.VALUE_HEAD_YAW);
// 设置闭眼阈值
config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
// 设置图片缓存数量(非动作活体使用)
config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
// 设置口罩判断开关以及口罩阈值
config.setOpenMask(FaceEnvironment.VALUE_OPEN_MASK);
config.setMaskValue(FaceEnvironment.VALUE_MASK_THRESHOLD);
// 设置开启提示音
config.setSound(ExampleApplication.isOpenSound);
// 原图缩放系数
config.setScale(FaceEnvironment.VALUE_SCALE);
// 抠图高的设定,为了保证好的抠图效果,我们要求高宽比是4:3,所以会在内部进行计算,只需要传入高即可
config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
// 抠图人脸框与背景比例
config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
// 选择针对人脸采集输出图片的类型进行加密,0:原图,1:抠图
config.setOutputImageType(FaceEnvironment.VALUE_OUTPUT_IMAGE_TYPE);
FaceSDKManager.getInstance().setFaceConfig(config);
}
4、开始进行人脸采集 非动作活体版:(在FaceDetectActivity.java中) (1)在摄像头的回调方法onPreviewFrame(byte[] data, Camera camera)中调用FaceSDKManager.getInstance().getDetectStrategyModule()获得IDetectStrategy对象。(该方法每次调用都会返回一个新对象,建议只调用一次)。
(2)调用IDetectStrategy.setPreviewDegree(int degree);设置预览图片的旋转角度。 调用IDetectStrategy.setDetectStrategySoundEnable(boolean flag);设置是否开启语音。 调用IDetectStrategy.setDetectStrategyConfig(Rect previewRect, Rect detectRect, IDetectStrategyCallback callback);设置预览框的大小,人脸检测框的坐标和回调。
(3)多次调用detectStrategy(byte[] imageData);进行人脸图片采集。
(4)实现IDetectStrategyCallback.onDetectCompletion(FaceStatusNewEnum status, String message, HashMap<String, ImageInfo> base64ImageCropMap, HashMap<String, ImageInfo> base64ImageSrcMap);回调方法并处理结果。其中base64ImageCropMap为采集到的指定数量的抠图,base64ImageSrcMap为采集到的指定数量的原图。
(5)获取采集到的最优抠图和原图,即在上述第(4)步的IDetectStrategyCallback.onDetectCompletion();回调方法中调用getBestImage(HashMap<String, ImageInfo> imageCropMap, HashMap<String, ImageInfo> imageSrcMap);,
其实现如下:
动作活体版:(在FaceLivenessActivity.java中) (1)在摄像头的回调方法onPreviewFrame(byte[] data, Camera camera)中调用FaceSDKManager.getInstance().getLivenessStrategyModule(ILivenessViewCallback)获得ILivenessStrategy对象。(该方法每次调用都会返回一个新对象,建议只调用一次)。
(2)调用ILivenessStrategy.setPreviewDegree(int degree);设置预览图片的旋转角度。 调用ILivenessStrategy.setLivenessStrategySoundEnable(boolean flag);设置是否开启语音。 调用ILivenessStrategy.setLivenessStrategyConfig(List<LivenessTypeEnum> livenessList, Rect previewRect, Rect detectRect, ILivenessStrategyCallback callback);设置动作活体类型、预览框的大小,人脸检测框的坐标和回调。
(3)多次调用livenessStrategy(byte[] imageData);进行人脸图片采集。
(4)实现ILivenessStrategyCallback.onDetectCompletion(FaceStatusNewEnum status, String message, HashMap<String, ImageInfo> base64ImageCropMap, HashMap<String, ImageInfo> base64ImageSrcMap, int currentLivenessCount);回调方法并处理结果。其中base64ImageCropMap为采集到的指定数量的抠图,base64ImageSrcMap为采集到的指定数量的原图。
(5)获取采集到的最优抠图和原图,即在上述第(4)步的ILivenessStrategyCallback.onDetectCompletion();回调方法中调用getBestImage(HashMap<String, ImageInfo> imageCropMap, HashMap<String, ImageInfo> imageSrcMap);,
其实现如下:
5、跳转至身份核验接口调用页面,需要传入:图片的base64、图片加密类型(加密、不加密)、姓名、身份证号 (在FaceDetectExpActivity.java和FaceLivenessExpActivity.java中)
6、获取accessToken,用于调用接口(在CollectVerifyActivity.java中)
注意:为了防止ak、sk泄露,建议把ak、sk放在服务端,移动端通过服务端去拉取token(目前是在工程中的Config.java中)
7、根据离线采集得到的人脸图片(抠图或原图),进行人脸实名认证(在CollectVerifyActivity.java中)
提示:为了安全及维护成本考虑,我们建议您将SDK获取的人脸图像,推送到服务器端,由服务器端进行API调用,并将结果返回给客户端APP
若业务对安全性要求较高,推荐升级为具备安全加密和大数据风控功能的增强级人脸实名认证方案或金融级人脸实名认证方案。
其中请求参数如下:
请求参数 | 含义 | 说明 |
---|---|---|
image_type | 图片类型 | BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;图片尺寸不超过1920*1080 |
image | 图片信息 | 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断 |
name | 姓名 | 需要是UTF-8编码的中文 |
id_card_number | 身份证号 | |
quality_control | 图片质量控制 | NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE |
liveness_control | 活体检测控制 | NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认 NONE |