虹軟人臉識別 SDK 使用 Unity Android C# Java多語言開發

Unity接入虹軟人臉識別Android版SDK

== 自改aar包開發Android應用 下方有下載鏈接所有 demo aar 包==

簡敘:
基於工作項目中需要使用到人臉識別功能,藉此機會發表下使用sdk的經過,踩坑。使用虹軟人臉識別2.0開發demo測試使用,後升級3.1升級,這裏只有3.1版本的使用。可註冊企業開發者賬號進行短期的試用碼使用很人性化。
Unity 調用 Android Studio aar 包的方法可以在CSDN搜索,其中的坑以及注意事項本文會有說明
具體細節不做介紹,自行參考Demo內容,本文只做過程介紹,以及注意事項。
具體功能可查閱SDK PDF 官網下載SDK中均有Demo和PDF文件進行查閱,但只涉及到單版本,未涉及多軟多語開發

Tip:本文攜帶Demo展示,需要的同學請隨意使用學習,轉載請註明出處,謝謝。

Demo 詳細介紹 到實機使用

1.獲取安卓機器唯一識別碼

使用arr包裏面的getDeciveInfo獲取機器識別碼

打包時候的 unity的keystroe自己創建一個從頭到尾只是用這一個keystroe 因爲機器唯一識別碼會把你的 軟件信息 也錄製進去

2.生成的txt 文件 大概 1k 左右 去官網上傳 離線激活使用
在這裏插入圖片描述在這裏插入圖片描述

後續的步驟就不貼了 按照步驟執行即可,文件名叫什麼無所謂,下載下來的 .dat 激活文件只能用在你剛纔獲取激活碼的設備上

3.Dmeo工程

在這裏插入圖片描述

一開始打算搞活體檢測,考慮到只是登錄時候搞一下算了吧還是直接一個 圖片引擎 人臉特徵碼比對簡單又快捷。就很舒服

按鈕名稱 就可以看出是什麼功能,除了視頻引擎激活沒有搞活體檢測

這一段說實話沒什麼看頭 因爲主要邏輯都在aar 包裏 Unity裏面只是在調用

/// <summary>
    /// 初始化圖片引擎
    /// </summary>
    private void InitImageFunc()
    {
        object[] objs = new object[] { FaceEngineConst.ASF_DETECT_MODE_IMAGE, FaceEngineConst.ASF_OP_ALL_OUT, 32, 1, FaceEngineConst.ASF_FACE_DETECT | FaceEngineConst.ASF_FACE_RECOGNITION };
        currentActivity.Call("initEngine", objs);
        InitFace_All.interactable = true;
    }

    /// <summary>
    /// 激活離線引擎
    /// </summary>
    private void ActiveFunc()
    {
        if (currentActivity != null)
        {
            return;
        }
        AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        currentActivity = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("initCurrentActivity");
        object[] objs = new object[] { "unityAppCode.dat" };
        bool isOk = currentActivity.Call<bool>("activeFaceEngine", objs);
        if (isOk)
        {
            InitImage.interactable = isOk;
            InitVideo.interactable = isOk;
        }
        else
        {
            Debug.LogError("離線激活有問題了");
        }
    }
 

4.工程打包後在設備指定路徑下 放置 官網 .dat 設備離線激活文件

aar包裏的路徑是這樣的 Unity 傳入 “文件名稱.dat” aar包裏做邏輯處理  

public boolean activeFaceEngine(String fileFullPath) throws IOException {

        havePermission();
        // .dat 離線激活文件 讀取路徑
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dat/" + fileFullPath;
        Log.i(TAG, "activeFaceEngine: " + path);

        File file = new File(path);
        if (file.exists()) {
            Log.i(TAG, "activeFaceEngine: " + file.getAbsolutePath());
        }


        int activeOfflineError = FaceEngine.activeOffline(thisContext, path);

        boolean isActive = false;
        String notice = null;
        switch (activeOfflineError) {
            case ErrorInfo.MOK:
                notice = "引擎激活成功";
                isActive = true;
                break;
            case ErrorInfo.MERR_ASF_ALREADY_ACTIVATED:
                notice = "已激活";
                isActive = true;
                break;
            case ErrorInfo.MERR_ASF_ACTIVEKEY_ACTIVEKEY_ACTIVATED:
                notice = "該激活碼已被其他設備使用";
                break;
            default:
                notice = "引擎激活失敗,錯誤代碼  errorInfo:" + activeOfflineError;
                break;
        }
        DialogShow("提示", notice);

        return isActive;
    }
 

演示的話不太方便演示
基本操作步驟大概貼出了,基本無大礙。

1.軟件工具版本介紹
Unity 版本 2017.4.1f , 2018.4.35f
Android 版本 4.2.2
虹軟SDK 版本 3.1
Android SDK 21-29 api
JDK版本 jdk1.8.0_181
實測機型 Android 10 , CPU Arm-v8a

2.人臉SDK核心功能使用簡介
引擎

線上激活,離線激活具體操作根據Api 調用即可,具體官方說明文檔中均有更加詳細的使用文檔

Java代碼 官方SDKjar包內容
//線上激活 傳入 上下文 激活密鑰 密鑰id sdk密鑰  官網獲取
 public static int activeOnline(Context context, String activeKey, String appId, String sdkKey) {/*代碼Demo裏面看吧*/}

//離線激活 使用此接口獲取機器碼唯一ID標識字符串 生成txt文本申請,安卓10以下的機型可直接下載官網的app獲取沒有就自己寫一個小工具吧
 public static int getActiveFileInfo(Context context, ActiveFileInfo activeFileInfo) {/*代碼Demo裏面看吧*/}
 
