2018.12.20 更新
-
將所有不影響追踪效果的內容全部刪除了,包括比較耗時的初始化操作。
-
支援 opencv3 了。
-
現在在我 PC 上,追踪只需要 3ms 左右。
-
init 函數被我刪了,所以 detNumToTack 這個參數也就沒用,也被剔除掉了。
前言#
opencv 自帶的追踪器效果很差,在 github 找了一個開源的光流法追踪,效果好很多。我在他這個基礎上又刪減了一些不必要的內容,同時也調整了部分參數,在不影響效果的前提下盡量提升演算法速度。在我 PC (Intel®
Xeon (R) CPU E5-2673 v3 @ 2.40GHz × 48) 上跑一張 320*240 圖片的時間是:16ms (MTCNN,ncnn),
30ms (初始化), 10ms (光流追踪)。
這個演算法優點有:
-
可以穩定追踪人臉,基本不會有框抖動的情況。並且 github 中 examples 裡面框一閃一閃的情況後期已經被我優化好,不會再這樣了。
-
追踪人臉的時候脫離了深度學習,速度快。
-
無其他依賴,只用到了 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