1. 问题描述
当存在人脸遮挡时候,人脸关键点检测存在漏检,表现在画面中就是人脸框时而闪烁。
2. 解决方案
方案1:对人脸检测设定连续帧检测逻辑,仅检测连续N帧检测到人脸,才将之回显,否则视为未检测到人脸;才进行回显,在人脸遮挡的条件下不回显人脸(优先使用)
方案2:使用更好的人脸检测模型,需要兼顾轻量以及高速,精准度;但是需要预研重新编译人脸关键点引擎,测试效果,集成至检测引擎,打包,存在较大的工作量(可作为后续工作)
3. 解决思路(方案1)
利用前N-1帧人脸检测结果判断第N帧检测的人脸是否需要回显
具体算法
- 对第N帧检测的人脸遍历第N-1帧的人脸数组
- 依据IOU(>0.5)判断历史帧中是否检测到了该人脸框
- 以同样方式对N-1帧人脸遍历N-2帧,N-2帧遍历N-3帧数组,以此类推
- 仅当当前帧人脸在前N帧都能够找到与之对应的人脸,才认为当前检测人脸正确(比如当前帧A人脸----->N-1帧A‘人脸---->N-2帧A’'人脸------>…)
- 将符合条件的当前帧人脸作为最终输出
4. 算法性能
- 耗时 < 1ms,几乎不影响整体人脸检测耗时
5. 存在问题
- 存在反应迟缓等问题(灵敏度降低),比如当N = 20时候,大概需要接近1s,人脸检测才会出来;而当N = 5时候,灵敏度提升,但是还是容易存在部分闪烁问题,因此这里的N只能取一个折中,实验测试下N = 10有相对较好效果。
- 当人脸存在部分遮挡时候,仍然会检测不到,算法不能够优化人脸检测性能(使用不回显方式代替检测到与检测不到之间的来回闪烁)。
- 只能控制连续检测不到的帧数,无法控制连续检测到的帧数
- 实际闪烁频率与检测耗时相互挂钩,比如在计算性能较差的电脑,单帧耗时可能较长(正常50ms每帧/其200ms每帧),此时连续帧参数N = 10并非为最合适的值