共计 2898 个字符,预计需要花费 8 分钟才能阅读完成。
引言
使用了免费的人脸识别算法,感觉还是很不错的,但是初次接触的话会对一些接口的参数有些疑问的。这里分享一下我对一些参数的验证结果(这里以 windows 版本为例,linux、android 基本一样),希望能更好的帮助各位接入虹软的人脸识别算法。
本文主要分析以下两个参数:
• detectFaceMaxNum
• combinedMask
detectMode 参数介绍
在引擎初始化的时候,需要选择 video 或 image 模式,在接口头文件中定义了宏 ASF_DETECT_MODE_VIDEO、ASF_DETECT_MODE_IMAGE,根据需要的模式传入即可。video 模式对应人脸追踪算法(FT),image 模式对应人脸检测算法(FD),关于 FT/FD 算法的区别可以参考虹软 AI 人脸识别 SDK 接入 — 参数优化篇(1)通过测试数据,个人感觉 image 模式下的数据更能准确的体现算法的能力,下面关于其他参数的介绍均在 image 模式下进行;
测试机器硬件配置:
• 处理器:Intel(R)Corei5-7400 CPU @ 3.00GHZ 300GHZ
• 安装内存 (RAM):16.00GB(15.9GB 可用)
• 系统类型:win-10 64 位操作系统
参数介绍:
一、detectFaceMaxNum 参数说明
1.1 推荐值
初始化接口中 detectFaceMaxNum 参数的设置决定 ASFDetectFaces(FT/FD)接口单帧图片允许检测的最大人脸数,官网推荐最大值不超过 50,虽然可以设置更大的值,但是没有必要,下面数据可以说明;
1.2 检测到的人脸数对应的性能消耗
测试用例:
- 1280*720 像素图像数据;
- 循环检测 100 次取平均值;
• ASF_DETECT_MODE_IMAGE 模式
单帧图片中人脸数 耗时 (ms)
1 16
2 21
4 167
8 186
16 289
• ASF_DETECT_MODE_VIDEO 模式
单帧图片中人脸数 耗时(ms)
1 3
2 4
4 4
8 4
16 5
通过以上数据可以看出,image 模式下图片中人脸数越多单次检测的耗时会越长,video 模式下图片中人脸数越多单次检测的耗时也会有略微增加。综上,detectFaceMaxNum 参数的设置多少并不影响内存的分配以及性能的消耗,仅是设置算法单帧检测的最大人脸数。
二、combinedMask 参数说明
2.1 内存占用
combinedMask 参数是初始化引擎时传入不同属性功能组合,传入的属性越多引擎分配的内存越大。实际应用情况下,传入必需的属性组合即可,传入多余属性只会占用内存。
下表数据是在测试其他参数固定,只修改 mask 参数时初始化接口内存的占用情况(数据取自 windows 任务管理器):
ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, 32, 5, combinedMask, &handle);
combinedMask 内存占用(KB)对应算法接口
全属性 121,148 全接口
无属性 4,920 无
ASF_FACE_DETECT 44,424 ASFDetectFaces
ASF_FACERECOGNITION 27,564 ASFFaceFeatureExtract
ASFFaceFeatureCompare
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 参数的解释:
初始化中参数 combinedMask 与 ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS 交集的子集;
举例说明:
例 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 接口不同属性的性能
测试用例:
- 1280*720 像素图像数据;
- 循环检测 100 次取平均值;
测试代码:
LARGE_INTEGER litmp;
LONGLONG QPart = 0, QPart1 = 0, QPart2 = 0;
QueryPerformanceFrequency(&litmp); // 获得时钟频率
QPart = litmp.QuadPart;
// 获得开始时 CPU 嘀哒声
QueryPerformanceCounter(&litmp);// 获得时钟初始值
QPart1 = litmp.QuadPart;
// 这里要计算的的代码执行的时间
for (int i = 0; i<100; i++)
{
res = ASFProcess(handle, cutImg1->width, cutImg1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg1->imageData, &detectedFaces1, processMask);
}
QueryPerformanceCounter(&litmp); // 获得时钟终止值
QPart2 = litmp.QuadPart;
// 计算时间差(ms)
double time = (double)(QPart2 – QPart1) / (double)QPart * 1000;
printf(“time = %lfn”, time);
测试结果
combinedMask 参数 性能(ms)
ASF_AGE/ASF_GENDER/
ASF_FACE3DANGLE/ASF_LIVENESS 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/pro…