Haar+adaboost物體檢測算法知識點歸納總結

             基於此方法研究車牌識別系統相關應用,以下主要總結其中的關鍵點和難點,需要對haar特徵和adaboost原理有一定了解,供剛開始學習和使用此法的童鞋參考,肯定不夠全面,亦或存在不夠準確的地方,諸位可指出,交流補充。   

          一、訓練

         1、訓練模型是很重要的一環,訓練haar+adaboost模型其實就是挑選特徵,再組合特徵的過程。

         2、訓練樣本準備:正樣本,負樣本,更新樣本。正樣本和負樣本的大小比例應接近於你需要訓練的模型的大小比例。比如就車牌而言,你要訓練寬高比爲60:15的模型,那正負樣本圖像最好都接近這一比例,越接近越好。因爲在訓練過程中都會把樣本縮放到60:15這一尺度進行計算特徵值。當然,監督學習中,這裏正樣本就是車牌圖像,負樣本則是不包含車牌的圖像,爲了適應不同環境下的車牌檢測,則正樣本分佈需要多樣性,比如正常光線的,反光的,模糊的,暗的都有(當然這樣一般會提高誤檢率,看實際需求調整),而負樣本同樣需要不同背景。正樣本整理比較嚴格,對車牌不同的截取方式,可能導致最後模型效果差異大。比如截取的車牌樣本是有車牌框的還是沒有,是緊貼字符還是較寬鬆,如圖1所示。

     

圖 1

         當然正樣本的整理是根據應用需要進行的,不同的應用肯定有差異。還有一個更新樣本,這個在網絡上比較少介紹,後面會詳細說明。更新樣本和負樣本類似但不相同,更新樣本不需要在大小比例上接近模型尺寸,但儘量用大圖,且圖像需要複雜多樣不包含車牌。

        此外,還有一個經常會聽到的詞:難例。或者說困難樣本。參考這裏,簡單來說就是你訓練完一個模型了,拿一個測試集來測試,則可能會檢測到不是目標的區域,那這些區域保存下來就是困難樣本,收集這些後組成一個負樣本集,再次進行訓練,這樣不斷加強模型的性能。

        3、訓練前預挑選特徵。使用5種常見的haar特徵,在30*30的尺度上,特徵就有394725個,具體計算看這裏,所以考慮實時,可以先預挑選一些特徵出來,再對這些特徵進行再次挑選。不管是預挑選還是後面訓練弱分類器,實質都是在挑選強區分能力靠前的那些特徵。那如何預挑選特徵?依據是什麼?前面也說了,依據當然是看特徵的區分能力,問題轉變爲如何判斷特徵的區分能力。看這篇

    假設進行人臉檢測,現在有正樣本2706,負樣本4381個,在使用的haar特徵中,隨機抽取了兩個特徵A和B,這兩個特徵遍歷了2,706 個人臉樣本和4,381 個非人臉樣本,計算了每張圖像對應的特徵值,即每個特徵對應有7087個特徵值,將特徵值進行了從小到大的排序,並按照這個新的順序表繪製了分佈圖如下所示:

           人臉和非人臉特徵值分佈曲線其實就是正樣本和負樣本基於A特徵的特徵值的樣本分佈曲線。

          特徵A人臉和非人臉樣本的分佈曲線雖然在過零點位置上差異大(因爲正負樣本數量不一樣),但是過零點位置的左右區間的曲線走勢是接近的,所以A對人臉和非人臉的區分能力一般。

  

圖 2

        下面看B特徵的情況, 特徵B人臉和非人臉樣本的分佈曲線過零點位置的左右區間的曲線走勢是有明顯差異的,所以相比於特徵A,特徵B對人臉和非人臉的區分能力更強。

 

非人臉圖像特徵值分佈

