使用了免費的人臉識別算法,感受仍是很不錯的,可是初次接觸的話會對一些接口的參數有些疑問的。這裏分享一下我對一些參數的驗證結果(這裏以windows版本爲例,linux、android基本同樣),但願能更好的幫助各位接入虹軟的人臉識別算法。html
本文主要分析如下兩個參數:linux
在引擎初始化的時候,須要選擇video
或image
模式,在接口頭文件中定義了宏ASF_DETECT_MODE_VIDEO
、ASF_DETECT_MODE_IMAGE
,根據須要的模式傳入便可。video
模式對應人臉追蹤算法(FT),image
模式對應人臉檢測算法(FD),關於FT/FD算法的區別能夠參考虹軟AI 人臉識別SDK接入 — 參數優化篇(1) 經過測試數據,我的感受image模式下的數據更能準確的體現算法的能力,下面關於其餘參數的介紹均在image模式下進行;android
1.1 推薦值算法
初始化接口中detectFaceMaxNum參數的設置決定ASFDetectFaces(FT/FD)接口單幀圖片容許檢測的最大人臉數,官網推薦最大值不超過50,雖然能夠設置更大的值,可是沒有必要,下面數據能夠說明;windows
1.2 檢測到的人臉數對應的性能消耗ide
測試用例:性能
單幀圖片中人臉數測試 |
耗時(ms)優化 |
1spa |
16 |
2 |
21 |
4 |
167 |
8 |
186 |
16 |
289 |
單幀圖片中人臉數 |
耗時(ms) |
1 |
3 |
2 |
4 |
4 |
4 |
8 |
4 |
16 |
5 |
經過以上數據能夠看出,image
模式下圖片中人臉數越多單次檢測的耗時會越長,video
模式下圖片中人臉數越多單次檢測的耗時也會有略微增長。綜上,detectFaceMaxNum參數的設置多少並不影響內存的分配以及性能的消耗,僅是設置算法單幀檢測的最大人臉數。
2.1 內存佔用
combinedMask參數是初始化引擎時傳入不一樣屬性功能組合,傳入的屬性越多引擎分配的內存越大。實際應用狀況下,傳入必需的屬性組合便可,傳入多餘屬性只會佔用內存。
下表數據是在測試其餘參數固定,只修改mask參數時初始化接口內存的佔用狀況(數據取自windows任務管理器):
ASF_DETECT_MODE_IMAGE325&handle;ASFInitEngine(, ASF_OP_0_ONLY,,, combinedMask,)
combinedMask |
內存佔用(KB) |
對應算法接口 |
全屬性 |
121,148 |
全接口 |
無屬性 |
4,920 |
無 |
ASF_FACE_DETECT |
44,424 |
ASFDetectFaces |
ASF_FACERECOGNITION |
27,564 |
ASFFaceFeatureExtract |
ASF_AGE |
23,008 |
ASFProcess/ASFGetAge |
ASF_GENDER |
23,316 |
ASFProcess/ASFGetGender |
ASF_FACE3DANGLE |
20,484 |
ASFProcess/ASFGetFace3DAngle |
ASF_LIVENESS |
53,200 |
ASFProcess/ASFGetLivenessScore |
2.2 ASFInitEngine接口與ASFProcess接口中combinedMask參數的關係
官方文檔對ASFProcess接口中combinedMask參數的解釋:
初始化中參數與ASF_GENDERASF_FACE3DANGLEASF_LIVENESS交集的子集;combinedMaskASF_AGE |||
舉例說明:
例1:ASFInitEngine接口中傳入全屬性,則ASFProcess接口能夠傳入ASF_AGE、ASF_GENDER、 ASF_FACE3DANGLE、 ASF_LIVENESS四種屬性的任意組合。
例2:ASFInitEngine接口中傳入ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER ,則ASFProcess接口只能傳入ASF_AGE、 ASF_GENDER兩種屬性的任意組合。
2.3 cpu佔用
cpu佔用受設備以及測試條件影響比較大,根據使用狀況ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE對應的算法對cpu的消耗是比較少的,但ASF_LIVENESS是比較消耗cpu資源的,須要根據自身設備作對應處理。
2.4 ASFProcess接口不一樣屬性的性能
測試用例:
測試代碼:
LARGE_INTEGER litmp;
000LONGLONG QPart =, QPart1 =, QPart2 =;
QueryPerformanceFrequency(&litmp)//得到時鐘頻率;
QPart = litmp.QuadPart;
//得到開始時CPU嘀噠聲
QueryPerformanceCounter(&litmp)//得到時鐘初始值;
QPart1 = litmp.QuadPart;
//這裏要計算的的代碼執行的時間
int0100for (i =; i<; i++)
{
ASFProcess(handle, cutImg1->width, cutImg1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*) res =cutImg1->imageData, &detectedFaces1, processMask);
}
QueryPerformanceCounter(&litmp)//得到時鐘終止值;
QPart2 = litmp.QuadPart;
//計算時間差(ms)
/ * 1000double time = (double)(QPart2 - QPart1)(double)QPart;
"time = %lf\n"printf(, time);
測試結果
combinedMask參數 |
性能(ms) |
ASF_AGE/ASF_GENDER/ |
193 |
ASF_AGE |
29 |
ASF_GENDER |
13 |
ASF_FACE3DANGLE |
7 |
ASF_LIVENESS |
169 |
綜上所述,年齡、性別、3d角度的檢測是很是快的,活體檢測相對較慢。在實際應用中僅須要檢測ASF_AGE、ASF_GENDER、 ASF_FACE3DANGLE的話,能夠放在主線程中處理,但若是須要檢測ASF_LIVENESS建議單開線程去處理,這樣在video模式下不會出現卡幀的狀況,界面顯示比較流暢。
若是想下載虹軟sdk的話,能夠去https://ai.arcsoft.com.cn/product/arcface.html?utm_source=bky&utm_medium=referral