虹軟人臉識別—版本升級介面修改說明(C#)

碼仔很忙發表於2020-08-03

自虹軟釋出了免費、離線版本人臉識別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。

相關產品大家可以到虹軟視覺開放平臺進一步瞭解

相關文章