虹软人脸识别—版本升级接口修改说明(C#)
2020-08-03 14:21 码仔很忙 阅读(1271) 评论(0) 编辑 收藏 举报自虹软发布了免费、离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo。因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行功能验证。在虹软官方群里及论坛上,看到有朋友反馈升级SDK后出现如下问题:
- 替换SDK文件有时接口会返回2
- 内存溢出、程序crash
- 检测结果混乱
我在版本升级的过程中也遇到了这类问题,下面记录了版本升级过程中需要做的修改,希望能对一些朋友有所帮助。
问题原因:从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
-
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:166和Line:188分别改为:
//Line166 uint detectMode = (uint)DetectionMode.ASF_DETECT_MODE_IMAGE; //Line188 uint detectModeVideo = (uint)DetectionMode.ASF_DETECT_MODE_VIDEO;
-
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);
-
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.cs中Line:89,新增可选参数,代码如下:
public static extern int ASFFaceFeatureCompare(IntPtr pEngine, IntPtr faceFeature1, IntPtr faceFeature2, ref float similarity, ASF_CompareModel compareModel = ASF_CompareModel.ASF_LIFE_PHOTO);
-
此版本对人脸特征模型进行了升级,SDK 2.* 版本存储的人脸特征需要重新提取。
-
此外还有新增功能接口,具体新增内容详见,接口调用详见ArcFaceDemoV3.0代码。
二、ArcFace 3.0 Demo 使用 ArcFace 3.1 SDK
-
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);
-
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);
-
需删除 \ArcFaceSDKDemo\ArcFaceSDK\Utils\ ASFFunctions.cs中老的激活接口ASFActivation
-
此外还有新增功能接口,具体新增内容详见ArcFaceSDK说明文档,接口调用详见ArcFaceDemoV3.1代码。
三、基础版本SDK替换为对应的增值版本(以3.0Demo为例)
-
在ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中的在线激活接口ASFOnlineActivation增加activeKey参数,代码如下:
public static extern int ASFOnlineActivation(string appId, string sdkKey,string activeKey);
-
在ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中的在线激活接口ASFActivation接口增加activeKey参数,代码如下:
public static extern int ASFActivation(string appId, string sdkKey,string activeKey);
-
在ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs中添加离线激活接口ASFOfflineActivation,代码如下:
[DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)] public static extern int ASFOfflineActivation(IntPtr filePath);
以上,仅对已有接口的修改进行了说明,新增接口的对接,可以参考对应版本的Demo。