Android-SDK-常见问题
1. Android 8.0人脸离线识别SDK常见问题Q&A
1.1 授权相关问题
- 人脸识别Android SDK no enough params 报错解决方案
问题产生原因:no enough params报错出现原因是设备的硬件指纹获取不到,若获取不到硬件指纹设备无法完成激活授权操作,因此也就无法正常使用人脸识别SDK。
解决方案:将READ_PHONE_STATE 这个权限全局搜索并注释,操作方法如图:
将注释该权限后的工程重新编译生成apk进行安装。 - 人脸识别Android SDK激活授权时是否需要设备联网
离线识别Android SDK共3种激活方式:在线激活、离线激活、批量激活(应用激活)。
需要设备联网的方式是:在线激活、批量激活方式;
无需设备联网的方式是:离线激活方式。
无论选择哪种方式完成的激活授权,在首次激活成功后均可在弱网或无网环境中使用。 - 人脸识别Android SDK时间校验机制原理
在完成人脸识别Android SDK的激活鉴权后,由于各种因素如出现设备的时间发生了变化,可能导致SDK报错需重新激活。但序列号仍在有效期内,为什么会出现鉴权失败的问题?
问题产生原因:出现该问题的原因是设备在鉴权时,SDK内部会保存当前激活的RTC时间,在后续在正常使用的过程中设备的时间仅能往后计数(即实时显示时间大于等于首次激活的时间),若由于设备原因或人为调整时间因素,而出现设备时间小于首次激活时间,SDK会认为该设备还未进行激活鉴权,即当前时刻对应的RTC时间之前从未识别到SDK有过激活授权操作,导致会出现无法使用人脸识别能力的情况。
解决方案:恢复设备时间为系统时间,并按照文档中的激活流程重新执行一次鉴权流程即可,同时您请在后续使用中也保持系统时间不手动调整时间。 - 批量激活不成功解决方案
解决方案:批量激活首先需设备连接网络,在激活过程中实际比对的是控制台自定义的licenseid和应用包名。因此,您先保持设备连接网络,并在控制台新建应用,如图
填入您应用名称、license ID、包名(注意您这里填写的包名需与工程中实际使用的包名一致)
填入完成之后点击创建应用,进入SDK工程的路径:FaceSDKAndroid/app/src/main/java/com/baidu/idl/face/main/activity/start/ActivitionActivity,配置控制台刚配置的license Id,如图:
最后编译生成apk推进设备,选择应用激活方式,点击“立即激活”,即可完成授权。 - 设备存储卡与激活授权的关系
在完成激活鉴权后,会有激活文件保存到存储卡内,若拔走储存卡安装在另外的设备上会提示该序列号已激活,因为卡内存的是上一个设备的信息,不建议这样操作。 - 人脸识别SDK序列号回收
问题背景:如您在控制台已分配了序列号,且序列号对应激活状态是未激活,则您可通过以下流程回收该序列号。
解决方案:测试序列号暂无法回收,可回收正式序列号。正式序列号回收方法如下:
- 人脸识别Android SDK 激活失败原因
您在对人脸识别Android SDK进行激活时,若激活错误,您可参考以下激活错误码对应说明,请参考:
- 使用人脸识别Android SDK新版本始终报错鉴权问题
问题背景:如您的该台设备之前已安装过人脸识别Android SDK旧版本,当前使用新版本始终无法完成激活流程。
解决方案:您可尝试清除设备缓存,重新安装SDK进行激活。
1.2 工程集成问题
- CPU架构兼容问题
SDK支持CPU架构如下:armeabi,arm64-v8a,armeabi-v7a,x86。 如您在使用过程中,出现设备CPU架构的报错,您可根据实际硬件支持的架构选择对应型号即可,请参考:
- 离线识别Android SDK存储的人脸特征值大概占多少内存
5万的人脸图片底库大概占用内存大小60M~70M。 - 二次开发后查看人脸识别Andorid SDK版本号方法
在您的工程中找到FaceSDK.jar
通过命令certutil -hashfile 文件名称.文件类型 MD5 ,查看生成的MD5(即为该jar包对应的MD5)。使用相同的方式获取您身边识别SDK所有DEMO版本FaceSDK.jar对应的MD5,其中一致MD5对应的DEMO版本号即为您当前工程中集成使用的人脸识别DEMO版本号。 - 人脸识别Android SDK本地数据库迁移
问题背景:如您基于SDK的已有人脸数据库,需将本地设备上的人脸数据迁移到其他设备中,完成人脸库的迁移,您可参考以下方案。
解决方案:在Android Studio中点击右下角Device File Explorer,找到路径com.baidu.idl.face.demo文件夹下databases/face.db,即可将该文件导入另一设备中同路径下完成人脸库的迁移。
1.3 报错修复问题
- 屏幕宽高layout空指针报错问题
问题产生报错日志如下:
该问题是由setLayoutParams空指针导致。
解决方案:您注释relativeLayout.setLayoutParams(params);即可,请参考:
- 人脸识别Android SDK相机码流的照片像素,推荐尺寸
人脸识别Android SDK相机码流照片像素推荐尺寸为640×480。 - 人脸框不与人脸实时跟踪问题
题背景:您在使用Android 人脸识别SDK中若发现视频流标注人脸框与人脸未实时跟踪对应,您可操作以下方案。
解决方案:在您使用的模块点击右上角设置-镜头设置-人脸检测框镜像-开启检测框镜像。 - 人脸识别Android SDK人脸注册成功后,重启SDK人脸数据丢失
问题背景:若您二次开发后在使用人脸库批量导入功能,若出现重启SDK人脸数据丢失的问题,可通过以下流程排查
排查方案:排查在人脸批量导入后,是否有调用FaceApi.getInstance().init,如图:
排查这里是否正常执行,若没有则手动调用执行重新编译。 - 人脸识别Android SDK修改topNum参数导致人脸比对不同步问题
问题背景:若基于DEMO修改了featureResult对应list获取的topNum参数,导致在进行人脸1:N比对时出现人脸库未实时同步问题。
解决方案:正常情况在DEMO中,这部分对应的topNum参数是1,如图:
这里本身可不用修改,若修改则只能修改为allUserList.size,请参考:
或者修改为FaceApi.getInstance().getAllUserList().size(),请参考:
- 人脸识别Android SDK livenessmodel为null问题
您若在使用过程中发现您设备中打印的livenessmodel始终为null,您可排查设备的视频流是否接入正常,以及确认设备的镜头是否安装倒置。 - 人脸识别Android SDK 导入图片失败原因
您在对人脸识别Android SDK进行人脸图片导入时,若报错,您可参考以下图片导入失败错误码对应说明,请参考:
- 人脸识别Android SDK批量激活,控制台报错授权过期
问题背景:如您在控制台新建应用对人脸识别Android SDK 批量激活时,报错授权已过期,如下图:
解决方案:这需为您延长该应用的有效期,您提交工单,我们为您在后台延长应用的有效期即可。 - 人脸识别Android SDK 戴口罩无法识别通过
解决方案:在录入人脸时需不带口罩进行录入人脸,注册成功后,您可通过以下两种方式解决戴口罩无法识别问题:
1.关闭质量检测;
2.质量检测开关打开:左右脸颊设置1,鼻子设置1,嘴巴设置1,下巴设置1。
以上两种方式均可。 - 人脸识别Android SDK批量导入方式,识别效果有所欠缺
问题背景:如您在使用人脸识别Android SDK人脸图片批量导入方式批量注册人脸,在识别时出现识别效果不是很好,该情况的出现是由于以批量导入方式受限于图片的内容和具体分辨率,可能会有识别效果没有现场人脸录入的效果那么好。
解决方案:您可尝试通过裁剪图片的背景部分仅保留清晰人脸、筛选模糊人脸图片提高分辨率。
1.4 二次开发指引
- 如何判断人脸识别SDK视频流中已出现人脸
人脸识别Android SDK共分包括闸机模式、考勤模式等8个功能模块,应用什么模块,就在对应模块内部进行查看,这里以闸机模式gatelibrary为例进行分析:
首先进入路径FaceSDKAndroid/gatelibrary/src/main/java/com/baidu/idl/main/facesdk/activity/gate/FaceRGBGateActivity,找到FaceSDKManager.getInstance().onDetectCheck,如图:
判断图中标注livenessModel是否为null:livenessModel为null代表此时视频流中未检测到人脸;livenessModel不为null代表此时视频流中已检测出人脸。 - nirlivelist优化问题
问题背景:若您在进行二次开发过程中,有nirlivelist报错或有需求简化nirlivelist部分,您可进行以下操作。
解决方案:您可将SDK中nirlivelist如下对应部分删除,同时rgblivelist也可对应删除,删除后对活体的检测不会有影响。
- Android人脸识别SDK如何判断注册时识别到多少张人脸
进入路径FaceSDKAndroid/registerlibrary/src/main/java/com/baidu/idl/main/facesdk/registerlibrary/user/manager/ImportFileManager, 根据图中标注添加日志,如图:
根据打印结果可查看对应识别到的人脸数。 - Android人脸识别SDK特征值提取 ret返回-11问题
问题背景:正常情况下人脸特征值提取成功返回的ret状态是128,若返回ret -11,应排查以下方法的执行是否正常
排查方案:可打印FaceSDKManager.getInstance().getFaceFeature().feature返回的featureSize,单步排查流程执行逻辑
- 人脸识别Android SDK调用pushPersonFeatureList未返回
问题背景:在识别SDK中调用pushPersonFeatureList方法没有返回,可通过以下流程排查
排查方案:打印日志确认getFaceSearch方法返回的FaceSearch对象的属性是否不为空,且已经正常执行进入getFaceSearch方法,如图:
- 人脸识别Android SDK人脸库图片对应路径
对于在SDK人脸库中注册成功的人脸库,可在sd卡根目录Success-Import文件夹中进行查看。
1.5 编译常见问题
- Android Studio编译报错 Task 'assembleDebug' not found in project ':app'
如使用Android Studio编译SDK出现如下报错
解决方案:点击Android Studio左下角Build Variants,切换打包方式(debug与release切换)重新编译
- 人脸识别Android SDK抵御活体攻击方法
当前人脸识别Android SDK在抵御活体攻击方面具备以下策略,您可结合您的需求设置:
1.若您对于安全等级要求较高,您请开启双目模式,包括rgb+nir双目模式或rgb+depth双目模式;
2.若您需抵御照片翻拍攻击、提前录制视频攻击等方式:
您可开启rgb+nir双目模式,该模式会对视频中的人像进行nir近红外活体识别,仅对于红外活体过滤通过的人脸会通过进行下一步的特征值提取及比对,对照片、视频等一系列平面的攻击方式有较好效果;
3.若您需抵御佩戴人脸模具等攻击方式
您可开启rgb+depth双目模式,该模式对于人脸模具等立体结构的攻击有较好效果。 - 人脸识别Android SDK release版本编译报错"Program type already present: com.baidu.idl.main.facesdk.BuildConfig"
问题背景:如您在使用人脸识别Android SDK对release版本编译时报错"Program type already present: com.baidu.idl.main.facesdk.BuildConfig",如下:
解决方案:正式包会进行混淆并且需要手动录入基础信息,因此您需修改package信息,这里以Demo包名为例,您进入facelibrary->src->main->AndroidManifest.xml按以下修改,重新编译即可。
1.6 特征值端云同步问题
- 人脸特征值在多平台通用问题
问题背景:调用人脸特征值同步接口URL: https://aip.baidubce.com/rest/2.0/face/v1/feature,该接口返回的结果feature如下
该接口返回的feature若需与Android、Windows等平台进行通用,需通过解密流程才能完成。
解密方法:调用Base64.decode(contentBase.getBytes(),Base64.DEFAULT)方法解密,详细操作如图: - 人脸图片的特征值提取
问题:
如何获取对应人脸图片的特征值
解决方案:
首先在这里下载工程
链接: https://pan.baidu.com/s/1EFi-CW2FNZOL1R-iRh2F5g 提取码: abq6
1.导入待测试图片
将您需提取特征值的人脸图片,放入SD卡根目录test文件夹下(如果没有test文件夹您手动新建并放入即可)
2.进入工程HomeActivity文件
3.实际获取人脸图片特征值
以下只是对提取特征值的逻辑进行介绍,不用实际操作
4.输出打印特征值
这里打印输出的faceFeature即为传入人脸图片对应的特征值信息。
2. Andorid人脸识别SDK人证核验无法通过解决方案
问题:
人脸识别Android SDK使用人证核验模式无法比对通过问题。
解决方案如下:
(以下方案依次执行即可,不用全部操作)
1.关闭质量检测,将人脸最小识别px调至30px
2.增大读卡器读取的身份证图片分辨率,如您是通过读卡器等外置设备,提取身份证、卡证等人脸图片,您可适当提高人脸图片的分辨率。
3.阈值调整
证件照1:1比对,推荐阈值70(对于老年图片或照片遮挡模糊度较高还可继续往下调整);
证件照1:N比对,推荐阈值80。
4.手动拍摄身份证照片传入SDK
5.打印log,看逻辑 对具体流程进行比对。
以下是对于仍不能认证通过的排查步骤:
(a)排查特征值提取是否正常
identifylibrary模块,onActivityResult中uir1中传入证件照片,返回的secondFeature为对应的人脸特征值
ret返回128,secondFeature有值,则证件特征值提取成功。
(b)排查证件照与人脸视频流比对是否正常比对
传入刚刚获取的图片特征值secondfeature,视频流中人脸的特征值SDK会自动获取并保存。确定图中标注视频流人脸特征值feature1与证件特征值feature2是否正常
使用featureCompare进行识别比对,根据返回的score与自定义阈值比较,判定是否比对通过。
(c)若用户使用两张图片格式进行人脸比对,则根据demo进行二次开发:
首先获得人脸图片1的特征值,对应secondFeature:
相同方式获得人脸图片2的特征值,对应firstFeature:
两张图片进行比对,返回score,根据阈值进行自定义结果返回
此外,若用户上传的证件照为生活照格式,则这里也可对应进行替换
替换为
3. SDK报错Gradle文件适配问题解决方案
问题:
在运行AS build时报错gradle文件不匹配问题。
解决方案如下:
在使用Android Studio过程中遇到的Gradle 报错适配问题可参考如下解决方案:
Gradle 适配
在Mac 版Android Studio打开工程时可能会遇到以下报错(windows版流程一样 路径参照修改)
解决方式如下:
1.在https://services.gradle.org/distributions/gradle-7.0.2-bin.zip 中,将文件下载到本地。
2.下载下来后,在命令终端执行如下命令打开Android Studio根路径配置的gradle,其中标红换为自己的user
3.打开后将网上下载下来的gradle-7.0.2-bin.zip复制到以上dists目录下并解压
4.在项目路径下—gradle—wapper—gradle-wrapper.properties
修改以下配置
对应修改为以下参数
5.打开preferences
将找到gradle配置项进行修改,选择apply
6.至此完成gradle文件的适配,但同时需要更改dependences
可以看到改版本对应为4.2.1
修改dependences指向为目标版本进行对应
7.找到右上角Sync Projects with Gradle Filles,运行一下
8.同步成功后,build apks,将编译没问题的工程build为apk,可以直接推进手机。
完成
此外如果需要引用sdk,首先将sdk copy到根目录,并在根目录/build.gradle文件中添加以下部分:
dependencies {compile fileTree(include: ['*.jar'],dir: 'libs')}
4. 人脸识别7.X 版本SDK重启设备需重新激活解决方案
问题:
在7.X版本的人脸识别Android SDK,存在问题:设备通过在线激活成功后,断网重启的情况下需要重新激活授权问题。
解决方案:
首先下载license文件,下载地址:https://ai-toolbox.bj.bcebos.com/AndroidTool/licenseFix.rar?authorization=bce-auth-v1/2a5115b018924a7bb2405efb5392855f/2022-09-21T02%3A27%3A17Z/-1/host/0311b5a4babfb7fb6347f52c07022086083716e9cadd8fbb1ad15e1b6e8b4410
解压后关注两处文件:
(1)jar包
进行拷贝bd_unifylicense.jar,如图:
(2)进入jni文件
再次进入arm64-v8a与armeabi-v7a
分别进入,拷贝以下文件,如图:
共拷贝这三处文件,至此完成需要替换文件的拷贝。
进入原正在使用的SDK工程路径,如图
再进入FaceSDKAndroid
使用Android Studio打开工程,并将以上三份文件替换到如下文件中,如图:
(注意仅替换文件,不是整体文件夹)
替换后在AS上方,点击Build-Clean Project
执行成功后,编译APK推进设备安装,该APK即可修复在首次激活成功后,重启设备即使在无网络环境下也无需再次激活授权流程。
5. 人脸识别Android SDK镜头问题解决方案
问题:
用户在人脸识别SDK中, 切换前后镜头(或多个镜头设备切换指定镜头) 未生效;
点击旋转镜头角度 未生效。
解决方案:
以下分两个问题解决:
1.切换前后置镜头问题
解决方案
在具体模块( 这里以考勤模式attendancelibrary为例)CameraPreviewManager添加以下代码
标红框中的参数替换为以下之一(具体哪一个与设备的实际情况有关,需要实际测试)
2.切换显示角度,修改回显角度不生效,镜头属于旋转90度问题
SDK中角度对应的实际代码位置如下
重要:本处是举例修改8个模块中具体一个,这里是考勤模式attendace下的CameraPreviewManager文件,实际上共有8个模块可修改(使用哪个模块修改哪个模块对应的文件即可)
同时若在人脸注册时视频流仍是旋转的,对应找到需注册模块 registerlibrary的CameraPreviewManager文件,同步修改。
注意:您的每次修改都需将设备中历史SDK删除,并通过重新安装方式保证参数修改生效。
6. 人脸识别SDK 1:N人脸搜索逻辑分析
人脸识别SDK1:N整体流程如下:
init资源——暗光恢复——.track绘制人脸框——.detect进一步获取详细人脸信息——最优人脸控制——质量检测——.silentlive活体检测(rgb活体校验、nir活体校验、depth活体校验)——.feature提取特征值——.search人脸搜索1:N返回结果。
1.initModel初始化资源
code=0 代表资源加载成功,否则根据错误码排查模型初始化问题。
各类模型初始化
onDetectCheck 开始检测识别
rgbData对应为使用rgb摄像头获取人脸数据信息、irData对应为使用nir摄像头获取人脸数据信息
onDetectCheck 检测-活体-特征-人脸检索流程,两个入口
获取faceInfo[0]最优质人脸信息
a.
b.
在该函数内部,首先rgbData转Instance
2.判断暗光恢复
3.绘制人脸框
track()获 取到的人脸初步信息存入FaceInfo[]数组,且绘制人脸框。
onLivenessCheck
4.进一步获取详细人脸信息
5.最优人脸控制
6.质量检测
完成光照、遮挡、属性部位的质量过滤
7.进行各项活体检测过滤
(1)rgb活体校验
(2)nir活体校验
(3)depth活体校验
特征提取+人脸检索
重点在这里 color="#0000dd">landmarks —> feature (人脸关键点转人脸特征值)
8.提取特征值
9.featureSearch人脸检索1:N
搜索结果与设定阈值比较
若比对通过返回人脸信息
综合以上步骤,人脸搜索1:N全流程 :
init资源——暗光恢复——.track绘制人脸框——.detect进一步获取详细人脸信息——最优人脸控制——质量检测——.silentlive活体检测(rgb活体校验、nir活体校验、depth活体校验)——.feature提取特征值——.search人脸搜索1:N返回结果。
7. 人脸识别SDK去除本地时间校验解决方案
问题:
在控制台下载并使用人脸SDK后,根据在线激活、离线激活、批量激活方式完成授权后,在后续使用过程中报错: license use times has reached the upper limit问题
解决方案:
(该方案是去除本地时间校验和在线激活每次均需联网的方案,间接性地解决了激活次数上限问题)
根据链接下载license文件,下载链接如下:
链接: https://pan.baidu.com/s/1PUOXKuH8693kmUmDSs4Jeg 提取码: v51d
解压后关注两处文件:
(1)jar包
进行拷贝
(2)so库
分别进入,拷贝
拷贝so文件后,进入使用的SDK 工程路径
再进入
将以上文件替换到如下文件中(注意仅替换文件,不是整体文件夹)
替换后在AS上方,点击Build-Clean Project
执行成功后,编译APK推进设备安装,该APK即可完成在激活后,去除本地时间校验报错license use times has reached the upper limit问题。
8. 识别SDK视频流屏蔽与控制的解决方案
问题:
屏蔽视频流、控制SDK视频流大小,保证功能运行+接入三方业务UI
解决方案:
在具体模块(指如闸机模块、考勤模块)中找到starpreview函数执行,这里以属性检测模块中代码为例进行分析,如图
startPreview是SDK开启摄像头的逻辑,视频流真正开启时,对应的UI控制和显示就在这里
在该Activity中找到 autoTexturePreviewView对应layout .fa_auto
找到该Activity对应layout文件
进入页面布局文件中,根据id找到对应视频流UI com.baidu.idl.face.main.attribute.camera.AttrbuteAutoTexturePreviewView
1、解决屏蔽SDK视频流显示:
在这里修改宽、高就可以了,width、height修改为1dp,视频流完成屏蔽不会再显示。
(除可以修改宽高,也可自己写入其他view进行覆盖)
或者透明度修改为0也可实现
2、控制SDK视频流大小
这里如果将width和height修改为91dp、99dp( 具体宽高大小根据业务需求进行更改即可 ),可对画面中视频流的大小进行控制
此外, 在这里也可加入居中等其他排版完成对视频大小和方位的控制。
覆盖或屏蔽视频流后在在该布局文件中根据实际需求添加新的UI,或引入自行的view进行显示即可。
同时也可以使用以下方式实现:自定义设定宽高
9. 人脸注册添加自定义质量检测解决方案
解决:人脸注册时结合用户三方业务需求,添加自定义逻辑方案
人脸注册模块代码对应位置如下:
根据活体模型执行对应跳转:
不使用活体、RGB活体、RGB+NIR活体、RGB+DEPTH活体、RGB+NIR+DEPTH活体
虽然有4种方式,但根据跳转的进入方式,只分两种逻辑
1、若进入的是RGB单目活体方式
进入FaceTrackManager
找到实际进行质量检测的逻辑onQualityCheck
结合用户三方业务需求,添加自定义逻辑方案,
如左眼达到遮挡条件时进行提示、不再进行注册、或其他自行需求逻辑执行
2、若进入的是除RGB单目方式之外的逻辑
进入对应逻辑FaceSDKManager onDetectCheck
找到实际进行质量检测的逻辑onQualityCheck
结合用户三方业务需求,添加自定义逻辑方案,
比如鼻子遮挡后进行提示、不再进行注册、或其他自行需求逻辑执行
10. 人脸识别 Android SDK 批量激活去除重复激活解决方案
问题:
人脸识别Android SDK,若您使用的批量激活方式激活,在授权后,重启设备会重新进入激活授权界面,需要您点击批量激活重新完成激活授权过程,通过以下方案您可去除该重复操作步骤,仅需一次批量激活流程。
解决方案:
(由于该修改过程较为繁琐,因此我们已经为您修改代码,将修复后的工程上传到云端,您可下载直接使用)
您请先在这里下载修复工程包:
https://ai-toolbox.bj.bcebos.com/AndroidTool/BatchUPFaceSDKAndroid.zip?authorization=bce-auth-v1/2a5115b018924a7bb2405efb5392855f/2022-12-05T08%3A36%3A46Z/-1/host/8227aea41483654bd2fcf569d1e4ef9dfa42b30e81d479f862a0d0c06f28369b
下载解压后。打开找到以下路径文件,如图:
app/src/main/java/com.baidu.idl.face.main/activity/FaceSDKManager
找到图中标注 licenseBatchlineKey 赋值处,在该处填写控制台配置的批量激活licenseId,如图:
将图中您申请的License Id填入以上licenseBatchlineKey中,点击 build 重新编译生成 apk,即可安装使用。该版本 apk 可在首次完成激活授权后,在退出、重启设备等操作下无需再次激活流程。