一、獲取SDK 1.進入ArcFace2.0的申請地址 https://ai.arcsoft.com.cn/product/arcface.html 2.填寫信息申請並提交 申請通過後即可下載SDK,查看APP_ID和SDK_KEY 二、功能介紹 虹軟ArcFace 2.0 Android包含人臉檢 ...
一、獲取SDK
1.進入ArcFace2.0的申請地址
https://ai.arcsoft.com.cn/product/arcface.html
2.填寫信息申請並提交
申請通過後即可下載SDK,查看APP_ID和SDK_KEY
二、功能介紹
虹軟ArcFace 2.0 Android包含人臉檢測、年齡信息檢測、性別信息檢測、人臉三維角度檢測、活體檢測、人臉特征提取、人臉特征比對功能。
其中暴露對外的功能方法有:
active(激活)
init(初始化)
detectFaces(人臉檢測)
process(活體檢測、年齡檢測、性別檢測、人臉三維角度檢測功能使用該方法,以或運算組合形式選擇處理的功能,並以getXXXXX方法獲取處理的結果)
extractFaceFeature(特征提取)
compareFaceFeature(特征比對)
unInit(銷毀)
三、使用SDK
1.創建工程,並將下載解壓出的jar和so添加到工程
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) {
//激活成功或者已激活過的情況
}else{
//激活失敗的情況
}
3.初始化引擎,推薦在onCreate中執行
faceEngine = new FaceEngine();
int afCode = faceEngine.init(context.getApplicationContext(), 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 = faceEngine.extractFaceFeature(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 = faceEngine.compareFaceFeature(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 = faceEngine.getAge(ageInfoList);
int genderCode = faceEngine.getGender(genderInfoList);
int face3DAngleCode = faceEngine.getFace3DAngle(face3DAngleList);
int livenessCode = faceEngine.getLiveness(faceLivenessInfoList);
//錯誤碼校驗,判斷是否全部成功
if ((ageCode | genderCode | face3DAngleCode | livenessCode) != ErrorInfo.MOK) {
return;
}else{
//全部檢測成功,可從ageInfoList ,genderInfoList ,face3DAngleList ,faceLivenessInfoList 中獲取檢測結果
}
}
8.銷毀引擎,推薦在onDestroy中執行
if (faceEngine != null) {
int faceEngineCode = faceEngine.unInit();
Log.i(TAG, "unInitEngine: " + faceEngineCode);
}
四、註意事項
1.檢測模式相關說明
引擎的初始化中需要傳入檢測模式( 視頻流模式 或 圖片模式 ),除了識別功能模塊(extractFaceFeature和compareFaceFeature)的其他功能都是有檢測模式區分的,對於人臉檢測、年齡檢測、性別檢測、人臉三維角度,使用視頻流模式處理速度更快。但是活體檢測比較特殊:圖片模式的處理是阻塞的,處理速度較慢,需要等待返回結果;視頻流模式則處理速度很快,處理後馬上能獲取結果,但是一段視頻流的首幀傳入後返回的值為未知,在一段時間後開始拿到的值才是真正的演算法結果。
2.線程安全須知
單個引擎的同一功能模塊中的演算法功能函數都是線程不安全
的,且調用過程中不能進行銷毀。
舉幾個例子:
1)在A線程進行人臉檢測(detectFaces)時可以在B線程同時進行特征解析(extractFaceFeature)。
2)在A線程進行人臉檢測(detectFaces)時不可以在B線程同時進行人臉檢測(detectFaces)。
3)在A線程進行特征解析(extractFaceFeature)時候不可以在B線程同時進行銷毀(unInit)
參考文檔(官方的文檔和demo都十分詳細):
Android平臺開髮指南:
https://ai.arcsoft.com.cn/manual/arcface_android_guideV2.html
API介面說明
http://ai.arcsoft.com.cn/statics/mannual/arcface/android/index.html