代码改变世界

虹软人脸识别—版本升级接口修改说明(C#)

2020-08-03 14:21  码仔很忙  阅读(1271)  评论(0编辑  收藏  举报

自虹软发布了免费、离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo。因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行功能验证。在虹软官方群里及论坛上,看到有朋友反馈升级SDK后出现如下问题:

  1. 替换SDK文件有时接口会返回2
  2. 内存溢出、程序crash
  3. 检测结果混乱

我在版本升级的过程中也遇到了这类问题,下面记录了版本升级过程中需要做的修改,希望能对一些朋友有所帮助。

问题原因:从ArcFace 2.0到3.1版本,虹软SDK不断优化算法功能,在优化的过程中,对SDK的部分接口也进行了优化,添加了一些可变参数,C#代码在升级SDK时未进行同步修改

处理方法:

  • 如果仅用于体验效果,保持SDK的版本与Demo的版本一致即可

  • 如果之前使用旧版本开发且有新版本升级需求的,需要对接口的传参列表进行修改

Github的Demo

其中,SDK 2.1版本到2.2版本,新增了IR活体检测接口,只需参考Demo即可,此处不作赘述。然后我们依次说下,2.2版本的Demo如何更改使用3.0版本的SDK、3.0版本的Demo如何更改使用3.1版本的SDK,以及免费版本SDK如何替换对应增值版本的SDK。

一、ArcFace 2.2 Demo 使用ArcFace 3.0 SDK

  1. SDK中检测模式参数由结构体变更为枚举类型,为保证一致性,建议在原Demo2.2版本中,更改ArcSoftFace\SDKModels\DetectionMode.cs,改为如下:

    /// <summary>
    /// 检测模式
    /// </summary>
    public enum DetectionMode : uint
    {
        /// <summary>
        /// Video模式,一般用于多帧连续检测
        /// </summary>
        ASF_DETECT_MODE_VIDEO = 0x00000000,
    
        /// <summary>
        /// Image模式,一般用于静态图的单次检测
        /// </summary>
        ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF
    }
    

    同时将ArcSoftFace\FaceForm.cs中的Line:166Line:188分别改为:

    //Line166
    uint detectMode = (uint)DetectionMode.ASF_DETECT_MODE_IMAGE;
    //Line188
    uint detectModeVideo = (uint)DetectionMode.ASF_DETECT_MODE_VIDEO;
    
  2. SDK中的人脸检测接口ASFDetectFaces接口新增可选参数ASF_DetectModel,为保证接口调用正常,必须更改ArcSoftFace\SDKUtil\ASFFunctions.cs中的Line:50,改为如下:

    public static extern int ASFDetectFaces(IntPtr pEngine, int width, int height, int format, IntPtr imgData, IntPtr detectedFaces, int ASF_DetectModel=0x1);
    
  3. SDK中的特征比对接口ASFFaceFeatureCompare接口新增ASF_CompareModel参数,可选参数值如下:

    • ASF_LIFE_PHOTO:用于生活照之间的特征比对,该项为默认项;
    • ASF_ID_PHOTO:用于证件照或证件照和生活照之间的特征比对。

    为保证接口匹配,先在ArcSoftFace\SDKModels中增加新建枚举,名为ASF_CompareModel.cs,代码如下:

    /// <summary>
    /// 人脸比对可选的模型
    /// </summary>
    public enum ASF_CompareModel
    {
        /// <summary>
        /// 用于生活照之间的特征比对,推荐阈值0.80
        /// </summary>
        ASF_LIFE_PHOTO = 0x1,
    
        /// <summary>
        /// 用于证件照或生活照与证件照之间的特征比对,推荐阈值0.82
        /// </summary>
        ASF_ID_PHOTO = 0x2
    }
    

    接着更改\ArcSoftFace\SDKUtil\ASFFunctions.csLine:89,新增可选参数,代码如下:

    public static extern int ASFFaceFeatureCompare(IntPtr pEngine, 
                                           IntPtr faceFeature1, 
                                           IntPtr faceFeature2, 
                                           ref float similarity, 
                                           ASF_CompareModel compareModel = ASF_CompareModel.ASF_LIFE_PHOTO);
    
  4. 此版本对人脸特征模型进行了升级,SDK 2.* 版本存储的人脸特征需要重新提取

  5. 此外还有新增功能接口,具体新增内容详见,接口调用详见ArcFaceDemoV3.0代码。

二、ArcFace 3.0 Demo 使用 ArcFace 3.1 SDK

  1. SDK中的ASFFaceFeatureExtract接口新增参数MInt32 threadNum = 1,为保证接口调用正常,必须更改\ArcFaceSDKDemo\ArcFaceSDK\Utils\ ASFFunctions.cs中的Line:89,代码如下:

    public static extern int ASFFaceFeatureExtract(IntPtr pEngine, 
                                                   int width, 
                                                   int height, 
                                                   int format, 
                                                   IntPtr imgData, 
                                                   IntPtr faceInfo, 
                                                   IntPtr faceFeature,
                                                   int threadNum = 1);
    
  2. SDK中的ASFFaceFeatureExtractEx接口新增参数MInt32 threadNum = 1必须更改 ArcFaceSDKDemo\ArcFaceSDK\Utils\ ASFFunctions.cs中的Line:240,代码如下:

    public static extern int ASFFaceFeatureExtractEx(IntPtr hEngine, 
                                                     IntPtr imgData, 
                                                     IntPtr faceInfo, 
                                                     IntPtr feature, 
                                                     int threadNum = 1);
    
  3. 删除 \ArcFaceSDKDemo\ArcFaceSDK\Utils\ ASFFunctions.cs中老的激活接口ASFActivation

  4. 此外还有新增功能接口,具体新增内容详见ArcFaceSDK说明文档,接口调用详见ArcFaceDemoV3.1代码。

三、基础版本SDK替换为对应的增值版本(以3.0Demo为例)

  1. ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中的在线激活接口ASFOnlineActivation增加activeKey参数,代码如下:

    public static extern int ASFOnlineActivation(string appId, string sdkKey,string activeKey);
    
  2. ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中的在线激活接口ASFActivation接口增加activeKey参数,代码如下:

    public static extern int ASFActivation(string appId, string sdkKey,string activeKey);
    
  3. ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中添加离线激活接口ASFOfflineActivation,代码如下:

    [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
    public static extern int ASFOfflineActivation(IntPtr filePath);
    

以上,仅对已有接口的修改进行了说明,新增接口的对接,可以参考对应版本的Demo。

相关产品大家可以到虹软视觉开放平台进一步了解