【Face Detection】基于改进版OpenTLD和RNet的人脸追踪算法

2018.12.20 更新

1. 将所有不影响追踪效果的内容全部删除了,包括比较耗时的初始化操作。

2. 支持opencv3了。

3.现在在我PC上,追踪只需要3ms左右。

4. init函数倍被我删了,所以detNumToTack这个参数也就没用,也被剔除掉了。

前言

opencv自带的追踪器效果很差,在github找了一个开源的,效果好很多。我在他这个基础上又删减了一些不必要的内容,同时也调整了部分参数,在不影响效果的前提下尽量提升算法速度。在我PC(Intel® Xeon(R) CPU E5-2673 v3 @ 2.40GHz × 48)上跑一张320*240图片的时间是:16ms(MTCNN,ncnn), 30ms(TLD initial), 10ms(TLD tracking)。

这个算法优点有:

1.可以稳定跟踪人脸,基本不会有框抖动的情况。并且github中examples里面框一闪一闪的情况后期已经被我优化好,不会再这样了。

2.追踪人脸的时候脱离了深度学习,速度快。

3.无其他依赖,只用到了ncnn和opencv (required version: 2.4.x)

正文

OpenTLD没啥可说的,我优化掉的内容可以自己对比看。主要讲讲void Impl::Detect()函数里面一些逻辑事项吧。

1. 关于detNumToTack这个参数的意义,当人脸面前有东西来回遮挡或者在某种情况下一会有人脸一会没人脸的时候。如果不加detNumToTack这个参数,算法里面会跑一次detection紧跟着tld initial一次。我认为这样子有点浪费时间,所以加了detNumToTack这么个参数,使其detection detNumToTack次后,再tld initial,然后tracking。

2. RNet的作用是对每次tracking 的结果做一个判断,当结果小于阈值的时候重新detection。这么做的意义是为了防止tracking到别的东西。一开始没加RNet,当有手从面前慢慢挥过去的话,框会跟着手走。

3. 我将追踪的框的宽高给固定了,也是为了达到稳定的效果。跑完追踪函数tld.processFrame后,框会重置为初始化时候的宽高。

4. 人脸检测这块可以随意替换,RNet这块也可以替换成PCN-2网络。

 

GitHub地址:https://github.com/HandsomeHans/Face-Tracking-Based-on-OpenTLD-and-RNet

你可能感兴趣的:(Face,Detection)