目標檢測(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