圖 3

 

            這裏分別從正負樣本特徵值的分佈情況來看特徵的分辨能力,其實也可以把7087個特徵值排序後的分佈曲線畫出來,通過統計其他量來作爲分辨能力依據。所以這裏是一個研究點。

        4、每個特徵其實就是一個弱分類器,通常說訓練弱分類器,其實就是挑選最優弱分類器,最優弱分類器的分類誤差是最小的。現在需要得到T個最優弱分,即需迭代T次訓練,每次得到一個。T個最優弱分加權求和得到一個強分類器,n個強分類器又級聯成一個更強的級聯分類器。比如一個級聯分類器,我們設置爲20層,每一層即爲一個強分類器,那麼每一個強分類器中的弱分,就是上面說的迭代訓練生成,其中迭代過程中每次訓練都會對樣本的權值進行重新計算,那樣,樣本數量雖然沒變,但是每個樣本的權值變了,可以看成樣本分佈變了,所以每次訓練纔會有不同的最優弱分出現。權值的修改機制就是弱分訓練的核心。

        5、再次說到更新樣本。更新樣本機制是級聯分類器中層與層之間的機制。一般開始訓練前我們設置一些訓練參數,例如強分類器(每個stage,每一層)的識別率99%,錯分率爲50%。訓練過程中,當分類器達到識別率這個指標時(不一定是訓練結束的唯一目標),則訓練結束。錯分率爲50%,即可能有50%的負樣本被判斷爲是目標,另50%的負樣本被正確判斷爲是非目標,根據adaboost的機制,被正確判斷的負樣本進行丟棄,也就是現在負樣本剩下一半,那就要補充負樣本了。例如:現在訓練完第1 stage,在進入第2 stage前要更新負樣本,假設原來負樣本100個,現在只剩下30個(負樣本的篩選機制也有不同情況,有的機制是一定以50%進行篩選),則要補充一定數量負樣本(不一定是70個)進去,才能滿足開始時設定的正負樣本比例。這時更新樣本登場了。前面訓練完成的一個強分類器對更新樣本集進行檢測,判斷爲目標的則保存爲負樣本,補充進去,直到數量達到要求(就是當前正樣本和負樣本比例和初始設定的一樣,或者丟棄多少補多少)。爲什麼正樣本不用補充?因爲識別率設置爲99%,即很少的正樣本被丟棄。正樣本數量不用補充,但是其權值會更新,同樣改變了樣本分佈。所以更新樣本集的數量必須要足夠多。可以看這裏,也進行了討論,博主說不是補充樣本而是更新,個人認爲應該是一樣的,說法 不一樣,還有博主沒提到更新樣本,個人認爲只是訓練時樣本補充機制設置不一樣而已。

        6、從訓練情況看,訓練樣本非常重要。一般需要多次嘗試,不斷添加困難樣本,才能訓練出比較好的模型。

 

       二、檢測

        1、在模型正常訓練完成的情況下,影響檢測效果的因素有很多,其中有幾個常見的:尺度變化步長,檢測窗口滑動步長和檢測的機制。

        2、滑動步長和尺度變換步長比較好理解,可以通過簡單調整知道哪種步長對檢測效果最好。一般是步長越小,檢測率越好,但是要考慮到誤檢和時間問題。所以找一個平衡點。

        3、檢測機制。一般有兩種,一是被檢測對象大小不變,改變檢測窗口尺度。二是檢測窗口尺度不變,通過改變圖像大小。這裏用第一種(考慮效率問題)。一般是訓練的檢測模型的尺度爲起始尺度 ,逐漸放大。尺度範圍需能覆蓋被檢測目標的尺寸範圍。還有一種情況,在訓練時,模型的尺度設定是小點好還是大點好,比如訓練車牌檢測模型,是60:15好,還是120:30好?如果模型尺度是120:30,那麼在檢測時,必然要從120:30這個尺度向兩邊進行尺度變化,因爲有的車牌寬度不到120,那麼這時的模型對於小於120的車牌,檢測效果不一定好。因爲在訓練時用120:30的模型,這個模型中計算出的特徵和用模型60:15時計算的特徵是不一樣的,即以大尺度模型進行訓練時,小於模型尺度的有區分能力的的特徵不一定被挑選出來。

        4、假設訓練的模型爲60:15, 檢測窗口最小尺度(m1)爲60:15,最大尺度(m2)爲240 :60,則從m1開始到m2進行檢測和從m2開始到m1進行檢測,效果是一樣的。

 

    暫時到這裏,後續如果有心得會繼續補充。

 

reference
 1、http://blog.csdn.net/watkinsong/article/details/7631241.

 2、http://blog.csdn.net/zhaocj/article/details/54015501#comments.

 3、http://blog.csdn.net/masibuaa/article/details/16113373?utm_source=tuicool&utm_medium=referral.

 4、http://blog.csdn.net/zouxy09/article/details/7922923

 

 

發佈了34 篇原創文章 · 獲贊 64 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章