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

自虹软发布了免费、离线版本人脸识别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**:

* [ArcFace 2.1 Demo](https://github.com/SkyStonePan/ArcfaceDemo_CSharp)
* [ArcFace 2.2 Demo](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_2.2)
* [ArcFace 3.0 Demo](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.0)
* [ArcFace 3.1 Demo](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.1)

其中,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**版本中,更改*ArcSoftFaceSDKModelsDetectionMode.cs*,改为如下:

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

同时将ArcSoftFaceFaceForm.cs中的**Line:166**和**Line:188**分别改为:

C#    //Line166    uint detectMode = (uint)DetectionMode.ASF\_DETECT\_MODE_IMAGE;    //Line188    uint detectModeVideo = (uint)DetectionMode.ASF\_DETECT\_MODE_VIDEO;

3. SDK中的人脸检测接口ASFDetectFaces接口新增可选参数**ASF_DetectModel**,为保证接口调用正常,必须更改*ArcSoftFaceSDKUtilASFFunctions.cs*中的**Line:50**,改为如下:

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

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

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

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

接着更改ArcSoftFaceSDKUtilASFFunctions.cs中**Line:89**,新增可选参数,代码如下:

C#    public static extern int ASFFaceFeatureCompare(IntPtr pEngine,                                            IntPtr faceFeature1,                                            IntPtr faceFeature2,                                            ref float similarity,                                            ASF\_CompareModel compareModel = ASF\_CompareModel.ASF\_LIFE\_PHOTO);

5. 此版本对人脸特征模型进行了升级,SDK 2.* 版本存储的人脸特征需要重新提取

6. 此外还有新增功能接口,具体新增内容详见,接口调用详见[ArcFaceDemoV3.0](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.0)代码。

二、ArcFace 3.0 Demo 使用 ArcFace 3.1 SDK

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

C#    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**,必须更改 *ArcFaceSDKDemoArcFaceSDKUtils ASFFunctions.cs*中的**Line:240**,代码如下:

C#    public static extern int ASFFaceFeatureExtractEx(IntPtr hEngine,                                                      IntPtr imgData,                                                      IntPtr faceInfo,                                                      IntPtr feature,                                                      int threadNum = 1);

3. 需删除 _ArcFaceSDKDemoArcFaceSDKUtils ASFFunctions.cs_中老的激活接口**ASFActivation**

4. 此外还有新增功能接口,具体新增内容详见ArcFaceSDK说明文档,接口调用详见[ArcFaceDemoV3.1](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.1)代码。

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

1. 在*ArcFaceSDKDemoArcFaceSDKUtilsASFFunctions.cs*中的在线激活接口ASFOnlineActivation增加**activeKey**参数,代码如下:

C#    public static extern int ASFOnlineActivation(string appId, string sdkKey,string activeKey);
   
2. 在*ArcFaceSDKDemoArcFaceSDKUtilsASFFunctions.cs*中的在线激活接口ASFActivation接口增加**activeKey**参数,代码如下:

C#    public static extern int ASFActivation(string appId, string sdkKey,string activeKey);

3. 在*ArcFaceSDKDemoArcFaceSDKUtilsASFFunctions.cs*中添加离线激活接口ASFOfflineActivation,代码如下:

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

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

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

原文地址:https://www.cnblogs.com/ccLqqy/p/13426040.html