1. 程式人生 > >【Face Detection】基於改進版OpenTLD和RNet的人臉追蹤演算法

【Face Detection】基於改進版OpenTLD和RNet的人臉追蹤演算法

前言

opencv自帶的追蹤器效果很差,在github找了一個開源的,效果好很多。我在他這個基礎上又刪減了一些不必要的內容,同時也調整了部分引數,在不影響效果的前提下儘量提升演算法速度。在我PC(Intel® Xeon(R) CPU E5-2673 v3 @ 2.40GHz × 48)上執行時間是:30ms(MTCNN,ncnn), 30ms(TLD initial), 10ms(TLD tracking)。

這個演算法優點有:

1.可以穩定跟蹤人臉,基本不會有框抖動的情況。並且github中examples裡面框一閃一閃的情況後期已經被我優化好,不會再這樣了。

2.追蹤人臉的時候脫離了深度學習,速度快。

3.無其他依賴,只用到了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網路,速度會比RNet快一點。

 

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