機器學習-分類器-級聯分類器訓練(Train CascadeClassifier )


一、簡介:

  adaboost分類器由級聯分類器構成,"級聯"是指最終的分類器是由幾個簡單分類器級聯組成。在圖像檢測中,被檢窗口依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。

分類器訓練完以后,就可以應用於輸入圖像中的感興趣區域的檢測。檢測到目標區域輸出為1,否則輸出為0。為了檢測整副圖像,在圖像中移動搜索窗口,檢測每一個位置來確定可能的目標。為了搜索不同大小的目標物體,在圖像中檢測未知大小的目標物體,掃描過程中用不同比例大小的搜索窗口對圖片進行掃描。

目標檢測分為三個步驟:

    1、 樣本的創建
    2、 訓練分類器
    3、 利用訓練好的分類器進行目標檢測。

二、樣本收集

  訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意圖片,所有的樣本圖片都被歸一化為同樣的尺寸大小(例如,24x24)。負樣本可以來自於任意的圖片,但這些圖片不能包含目標特征。負樣本由背景描述文件來描述。

 

三、准備訓練數據

  訓練需要一些列樣本。樣本分兩類:負樣本和正樣本。負樣本是指不包括物體的圖像。正樣本是待檢測的物體的圖像。負樣本必須手工准備,正樣本使用opencv_createsamples 創建。

  1、負樣本

    負樣本可以是任意圖像,但圖像中不能包含待檢測的物體。用於摳取負樣本的圖像文件名被列在一個文件中。這個文件是純文本文件,每行是一個文件名(包括相對目錄和文件名)。負樣本和樣本圖像也叫做背景樣本,或者背景樣本圖像,本文檔中對之不予區分。這些圖像可以是不同的尺寸,但是圖像尺寸應該比訓練窗口的尺寸大,因為這些圖像將被用於摳取負樣本,並將負樣本縮小到訓練窗口大小。

下面是一個描述文件的例子:

假如目錄結構如下:

/img
  img1.jpg
  img2.jpg
bg.txt

則bg.txt文件中的內容將如下所示:

img/img1.jpg
img/img2.jpg

 

  2、正樣本

    正樣本由 opencv_createsamples 生成。正樣本可以由包含待檢測物體的一張圖片生成,也可由一系列標記好的圖像生成。

    請注意你需要一個很大的負樣本庫送給訓練程序進行訓練。如果是絕對剛性的物體,如OpenCV的標志,你只有一張正樣本圖像;如果是人臉,你需要幾百甚至幾千個正樣本。在待檢測物體是人臉的情況下,你需要考慮所有的人種、年齡、表情甚至胡子的樣式。

    如果只有一張包含物體的圖像,如一個公司的標志,那么可以通過對物體圖像的隨機旋轉、改變標志亮度以及將標志放在任意的背景上而獲得大量的正樣本。生成的正樣本數目以及隨機的程度都可以通過opencv_createsamples 的命令行參數控制。

    

命令行參數:

  • -vec<vec_file_name>

    輸出文件,內含用於訓練的正樣本。

  • -img<image_file_name>

    輸入圖像文件名(例如一個公司的標志)。

  • -bg<background_file_name>

    背景圖像的描述文件,文件中包含一系列的圖像文件名,這些圖像將被隨機選作物體的背景。

  • -num<number_of_samples>

    生成的正樣本的數目。

  • -bgcolor<background_color>

    背景顏色(目前為灰度圖);背景顏色表示透明顏色。因為圖像壓縮可造成顏色偏差,顏色的容差可以由 -bgthresh 指定。所有處於 bgcolor-bgthresh 和bgcolor+bgthresh 之間的像素都被設置為透明像素。

  • -bgthresh<background_color_threshold>

  • -inv

    如果指定該標志,前景圖像的顏色將翻轉。

  • -randinv

    如果指定該標志,顏色將隨機地翻轉。

  • -maxidev<max_intensity_deviation>

    前景樣本里像素的亮度梯度的最大值。

  • -maxxangle<max_x_rotation_angle>

    X軸最大旋轉角度,必須以弧度為單位。

  • -maxyangle<max_y_rotation_angle>

    Y軸最大旋轉角度,必須以弧度為單位。

  • -maxzangle<max_z_rotation_angle>

    Z軸最大旋轉角度,必須以弧度為單位。

  • -show

    很有用的調試選項。如果指定該選項,每個樣本都將被顯示。如果按下Esc 鍵,程序將繼續創建樣本但不再顯示。

  • -w<sample_width>

    輸出樣本的寬度(以像素為單位)。

  • -h<sample_height>

    輸出樣本的高度(以像素為單位)。

    創建樣本的流程如下: 輸入圖像沿着三個軸隨機旋轉。旋轉的角度由 -max?angle 限定。然后像素的亮度值位於 [bg_color-bg_color_threshold;bg_color+bg_color_threshold]范圍的像素被設置為透明像素。將白噪聲加到前景圖像上。如果指定了-inv ,那么前景圖像的顏色將被翻轉。如果指定了-randinv ,程序將隨機選擇是否將顏色進行翻轉。任選背景圖像,將獲得的前景圖像放到背景圖像上,並將圖像調整到-w 和-h 指定的大小。最后將圖像存入vec文件,vec文件名由命令行參數-vec 指定。

正樣本也可從一系列事先標記好的圖像中創建。標記信息可以存儲於一個文本文件,與背景描述文件類似。文件中的每行對應一個圖像文件。每行的第一個元素為圖像文件名,后面是物體的數目,最后是物體位置和大小的描述 (x, y, width, height)。

