1. 程式人生 > >目標檢測(Object Detection)原理與實現(五)

目標檢測(Object Detection)原理與實現(五)

基於Cascade分類器的目標檢測

       從今天開始進入基於機器學習的目標檢測,前幾節雖然也接觸了一些機器學習的方法,但它主要是做輔助工作,機器學習的方法和非機器學習的方法結合在一起使用,說到這想起來前幾天看到一位博士師兄發的笑話,說的是百度實驗室:

      Theory is when you know everthing but nothing works.

      Practice is when everything works but no one knows why.

      In our lab,theory and practice are  combined:nothing works and no one knows why.

         目前而言,甭管理論好壞吧,只要實用就行,實用的未必是好理論,就像深度學習那樣,不說太遠了,繼續今天的話題,Cascade是Paul Viola發表在2001年的CVPR上,2002年Rainer Lienhart等人改進了Paul的方法,主要是改進了特徵並且分析了不同的boosting演算法對分類效能的影響和計算複雜度,OpenCV實現的Cascade的分類器也是Rainer的改進版本。所謂不同的boosting演算法就是說不同的Adaboost弱分類器,比如Discrete, Real 和 Gentle Adaboost弱分類器,而Cascade(級聯)分類器就是基於多個Adaboot弱分類器對不同的特徵進行依次處理(分類)來完成對目標的檢測,簡單的說有多個Adaboost串起來,然後提取每個平滑窗(sliding window)上的不同特徵,把這些特徵依次放進不同的Adaboost弱分類器裡判斷,如果所有的弱分類器都判斷正標籤(1),則表示該該平滑窗內檢測到目標,如(圖一)所示。這樣做的好處是不但通過多個弱分類器來形成一個強的級聯分類器,而且可以減少運算量,比如當一個平滑窗第一個特徵沒有通過第一個分類器,那麼就沒有必要繼續運算下去,直接拒絕掉當前平滑窗,轉而處理下一個平滑窗,事實上作者的目的就是為了快速拋棄沒有目標的平滑窗,從而達到快速檢測目標。


(圖一)

       知道了Cascade強分類器是基於Adaboost演算法的,那我們先看下Adaboost弱分類器的工作原理吧大笑,直接上圖,很簡單,如圖二所示:

(圖二)

        但OpenCV裡還不是用的這個Adaboost,而是用的Rainer等人改進的Gentle Adaboost弱分類器,Gentle Adabboost弱分類器的工作原理如(圖三)所示:

(圖三)

         Rainer等人比較了DiscreteAdaboost,Real Adaboost,Gentle Adaboost弱分類器,發現Gentle Adaboost弱分類器比其他兩種效果,但是作者沒有詳細討論為什麼比他們好,作者只是給出了實際檢測的效能比較分析圖,我也沒看出為什麼,如果你們知道為什麼,請毫不吝嗇的告知,在此先謝過了,為了嚴謹,把三種分類器的效能分析比較圖也發出來吧,如(圖四)所示:

(圖四)

         其中GAB表示Gentle Adaboost,RAB表示Real Adaboost,DAB表示Discrete Adaboost。

         好了,介紹完了分類器的工作原理,下面來看下使用的是什麼特徵。2001年Paul Viola的CVPR上用的幾個不同的特徵很簡單,就是平滑窗內某些區域畫素和的差值,比如(圖五)所示的,外圍黑色框表示平滑窗,窗內固定的位置有個黑白相間的矩形區域,黑色表示該位置上的畫素每個權重都是負一(-1),白色位置上的畫素權重為正一(1),然後權重於畫素卷積得到的值就是特徵值,就一個數字(說的白話一點,就是每個畫素值乘上權值後,然後黑白相間的矩形區域相加),不同的黑白相間的矩形區域的計算得到不同的特徵,作者還提出一個加速計算這個特徵的方法,就是積分圖,在此不說了,網上很多。

(圖五)

         同樣,OpenCV的實現也沒有使用上述特徵,而是使用了2002年Rainer 等人改進的Harr-like特徵,計算方法也類似,如圖六所示:

(圖六)

        也是矩形區域,不過不同的特徵變化的樣式多了一些,Rainer也提出了一些快速計算方法,具體閱讀參考論文吧。有了特徵,有了級聯分類器,就是訓練和檢測了。

        直接呼叫OpenCV的例子程式檢測的效果如(圖七)所示:

(圖七)

         這節比較簡單,只所以要說這個cascade分類器,是因為前一節用到了這個分類器用於檢測人臉,而且後續也會出現cascade級聯的思想,也可以給自己查漏補缺,寫作倉促,難免有錯,如發現請指出,謝謝。

      有人做過測試:Opencv的正臉檢測精度是68.84058%

                                  Total images 1104

                                   Total correct  760

                                   Total false negatives 314

                                    Total false positives 30%

                                    accurate  68.84058

                                   側臉識別精度是33.00091

                                  Total images 1103
                                  Total correct 364
                                  Total false  negatives 721
                                  Total false  positives 18
                                  % accurate 33.00091

參考文獻:

       [1]Rapid Object Detection using a Boosted Cascade of Simple Features. Paul Viola

       [2]Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object  Detection. Rainer Lienhart, Alexander Kuranov, Vadim Pisarevsky