使用虹软人脸识别已经有半年多时间了,当初选择虹软人脸识别SDK还是比较偶然的,最大的特点就是Free ,后来深挖了下虹软公司,还是比较神秘的老牌算法公司,半年多使用下来,效果还是可以的;我们现有的使用场景主要集中在校园和企业人脸门禁,目前用到的sdk有Android SDK和Windows SDK,微信群里经常有人问我,用虹软的人脸识别SDK的时候怎么调优,怎么设置各种参数,每次都想去写个文章总结下,总是没有时间,这回抽点时间,把心得写下来,请大家多提提建议。
主要有以下三点:
1.FD,FT 的性能比对与使用场景
2.参数FaceOrient对识别效果的影响与调优
3.Scale 参数介绍与性能实测
一:FD,FT 的性能比对与使用场景
1.1 FD(IMAGE),FT(VIDEO)模式介绍
FD 人脸检测,对单帧或单张图片进行人脸检测,FT 是人脸跟踪检测,对连续帧或图片进行人脸检测;刚开始我和大多数人一样,也理解不了FD,FT到底有什么区别,后来仔细研究了下,发现FT 检测时,当前帧会受到上帧的影响,同时检测结果也会影响下一帧;FD检测时每张图片的结果是相互不影响的。简单举个例子,现在有连续帧A和B(B是A的下一帧),A帧有完整的脸,B帧中只有半张脸,如果对A和B做FD的时候,A可以检测到人脸,B检测不到人脸;如果对A,B做FT时,A可以检测到,B也是大概率可以检测到的(A的结果影响到B的检测)。
1.2 FD,FT性能比对
测试环境: CPU:骁龙835 Android 9.0 内存:6 GB
FD参数:
FT参数:
测试结果:
两种模式都做100 次人脸检测,最终测试结果如下:
FD:100次需要 4919ms,1次FD 需要49ms,吞吐量:20次/秒
FT:100次需要1034ms,1次FT需要10ms,吞吐量:100次/秒
1.3 不同场景下如何选择FD与FT
视频(摄像头)情况下 ,每秒产生数据有25-30帧,由于每秒只能做20次 FD,所以视频情况下,用FD来做人脸检测是不适合的,因为算力不够;但FT可以每秒运行100次 ,这种情况下用FT来识别是非常适合的,而且FT在连续帧的侦测时,人脸跟踪更加稳定,TrackID也不容易丢。
单张图片检测情况下,一般都采用FD来做人脸检测,感觉FD在做人脸检测时比FT要更加细腻,而且在这种情况下,FD的性能也不存在问题,一般情况1s内做5-10张就满足产品要求了,我们的门禁项目中,人员的人脸信息注册用的就是FD的模式。
有的开发人员觉得,在视频流情况下,也可以用FD来做检测,虽然1s内的吞吐量不足,但可以抽帧来解决,这种方案我之前也使用过,但效果真的不好,人运动的稍微快点,或者人脸转动大点时,FD就把TrackID 给跟丢了。
二. 参数FaceOrient对识别效果的影响与调优
2.1 FaceOrient人脸角度的理解
人脸角度指的是人脸在单帧图片中的2维倾斜角度,如图
0度 ASF_OP_0_ONLY
90度 ASF_OP_90_ONLY
180度 ASF_OP_180_ONLY
270度 ASF_OP_270_ONLY
大家可以把自己摄像头的单帧保存下来看看人脸的角度值。
FaceOrient角度设置是非常有讲究的,如果设置不对,对FT,FD的检测结果影响非常大。
2.2FaceOrient设置的两个原则:
a)如果系统使用场景固定,如门禁系统,摄像头出来的角度是固定的,非常强烈建议设置成实际的角度 ,这对检测速度和检测质量是最好的;例如实际是180度角度,sdk却设置成了错误的角度(0度,90度,270度)时,人脸检测结果要么是检测不到人脸,要么是结果不可信;但是官方有个全角度检测 ASF_OP_0_HIGHER_EXT,我试验了这个参数,比设置错误的角度肯定要好点,但检测性能和质量都比不上设置成180度(实际的人脸角度)
b)使用时的人脸角度经常变动,比如手机上,假如横屏是0度,那么倒着拿就是180度了,这个时候似乎也只能设置成全角度ASF_OP_0_HIGHER_EXT 检测了
2.3 使用中的坑
我的门禁系统是android 系统APP应用,经过优化后,使用了固定的角度0度,检测非常准,也非常快速;但当我们把设备发给用户使用时,用户反馈系统不能检测到人脸,痛苦呀,非常怀疑是设备问题,打包回公司测试,发现一切正常,那个郁闷呀,只能出差到用户现场,现场安装,现场测试,一切安装好后,方了,原来用户也可以这么装,硬生生的把设备装反了,由于我是设置成0度,用户反过来安装就变成180度了,自然检测不正常了;我不大可能用全角度检测,因为测试出效果不是很理想,所以在安装的时候给用户定了下安装方向,同时在我们的程序中有个设置角度的界面入口,根据不同的场景,直接设置成实际角度;这样就可以灵活地解决问题。
三. Scale 参数介绍与性能实测
3.1 Scale定义
Scale定义为人脸在整个帧或图片中的长边的占比的倒数,Scale的大小对性能的影响还是很显著的,看下下面图片的Scale值,估算下应该是3,如果SDK的Scale值设置成3时,实际的意思是小于这个大小的人脸,SDK是不做识别的;只有大于或等于这个大小的人脸,才会识别出来。
这个值要根据实际的需要进行设置,设置的越小越耗CPU。
3.2 性能对比测试
两组性能测试,一组为FT,另一组为FD,每组均做100次检测,最大人脸数统一设置为10,scale 设置分别为4,8,16三种。
第一组
第二组
对比测试结果
VIDEO 模式(100次)
scale | totalTime |
---|---|
4 | 4ms |
8 | 60ms |
16 | 1035ms |
IMAGE模式(100次)
scale | totalTime |
---|---|
4 | 95ms |
8 | 241ms |
16 | 4944ms |
清晰的可以看出scale参数的取值对CPU的影响,取值越大,耗时越久,同一取值下,IMAGE耗时比VIDEO更长,在实际的使用中,只要scale满足需要,就尽量设置小点,可以省不少资源。
先写到这里吧,不准确的地方欢迎大家提建议,下次会给大家带来其他设置参数的调优与测试比对,敬请关注。