虹软⼈脸识别-ArcFaceSDK介绍及使⽤注意事项
很多朋友在开发⼈脸识别系统的时候,会遇到各种各样的问题,现在我们以安卓平台使⽤虹软的免费离线⼈脸识别SDK开发为例,给⼤家介绍⼀下如何开发⼀个带有图⽚的⼈脸检测、视频画⾯的⼈脸属性检测、⼈脸注册识别等功能的⼈脸识别系统。
⼀、获取SDK
1.进⼊ArcFace
2.0的申请地址
2.填写信息申请并提交
申请通过后即可下载SDK,查看APP_ID和SDK_KEY
<br/> ### ⼆、SDK功能介绍 虹软ArcFace 2.0 Android SDK包含⼈脸检测、年龄信息检测、性别信息检测、⼈脸三维⾓度检测、活体检测、⼈脸特征提取、⼈脸特征⽐对功能。SDK还⽀持静态图模式的检测⽅式和视频流模式的检测⽅式。
<br/> #### 2. 激活引擎 ``` FaceEngine faceEngine = new FaceEngine();
//激活⽅法⾸次调⽤有⽹络和⽂件操作,后续只有⽂件操作,建议不要放在主线程中进⾏
int activeCode = faceEngine.active(SettingsActivity.this, Constants.APP_ID, Constants.SDK_KEY);
if (activeCode == ErrorInfo.MOK || activeCode == ErrorInfo.MERR_ASF_ALREADY_ACTIVATED) {
//激活成功或者已激活过的情况sdk
}else{
}
#### 3. 初始化引擎,推荐在启动时执⾏
faceEngine = new FaceEngine();
int afCode = faceEngine.ApplicationContext(), FaceEngine.ASF_DETECT_MODE_VIDEO, FaceEngine.ASF_OP_0_HIGHER_EXT,
16, 10, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT | FaceEngine.ASF_FACE3DANGLE|....);
if (afCode != ErrorInfo.MOK) {
//初始化成功
}else{
//初始化失败
}
#### 4. ⼈脸检测
List faceInfoList = new ArrayList<>();
int code = faceEngine.detectFaces(nv21, width, height, FaceEngine.CP_PAF_NV21, faceInfoList);
if (code == ErrorInfo.MOK && faceInfoList.size() >0) {
//⼈脸检测成功并且检测到了⼈脸的情况
}else{
//⼈脸检测失败或未检测到⼈脸的情况
}
#### 5. 特征提取
FaceFeature faceFeature = new FaceFeature();
int code = actFaceFeature(nv21, width, height, FaceEngine.CP_PAF_NV21, faceInfo, faceFeature); if (code == ErrorInfo.MOK) {
}else{
//特征提取失败,可根据code查看原因
}
#### 6. 特征⽐对
public void compareFace(FaceFeature faceFeature1,FaceFeature faceFeature2){
FaceSimilar faceSimilar = new FaceSimilar();
int code = faceEnginepareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
if (code == ErrorInfo.MOK){
//⽐对成功,可查看faceSimilar中的相似度
}else{
//⽐对失败,可根据code查看原因
}
}
#### 7. 活体、⼈脸三维⾓度、年龄、性别检测
int faceProcessCode = faceEngine.process(nv21, width, height, FaceEngine.CP_PAF_NV21, faceInfoList, FaceEngine.ASF_AGE | FaceEngine.ASF_GENDER | FaceEngine.ASF_FACE3DANGLE | FaceEngine.ASF_LIVENESS);
if (faceProcessCode != ErrorInfo.MOK){
//失败的情况
}else{
//process成功,可获取结果
List ageInfoList = new ArrayList<>();
List genderInfoList = new ArrayList<>();
List face3DAngleList = new ArrayList<>();
List faceLivenessInfoList = new ArrayList<>();
int ageCode = Age(ageInfoList);
int genderCode = Gender(genderInfoList);
int face3DAngleCode = Face3DAngle(face3DAngleList);
int livenessCode = Liveness(faceLivenessInfoList);
//错误码校验,判断是否全部成功
if ((ageCode | genderCode | face3DAngleCode | livenessCode) != ErrorInfo.MOK) {
return;
}else{
//全部检测成功,可从ageInfoList ,genderInfoList ,face3DAngleList ,faceLivenessInfoList 中获取检测结果
}
}
#### 8. 销毁引擎,推荐在退出时执⾏
if (faceEngine != null) {
int faceEngineCode = faceEngine.unInit();
Log.i(TAG, "unInitEngine: " + faceEngineCode);
}
<br/>
###  四、注意事项
#### 1.检测模式的选择
引擎的初始化中需要传⼊检测模式( `视频流模式` 或 `图⽚模式`  ),除了识别功能模块([`extractFaceFeature`](ai.arcsoft/statics/mannual/arcface/an
#### 2.引擎的多线程使⽤
单个引擎的同⼀功能模块中的算法功能函数`不⽀持多线程调⽤`,且`调⽤过程中不能进⾏销毁`。若需多线程调⽤,需要创建多个引擎。
举⼏个例⼦:
- 在`线程1`进⾏⼈脸检测[`(detectFaces)`](ai.arcsoft/statics/mannual/arcface/android/com/arcsoft/face/FaceEngine.html#detectFaces-byte:A-int-int-in ![多引擎使⽤⽰例](upload-images.jianshu.io/upload_images/13934799-38113a1dc7f24620.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 在`线程1`进⾏⼈脸检测[`(detectFaces)`](ai.arcsoft/statics/mannual/arcface/android/com/arcsoft/face/FaceEngine.html#detectFaces-byte:A-int-int-in ![多引擎使⽤⽰例](upload-images.jianshu.io/upload_images/13934799-5cef309ff16ead9a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 在`线程1`进⾏特征解析[`(extractFaceFeature)`](ai.arcsoft/statics/mannual/arcface/android/com/arcsoft/face/FaceEngine.html#extractFaceFeature-![多引擎使⽤⽰例](upload-images.jianshu.io/upload_images/13934799-8a13d38e98444379.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#### 3.运⾏时报java.lang.UnsatisfiedLinkError
`java.lang.UnsatisfiedLinkError`是很常见的jni相关错误,若出现该错误,原因⼀般有以下⼏种:
- **Android⼯程⽬录下动态库⽂件⽬录下相关动态库不全或动态库⽂件⽬录下有多个ABI⼦⽬录,但是⼦⽬录中的⽂件列表不同**
**详细介绍:**
⾸先,应⽤安装到设备时,只有该设备的CPU架构⽀持的最优so库才会被拷贝到本地lib中。例如某个⼯程的本地库⽬录中,`armeabi-v7`下包含四个动态库⽂件:`a.so,以下是动态库⽂件存放的⼀些可能情况:
![动态库⽂件存放举例](upload-images.jianshu.io/upload_images/13934799-5fdc1b794a7860ff.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
**解决⽅案:**
如果未在adle中重新指定动态库的⽬录,那么动态库的默认路径将是:projectName->moduleName->src->main->jniLibs。
确保动态库⽬录下的`armeabi-v7a`⽬录或兼容`armeabi-v7a`的⽬录包含ArcFace 2.0 Android SDK相关的动态库⽂件,且每个ABI⽬录下的⽂件名称列表相同。
- **动态库⽂件虽然成功加载,但是不到对应的native⽅法**
**详细介绍:**
例如在`com.arcsoft.Test`类中有⼀个⽅法定义为:
`private native int add(int a,int b)`,
⽽在编写C++代码时对应的内容为:
`extern "C" JNIEXPORT jint JNICALL Java_com_arcsoft_Test_add(JNIEnv *env, jobject, jint a, jint b, jint c)`,
native定义的⽅法多了⼀个参数,对应的Java⽅法将是`private native int add(int a, int b, int c)`,两者的⽅法签名不⼀致,因此在Java中调⽤add时将不到native对应
**解决⽅案:**
⼀般在使⽤SDK时候若产⽣这⼀问题都是⽤了不同版本或不同平台下的jar或动态库,为了确保⽅法签名⼀致,请确认jar和动态库⽂件是相同平台相同版本中的⽂件。- **在Java中定义了相关的native⽅法,但是未加载动态库⽂件**
**详细介绍:**
例如在`com.arcsoft.Test`类中有⼀个⽅法定义为:
`private native int add(int a,int b)`,
⽽对应的C++代码中有⼀个⽅法为:
`extern "C" JNIEXPORT jint JNICALL Java_com_arcsoft_Test_add(JNIEnv *env, jobject, jint a, jint b)`,但是却⼀直⽆法加载,则也可能是没有加载动态库才导致⽆法
**解决⽅案:**
在调⽤so⽂件前需要加载动态库,⼀般在类的⼀个静态代码块中调⽤。
<br/>
## 参考⽂档:
#### Android平台开发指南:
ai.arcsoft/manual/arcface_android_guideV2.html
#### API接⼝说明
ai.arcsoft/statics/mannual/arcface/android/index.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。