https://ai.arcsoft.com.cn/product/arcface.htmlhtml
申請經過後便可下載SDK,查看APP_ID和SDK_KEYandroid
虹軟ArcFace 2.0 Android包含人臉檢測、年齡信息檢測、性別信息檢測、人臉三維角度檢測、活體檢測、人臉特徵提取、人臉特徵比對功能。算法
其中暴露對外的功能方法有: active(激活)安全
init(初始化)網絡
detectFaces(人臉檢測)ide
process(活體檢測、年齡檢測、性別檢測、人臉三維角度檢測功能使用該方法,以或運算組合形式選擇處理的功能,並以getXXXXX方法獲取處理的結果)函數
extractFaceFeature(特徵提取)ui
compareFaceFeature(特徵比對)this
unInit(銷燬)線程
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{ //激活失敗的狀況 }
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{ //初始化失敗 }
List faceInfoList = new ArrayList<>(); int code = faceEngine.detectFaces(nv21, width, height, FaceEngine.CP_PAF_NV21, faceInfoList); if (code == ErrorInfo.MOK && faceInfoList.size() >0) { //人臉檢測成功而且檢測到了人臉的狀況 }else{ //人臉檢測失敗或未檢測到人臉的狀況 }
FaceFeature faceFeature = new FaceFeature(); int code = faceEngine.extractFaceFeature(nv21, width, height, FaceEngine.CP_PAF_NV21, faceInfo, faceFeature); if (code == ErrorInfo.MOK) { //特徵提取成功 }else{ //特徵提取失敗,可根據code查看緣由 }
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查看緣由 } }
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 中獲取檢測結果 } }
if (faceEngine != null) { int faceEngineCode = faceEngine.unInit(); Log.i(TAG, "unInitEngine: " + faceEngineCode); }
引擎的初始化中須要傳入檢測模式( 視頻流模式 或 圖片模式 ),除了識別功能模塊(extractFaceFeature和compareFaceFeature)的其餘功能都是有檢測模式區分的,對於人臉檢測、年齡檢測、性別檢測、人臉三維角度,使用視頻流模式處理速度更快。可是活體檢測比較特殊:圖片模式的處理是阻塞的,處理速度較慢,須要等待返回結果;視頻流模式則處理速度很快,處理後立刻能獲取結果,可是一段視頻流的首幀傳入後返回的值爲未知,在一段時間後開始拿到的值纔是真正的算法結果。
單個引擎的同一功能模塊中的算法功能函數都是線程不安全
的,且調用過程當中不能進行銷燬。
舉幾個例子: 1)在A線程進行人臉檢測(detectFaces)時能夠在B線程同時進行特徵解析(extractFaceFeature)。 2)在A線程進行人臉檢測(detectFaces)時不能夠在B線程同時進行人臉檢測(detectFaces)。 3)在A線程進行特徵解析(extractFaceFeature)時候不能夠在B線程同時進行銷燬(unInit)
https://ai.arcsoft.com.cn/manual/arcface_android_guideV2.html
http://ai.arcsoft.com.cn/statics/mannual/arcface/android/index.html