虹軟人臉識別 - ArcFace SDK介紹及使用注意事項

不少朋友在開發人臉識別系統的時候,會遇到各類各樣的問題,如今咱們以安卓平臺使用虹軟的免費離線人臉識別SDK開發爲例,給你們介紹一下如何開發一個帶有圖片的人臉檢測、視頻畫面的人臉屬性檢測、人臉註冊識別等功能的人臉識別系統。html

1、獲取SDK

1.進入ArcFace2.0的申請地址

https://ai.arcsoft.com.cn/product/arcface.htmljava

2.填寫信息申請並提交

申請經過後便可下載SDK,查看APP_ID和SDK_KEYandroid

<br/>算法

2、SDK功能介紹

虹軟ArcFace 2.0 Android SDK包含人臉檢測、年齡信息檢測、性別信息檢測、人臉三維角度檢測、活體檢測、人臉特徵提取、人臉特徵比對功能。SDK還支持靜態圖模式的檢測方式和視頻流模式的檢測方式。網絡

sdk功能
檢測模式說明

<br/>多線程

3、使用SDK

1. 工程配置

將jar文件和so文件放到對應目錄,並將jar添加至工程依賴
工程配置架構

<br/>ide

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. 初始化引擎,推薦在啓動時執行

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. 銷燬引擎,推薦在退出時執行

if (faceEngine != null) {

  int faceEngineCode = faceEngine.unInit();

  Log.i(TAG, "unInitEngine: " + faceEngineCode);

}

<br/>函數

4、注意事項

1.檢測模式的選擇

引擎的初始化中須要傳入檢測模式( 視頻流模式圖片模式 ),除了識別功能模塊(extractFaceFeaturecompareFaceFeature)的其餘功能都是有檢測模式區分的,對於人臉檢測、年齡檢測、性別檢測、人臉三維角度、活體檢測,使用視頻流模式處理速度更快。可是視頻流模式的活體檢測比較特殊:雖然處理後立刻能獲取結果,可是一段視頻流的首幀傳入後返回的值爲未知,在一段時間後開始拿到的值纔是真正的算法結果。gradle

2.引擎的多線程使用

單個引擎的同一功能模塊中的算法功能函數不支持多線程調用,且調用過程當中不能進行銷燬。若需多線程調用,須要建立多個引擎。

舉幾個例子:

多引擎使用示例

多引擎使用示例

多引擎使用示例

3.運行時報java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError是很常見的jni相關錯誤,若出現該錯誤,緣由通常有如下幾種:

  • Android工程目錄下動態庫文件目錄下相關動態庫不全或動態庫文件目錄下有多個ABI子目錄,可是子目錄中的文件列表不一樣

詳細介紹:
首先,應用安裝到設備時,只有該設備的CPU架構支持的最優so庫纔會被拷貝到本地lib中。例如某個工程的本地庫目錄中,armeabi-v7下包含四個動態庫文件:a.so,b.so,c.so,d.soarm64-v8a下包含兩個動態庫文件:c.so,d.so。某臺設備支持arm64-v8aarm64-v8a優於armeabi-v7,因而在安裝時只拷貝了arm64-v8a目錄下的so文件,加載c.so,d.so時並無問題,可是在加載a.sob.so時,因爲arm64-v8a目錄下無這些文件,就會報java.lang.UnsatisfiedLinkError
如下是動態庫文件存放的一些可能狀況:
動態庫文件存放舉例

解決方案:
若是未在build.gradle中從新指定動態庫的目錄,那麼動態庫的默認路徑將是: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),可是卻一直沒法加載,則也多是沒有加載動態庫才致使沒法找到native方法。

解決方案:
在調用so文件前須要加載動態庫,通常在類的一個靜態代碼塊中調用。

<br/>

參考文檔:

Android平臺開發指南:

https://ai.arcsoft.com.cn/man...

API接口說明

http://ai.arcsoft.com.cn/stat...

相關文章
相關標籤/搜索