1. 引言
在腾讯开源的TNN深度学习推理引擎中,存在一个腾讯优图的人脸关键点检测模型,腾讯一直都是良心开源,因此准备测试下其效果和性能,并对其源码进行Debug。
2. 算法流程
- 启用blazeface人脸检测得到人脸框坐标
- 使用第一个关键点检测模型,第一次是使用人脸框坐标进行仿射变换;然后做推理得到人脸关键点,还有当前检测的Rigion框为人脸的概率;将人脸关键点信息保存到成员变量中
3.使用第二个关键点模型,直接使用第一个关键点模型检测的关键点再做一次仿射变换,使用校正后的图像再做一次人脸关键点检测。 - 最终使用第二个关键点模型的结果作为最终结果。
3. 结果展示
-
就关键点而言,其能力还是不错的,因为有涉及瞳孔检测,瞳孔定位的都还是非常准确的。
-
耗时,单人640x480在10ms左右:(OpenVine版本可以做到5~6ms)
-
CPU占用情况:
感觉占用CPU非常小,在10%以内,要比ncnn的好很多。 -
关键点数量也相对多很多,这里有275个人脸关键点。
4. 注意:
-
第一个关键点检测模型判别的人脸概率可以用于判断下一帧是否需要启动人脸检测器(人脸检测器是一个耗时操作,能不使用尽量不使用)
-
每一次检测循环,都必然会经过两个关键点模型的运作,第一个关键点检测模型检测粗糙关键点,同时判别置信程度;第二个模型使用第一个的结果进行仿射变换,再进行精校验。
-
第一个关键点输入为灰度图:1x128x128,输出为人脸阈值及关键点(234点)
第二个关键点输入为:灰度图:1x128x128,输出为人脸关键点(316点)。 -
模型非常的轻量级高效,观察了下模型结构,基本都是使用非常简单的层就有好的效果,所以说到底还是数据问题。
-
使用一个人脸检测模型+两个关键点检测模型,人脸检测使用的是blazeface模型,关键点检测为自研模型
5. 存在问题
-
Demo中仅仅提供了单人脸检测的测试Demo,如果是多人,则一种解决方案是将多人脸关键点保存为vector然后保存到关键点检测器实例中,判断的时候再依次对列表中的人脸关键分别做判断。
但是该种方案存在一个问题,那便是如何判断跟丢以及有新加入人脸的情况呢
(1) 对每个跟踪人脸都加一个flag判断是否有跟丢,但凡有一个跟丢了,则下一帧启用人脸检测
(2) 定时全局采用关键点检测 -
原始Demo中可能存在中英文编码问题,会报莫名奇妙的错误,需要留意源码中的中文及空行。
-
当人脸进行高速移动的时候,其跟踪还是会失效的:
但是相较之下,其耗时还是非常高效的。
6. 参考
关于关键点模型理解:
https://github.com/Tencent/TNN/issues/513
源码编译参考:
https://github.com/Tencent/TNN/blob/master/doc/cn/user/compile.md
遇到问题,估计是中文编码问题,按照操作解决:
https://github.com/Tencent/TNN/issues/971
官方有提供阿里网盘链接:
TNN/demo.md at master · Tencent/TNN · GitHub
阿里云盘分享
Demo编译参考:
https://github.com/Tencent/TNN/blob/master/doc/cn/user/demo.md