自虹軟釋出了免費、離線版本人臉識別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**版本中,更改*ArcSoftFace\SDKModels\DetectionMode.cs*,改為如下:
C# /// <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**分別改為:
C# //Line166 uint detectMode = (uint)DetectionMode.ASF\_DETECT\_MODE_IMAGE; //Line188 uint detectModeVideo = (uint)DetectionMode.ASF\_DETECT\_MODE_VIDEO;
3. SDK中的人臉檢測介面ASFDetectFaces介面新增可選引數**ASF_DetectModel**,為保證介面呼叫正常,必須更改*ArcSoftFace\SDKUtil\ASFFunctions.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**:用於證件照或證件照和生活照之間的特徵比對。
為保證介面匹配,先在*ArcSoftFace\SDKModels*中增加新建列舉,名為**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 }
接著更改\ArcSoftFace\SDKUtil\ASFFunctions.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**,為保證介面呼叫正常,必須更改\ArcFaceSDKDemo\ArcFaceSDK\Utils\ 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**,必須更改 *ArcFaceSDKDemo\ArcFaceSDK\Utils\ ASFFunctions.cs*中的**Line:240**,程式碼如下:
C# 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](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.1)程式碼。
三、基礎版本SDK替換為對應的增值版本(以3.0Demo為例)
1. 在*ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs*中的線上啟用介面ASFOnlineActivation增加**activeKey**引數,程式碼如下:
C# public static extern int ASFOnlineActivation(string appId, string sdkKey,string activeKey);
2. 在*ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs*中的線上啟用介面ASFActivation介面增加**activeKey**引數,程式碼如下:
C# public static extern int ASFActivation(string appId, string sdkKey,string activeKey);
3. 在*ArcFaceSDKDemo\ArcFaceSDK\Utils\ASFFunctions.cs*中新增離線啟用介面ASFOfflineActivation,程式碼如下:
C# \[DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)\] public static extern int ASFOfflineActivation(IntPtr filePath);
以上,僅對已有介面的修改進行了說明,新增介面的對接,可以參考對應版本的Demo。