下面是描述文件的例子:

假設目錄結構如下:

/img
  img_with_faces_1.jpg
  img_with_faces_2.jpg
info.dat

文件info.dat里的內容如下:

img/img_with_faces_1.jpg  1  140 100 45 45
img/img_with_faces_2.jpg  2  100 200 50 50   50 30 25 25

    圖像img_with_faces_1.jpg中包含一個物體實例(如人臉),標示其在圖像中的位置和大小的矩形為(140, 100, 45, 45)。圖像img_with_faces_2.jpg包含兩個物體實例。

從這樣的一系列數據中創建正樣本,需要在命令行指定 -info 而非前面所用的 -img 參數:

  • -info<collection_file_name>

    描述物體所在圖像以及大小位置的描述文件。

此部分樣本創建過程如下:將物體實例從圖像中摳取出,然后將之調整尺寸到目標尺寸,然后保存到輸出的vec文件。在此過程中不會對圖像進行變形,所以有效的命令行參數僅有-w,-h,-show 和-num 。

opencv_createsamples 也可以用來查看和檢查保存於vec正樣本文件中的正樣本。這時只需指定-vec ,-w 和 -h 三個參數則可。opencv_createsamples 將逐一顯示正樣本圖像。

在訓練中,訓練程序並不關心包含正樣本的vec文件如何生成的,你可以自己寫程序來生成vec文件。但是OpenCV提供的工具中,只有 opencv_createsamples 程序能夠創建包含正樣本的vec文件。

一個vec文件的例子位於 opencv/data/vec_files/trainingfaces_24-24.vec 。它可用來訓練人臉分類器,窗口大小為:-w24-h24 。

 

三、訓練級聯分類器

  

下一步是訓練分類器。如前面所述, opencv_traincascade 和opencv_haartraining 都可用來訓練一個級聯分類器,但是此處只介紹opencv_traincascade 。opencv_haartraining 的用法與opencv_traincascade 類似。

下面是 opencv_traincascade 的命令行參數,以用途分組介紹:

  1. 通用參數:

    • -data<cascade_dir_name>

      目錄名,如不存在訓練程序會創建它,用於存放訓練好的分類器。

    • -vec<vec_file_name>

      包含正樣本的vec文件名(由 opencv_createsamples 程序生成)。

    • -bg<background_file_name>

      背景描述文件,也就是包含負樣本文件名的那個描述文件。

    • -numPos<number_of_positive_samples>

      每級分類器訓練時所用的正樣本數目。

    • -numNeg<number_of_negative_samples>

      每級分類器訓練時所用的負樣本數目,可以大於 -bg 指定的圖片數目。

    • -numStages<number_of_stages>

      訓練的分類器的級數。

    • -precalcValBufSize<precalculated_vals_buffer_size_in_Mb>

      緩存大小,用於存儲預先計算的特征值(feature values),單位為MB。

    • -precalcIdxBufSize<precalculated_idxs_buffer_size_in_Mb>

      緩存大小,用於存儲預先計算的特征索引(feature indices),單位為MB。內存越大,訓練時間越短。

    • -baseFormatSave

      這個參數僅在使用Haar特征時有效。如果指定這個參數,那么級聯分類器將以老的格式存儲。

  2. 級聯參數:

    • -stageType<BOOST(default)>

      級別(stage)參數。目前只支持將BOOST分類器作為級別的類型。

    • -featureType<{HAAR(default),LBP}>

      特征的類型: HAAR - 類Haar特征;LBP - 局部紋理模式特征。

    • -w<sampleWidth>

    • -h<sampleHeight>

      訓練樣本的尺寸(單位為像素)。必須跟訓練樣本創建(使用opencv_createsamples 程序創建)時的尺寸保持一致。

  3. Boosted分類器參數:

    • -bt<{DAB,RAB,LB,GAB(default)}>

      Boosted分類器的類型: DAB - Discrete AdaBoost,RAB - Real AdaBoost,LB - LogitBoost, GAB - Gentle AdaBoost。

    • -minHitRate<min_hit_rate>

      分類器的每一級希望得到的最小檢測率。總的檢測率大約為 min_hit_rate^number_of_stages。

    • -maxFalseAlarmRate<max_false_alarm_rate>

      分類器的每一級希望得到的最大誤檢率。總的誤檢率大約為 max_false_alarm_rate^number_of_stages.

    • -weightTrimRate<weight_trim_rate>

      Specifies whether trimming should be used and its weight. 一個還不錯的數值是0.95。

    • -maxDepth<max_depth_of_weak_tree>

      弱分類器樹最大的深度。一個還不錯的數值是1,是二叉樹(stumps)。

    • -maxWeakCount<max_weak_tree_count>

      每一級中的弱分類器的最大數目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given-maxFalseAlarmRate.

  4. 類Haar特征參數:

    • -mode<BASIC(default)|CORE|ALL>

      選擇訓練過程中使用的Haar特征的類型。 BASIC 只使用右上特征,ALL 使用所有右上特征和45度旋轉特征。更多細節請參考[Rainer2002] 。

  5. LBP特征參數:

    LBP特征無參數。

當 opencv_traincascade 程序訓練結束以后,訓練好的級聯分類器將存儲於文件cascade.xml中,這個文件位於-data 指定的目錄中。這個目錄中的其他文件是訓練的中間結果,當訓練程序被中斷后,再重新運行訓練程序將讀入之前的訓練結果,而不需從頭重新訓練。訓練結束后,你可以刪除這些中間文件。

訓練結束后就可以測試訓練好的級聯分類器了.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM