一、簡介:
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 的命令行參數,以用途分組介紹:
-
通用參數:
-
-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特征時有效。如果指定這個參數,那么級聯分類器將以老的格式存儲。
-
-
級聯參數:
-
-stageType<BOOST(default)>
級別(stage)參數。目前只支持將BOOST分類器作為級別的類型。
-
-featureType<{HAAR(default),LBP}>
特征的類型: HAAR - 類Haar特征;LBP - 局部紋理模式特征。
-
-w<sampleWidth>
-
-h<sampleHeight>
訓練樣本的尺寸(單位為像素)。必須跟訓練樣本創建(使用opencv_createsamples 程序創建)時的尺寸保持一致。
-
-
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.
-
-
類Haar特征參數:
-
-mode<BASIC(default)|CORE|ALL>
選擇訓練過程中使用的Haar特征的類型。 BASIC 只使用右上特征,ALL 使用所有右上特征和45度旋轉特征。更多細節請參考[Rainer2002] 。
-
-
LBP特征參數:
LBP特征無參數。
當 opencv_traincascade 程序訓練結束以后,訓練好的級聯分類器將存儲於文件cascade.xml中,這個文件位於-data 指定的目錄中。這個目錄中的其他文件是訓練的中間結果,當訓練程序被中斷后,再重新運行訓練程序將讀入之前的訓練結果,而不需從頭重新訓練。訓練結束后,你可以刪除這些中間文件。
訓練結束后就可以測試訓練好的級聯分類器了.