2018.12.20 更新
-
将所有不影响追踪效果的内容全部删除了,包括比较耗时的初始化操作。
-
支持 opencv3 了。
3. 现在在我 PC 上,追踪只需要 3ms 左右。
- init 函数倍被我删了,所以 detNumToTack 这个参数也就没用,也被剔除掉了。
前言#
opencv 自带的追踪器效果很差,在 github 找了一个开源的光流法追踪,效果好很多。我在他这个基础上又删减了一些不必要的内容,同时也调整了部分参数,在不影响效果的前提下尽量提升算法速度。在我 PC (Intel®
Xeon (R) CPU E5-2673 v3 @ 2.40GHz × 48) 上跑一张 320*240 图片的时间是:16ms (MTCNN,ncnn),
30ms (初始化), 10ms (光流追踪)。
这个算法优点有:
1. 可以稳定跟踪人脸,基本不会有框抖动的情况。并且 github 中 examples 里面框一闪一闪的情况后期已经被我优化好,不会再这样了。
2. 追踪人脸的时候脱离了深度学习,速度快。
3. 无其他依赖,只用到了 ncnn 和 opencv ( required version: 2.4.x )
正文#
主要讲讲 void Impl::Detect () 函数里面一些逻辑事项吧。
1.
关于 detNumToTack 这个参数的意义,当人脸面前有东西来回遮挡或者在某种情况下一会有人脸一会没人脸的时候。如果不加 detNumToTack 这个参数,算法里面会跑一次 detection 紧跟着 initial 一次。我认为这样子有点浪费时间,所以加了 detNumToTack 这么个参数,使其 detection
detNumToTack 次后,再 initial,然后 tracking。
-
RNet 的作用是对每次 tracking 的结果做一个判断,当结果小于阈值的时候重新 detection。这么做的意义是为了防止 tracking 到别的东西。一开始没加 RNet,当有手从面前慢慢挥过去的话,框会跟着手走。
-
我将追踪的框的宽高给固定了,也是为了达到稳定的效果。跑完追踪函数 processFrame 后,框会重置为初始化时候的宽高。
-
人脸检测这块可以随意替换,RNet 这块也可以替换成 PCN-2 网络。
GitHub 地址: https://github.com/HansRen1024/Face-Tracking-Using-Optical-Flow-and-CNN