//離線激活 使用從官網申請下載來的dat二進制激活文件進行引擎激活
 public static int activeOffline(Context context, String filePath) {/*代碼Demo裏面看吧*/}
C#代碼 調用的aar包是自己改的
//離線激活 unity 直調 android aar 包裏的方法  所有人臉相關的操作全部由 aar包中的內容完成 C#僅做調用
//減少相互之間的參數傳遞
AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      
currentActivity = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

currentActivity.Call("initCurrentActivity");

object[] objs = new object[] { "unityAppCode.dat" };

bool isOk = currentActivity.Call<bool>("activeFaceEngine", objs);

2.引擎初始化

java 代碼
//引擎初始化 在低級版本里 某些參數都是 long 類型,後有封裝的枚舉類型不過都一個樣 具體API介紹看 SDK文檔
init(Context context, DetectMode detectMode, DetectFaceOrientPriority detectFaceOrientPriority, int detectFaceScaleVal, int detectFaceMaxNum, int combinedMask)

3.人臉抓捕

//舊版升級用的名稱還是這個實際上裏面調用了下面的  添加了一個抓取模型枚舉  RGB模式就這一種 不看so 庫根本不知道做了什麼
public int detectFaces(byte[] data, int width, int height, int format, List<FaceInfo> faceInfoList) {
    return this.detectFaces(data, width, height, format, DetectModel.RGB, faceInfoList);
}

//3.1 用的是這裏
public int detectFaces(byte[] data, int width, int height, int format, DetectModel detectModel, List<FaceInfo> faceInfoList) { /*代碼Demo裏面看吧*/}

//也可以用最新的 數據封裝類進行數據封裝傳輸,以上以下都可以使用,看具體需求  
public int detectFaces(ArcSoftImageInfo arcSoftImageInfo, List<FaceInfo> faceInfoList) {
        return this.detectFaces(arcSoftImageInfo, DetectModel.RGB, faceInfoList);
}

public int detectFaces(ArcSoftImageInfo arcSoftImageInfo, DetectModel detectModel, List<FaceInfo> faceInfoList) {/*代碼Demo裏面看吧*/}

4.人臉特徵碼獲取

這裏有一個很有意思的操作,把所有人臉庫中的圖片人臉特徵碼的二進制數據進行文文件永久化存儲,這樣運行起來好方便,需要做一個專門製作一個用來錄入人臉信息數據的工具軟件

//Java 代碼  人臉特徵碼計算獲取  
    public int extractFaceFeature(byte[] data, int width, int height, int format, FaceInfo faceInfo, int threadCount, FaceFeature feature) {}

//這是人臉特徵碼的封裝類 具體數據是一堆二進制數據
public class FaceFeature {
    public static final int FEATURE_SIZE = 1032;
    byte[] featureData;

    public FaceFeature(FaceFeature obj) {
        if (obj == null) {
            this.featureData = new byte[1032];
        } else {
            this.featureData = (byte[])obj.getFeatureData().clone();
        }

    }

    public FaceFeature() {
        this.featureData = new byte[1032];
    }

    public FaceFeature(byte[] data) {
        this.featureData = data;
    }

    public byte[] getFeatureData() {
        return this.featureData;
    }

    public void setFeatureData(byte[] data) {
        this.featureData = data;
    }

    public FaceFeature clone() {
        return new FaceFeature(this);
    }
}

5.人臉特徵碼對比

//對比就更簡單了  兩個特徵碼比較  得出相似度結果   設定相似度  結果 大於 0.8f 就是同一個人  這個閥值是官網給的推薦
    public int compareFaceFeature(FaceFeature feature1, FaceFeature feature2, FaceSimilar faceSimilar) {
        return this.compareFaceFeature(feature1, feature2, CompareModel.LIFE_PHOTO, faceSimilar);
    }
//
public int compareFaceFeature(FaceFeature feature1, FaceFeature feature2, CompareModel compareModel, FaceSimilar faceSimilar) {}

6.人臉各種信息獲取

//像這個樣子的 沒用過  看官方文檔介紹會有
public int process(ArcSoftImageInfo arcSoftImageInfo, List<FaceInfo> faceInfoList, int combinedMask) {/*代碼Demo裏面看吧*/}
//這個是 人臉其他信息功能接口 調用後可以直接獲取 當前圖片中人臉的 年齡,性別等信息  前提必須是 combineMask 組合功能裏面包含你要的功能
/*其他的 還有活體檢測,都一個套路,代碼看的懂一切使用都ok,java 也很好看懂跟 C# 孿生兄弟,相似相悖的地方太多了很好看的明白

3.Unity 注意事項

1.Unity 導入 arr 包值得注意的裏外配置表的問題,以及要刪除的地方

Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar 在Unity中的jar包路徑

2. Unity 導入 arr 包值得注意的問題

 3. 打包與離線激活,值得注意的問題

4. Android 注意事項

1.Android 工程下的結構信息

2.Android 工程的構建信息

依照這個樣子基本沒有問題 值得注意的是有修改要點 同步按鈕,點構建按鈕重新對項目進行調整

5. Bug與Android adb logcat 實際機測試

開發者中心可以查閱使用返回的報錯碼,解決引擎使用過程中出現的問題。

使用cmd 跳轉到你的 sdk platform tools 下面 使電腦連接到開發者模式下的android機器可以進行實機運行log查閱,打開android studio 可以在logcat 視圖中查閱 。

文末
內容中有文字多打錯打,不耽誤閱讀。
避開這些坑就是減少開發時間。
下面貼出下載鏈接

aar包下載路徑

UnityFaceDemo

機器識別碼獲取Demo apk 需要自行使用unity.keystore 生成

瞭解更多人臉識別產品相關內容請到虹軟視覺開放平臺

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章