虹軟人臉識別—版本升級介面修改說明(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](https://github.com/SkyStonePan/ArcfaceDemo_CSharp))
\* \[ArcFace 2.2 Demo\]([https://github.com/SkyStonePan/ArcfaceDemo\_CSharp\_2.2](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_2.2))
\* \[ArcFace 3.0 Demo\]([https://github.com/SkyStonePan/ArcfaceDemo\_CSharp\_3.0](https://github.com/SkyStonePan/ArcfaceDemo_CSharp_3.0))
\* \[ArcFace 3.1 Demo\]([https://github.com/SkyStonePan/ArcfaceDemo\_CSharp\_3.1](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# /// /// 檢測模式 /// public enum DetectionMode : uint { /// /// Video模式,一般用於多幀連續檢測 /// ASF\_DETECT\_MODE_VIDEO = 0x00000000, /// /// Image模式,一般用於靜態圖的單次檢測 /// 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# /// /// 人臉比對可選的模型 /// public enum ASF_CompareModel { /// /// 用於生活照之間的特徵比對,推薦閾值0.80 /// ASF\_LIFE\_PHOTO = 0x1, /// /// 用於證件照或生活照與證件照之間的特徵比對,推薦閾值0.82 /// 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](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](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。**
### **相關產品大家可以到[虹軟視覺開放平臺](https://ai.arcsoft.com.cn/third/mobile.html?utm_source=cnblogs&utm_medium=referral)進一步