虹软人脸识别 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 生成

了解更多人脸识别产品相关内容请到虹软视觉开放平台

 

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