1. 程式人生 > >adaboost訓練 之 引數詳解

adaboost訓練 之 引數詳解

記錄下我在研究過程理解的,生成正樣本程式CreateSamples.exe以及訓練程式opencv_haartraining.exe的所有引數的具體意義與用處。

CreateSamples.exe引數詳解

這個可執行程式主要用來生成用於訓練的正樣本,位於\opencv\build\common目錄下,老版本名字為:createsamples.exe
該程式的主函式中有四個分支:

if( imagename && vecname )
{
cvCreateTrainingSamples( 
vecname, 
imagename, 
bgcolor,    
bgthreshold, 
bgfilename,
num, 
invert, 
maxintensitydev,
maxxangle, 
maxyangle, 
maxzangle,
showsamples, 
width, 
height )
;

通過傳入的單張圖片的扭曲變形來建立多個正樣本,如果有單張傳入的影象路徑以及正樣本vec路徑,則走到這個分支:

vecname:要生成用於訓練的vec檔案的路徑,內容為xxx/xxx/xxx/xxx.vec,例如通過 -vec xxx/xxx/xxx/xxx.vec 傳入

imagename:通過一張圖片的扭曲形變成多張圖片的單張樣本圖片的路徑。例如通過 -img xxx/xxx/xxx/xxx.jpg傳入

bgcolor:這是建立樣本時樣本扭曲函式中用來決定畫素是否有效的畫素值,作為背景過濾的基本值將畫素值在(bgcolor-bgthreshold)與(bgcolor+bgthreshold)之外的畫素保留來生成正樣本,因為操作的是灰度圖,所以這個值0範圍是~255。例如通過:-bgcolor 128傳入

bgthreshold:決定背景掩碼的實際取值範圍,例如通過:-bgthreshold 32傳入。

bgfilename:記錄所有負樣本的目錄檔案,xxx/xxx/xxx/neg.txt,例如通過:-bg xxx/xxx/xxx/neg.txt傳入

num:要建立的樣本的數量,例如通過:-num 800傳入

invert:通過單張圖片生成樣本時,是否需要反相或隨機反相。例如通過:-inv 或 -randinv,前者invert變數取得值為1,後者invert變數取得值為0x7FFFFFFF。

maxintensitydev:用於生成前景(有效畫素區域)灰度值的常數值,實際樣本的前景灰度值會根據這個引數結合隨機數產生多種不同的灰度值。例如通過: -maxidev 220傳入

maxxangle:對樣本圖片的x軸方向的扭曲的最大弧度,X軸即是圖片水平方向的旋轉。以弧度為單位,預設1.1

maxyangle:對樣本圖片的y軸方向的扭曲的最大弧度,Y軸即是圖片豎直方向的旋轉。以弧度為單位,預設1.1

maxzangle:對樣本圖片的z軸方向的扭曲的最大弧度,Z軸即是垂直於影象平面的方向的旋轉(可理解為旋轉軸是一條穿過顯示器的垂線)。以弧度為單位,預設0.5。

showsamples:樣本建立期間,是否通過imshow顯示出每一個生成的樣本圖片出來。通過:-show來表示顯示,沒有則不顯示

width:要建立的樣本圖片的寬度,後面的訓練樣本步驟要使用和這時一樣的值,不然會報錯,例如通過:-w 20來指定生成的正樣本的寬度為20pix

height:要建立的樣本圖片的高度,後面的訓練樣本步驟要使用和這時一樣的值,不然會報錯,例如通過: -h 20來指定生成的正樣本的寬度為20pix

}//第一個分支
else if( imagename && bgfilename && infoname )
{
cvCreateTestSamples( 
infoname, 
imagename, 
bgcolor, 
bgthreshold, 
bgfilename, 
num, 
invert, 
maxintensitydev,
maxxangle, 
maxyangle, 
maxzangle, 
showsamples, 
width, 
height );

通過傳入的單張圖片扭曲變形來建立多個測試樣本,如果傳入了單張樣本圖片路徑,負樣本圖片路徑清單,以及正樣本路徑清單,則走到這個分支:

infoname:在這個分支這個是生成的測試樣本的路徑清單。

bgfilename:背景圖片路徑描述清單,利用這裡提供的背景圖片作為背景建立測試影象。例如通過:-bg xxx/xxx/neg.txt來傳入

其他引數都差不多意思,這裡不在贅述

}//第二個分支
else if( infoname && vecname )
{
total = cvCreateTrainingSamplesFromInfo( 
infoname, 
vecname,
num,
showsamples,
width,
height );

如果沒有指定單張圖片路徑,表示.通過描述檔案的圖片列表清單中建立訓練樣本,建立的訓練正樣本儲存在vecname 指定的.vec檔案中:

infoname:正樣本的列表清單檔案。例如通過:-info xxx/xxx/xxx/pos.info來傳入。

其他的與前面分支類似,不贅述

}//第三個分支
else if( vecname )
{
cvShowVecSamples( vecname, width, height, scale );

如果只有指定了正樣本的vecname檔案,則顯示VEC檔案中的樣本圖片:

scale:指定顯示是否縮放圖片大小及縮放的大小 。

}//第四個分支

opencv_haartraining.exe引數詳解

這個程式呼叫的是以下這個函式來訓練分類器

cvCreateTreeCascadeClassifier( 
dirname, 
vecname, 
bgname,
npos, 
nneg, 
nstages, 
mem,
nsplits,
minhitrate, 
maxfalsealarm, 
weightfraction,
mode, 
symmetric,
equalweights, 
width, 
height,
boosttype, 
stumperror,
maxtreesplits, 
minpos, 
bg_vecfile );

這個可執行程式用來訓練分類器,位於呼叫\opencv\build\common目錄下,老版本的名字為haartraining.exe:

dirname:通過-data傳入的目錄名,用來存放訓練好的分類器,如果不存在訓練程式自行建立。

vecname:通過-vec傳入的正樣本.vec檔案,由opencv_createsamples生成的統一尺寸的正樣本集。

bgname: 通過-bg傳入的負樣本圖片目錄清單,

npos:通過-npos傳入的每級分類器所需的正樣本數目 。

nneg:通過-nneg傳入的每組分類器所需的負樣本數目,可以大於bgname檔案清單中列出的負樣本數目。

nstages:通過-nstages傳入,想要訓練的分類器的級數,每級是一個強分類器,每個強分類器又有若干弱分類器。

mem:通過-mem傳入的預先計算的以MB為單位的可用記憶體。記憶體越大則訓練的速度越快。

nsplits:通過-nsplits傳入的每個弱分類器特徵個數(一般為1) 。

minhitrate:通過-minhitrate傳入,該引數決定分類器的每一級強分類器最小檢測率, 預設0.995。具體實現就是針對每一個正樣本累加這級強分類器的所有弱分類器的置信度,然後對所有正樣本得到的累加置信度按從小到大排序,因為minhitrate決定至少要分對minhitrate*npos個正樣本,所以取第(1.0-minhitrate)*npos正樣本的置信度為這級強分類器的閾值,通過這個閾值將大於這個閾值的分為正類,否則分為負類。所以minhitrate這個值決定每級分類器的正樣本的正檢率,總的正檢率為minhitrate^nstages。

maxfalsealarm:通過-maxfalsealarm傳入,決定了分類器的每一級強分類器的分負樣本分錯的最大比例,它決定了該強分類器的弱分類器的個數。預設0.5。它具體的實現是,前面通過minhitrate引數與弱分類器的置信度累加和,得到了該強分類器的閾值後,通過這個閾值來分類負樣本,負樣本的分錯個數不能超過numneg*maxfalsealarm,如果超過則繼續訓練本級強分類器,增加新弱分類器直到的閾值將負樣本分錯個數小於numneg*maxfalsealarm為止就跳出迴圈,那本級強分類器訓練成功。

weightfraction:通過-weighttrimming傳入,在每級強分類器的訓練中每訓練一個弱分類器前將所有樣本中,包括正樣本與負樣本,按權重從小到大排列將權重最低的weightfraction*(npos+nneg)的樣本去除掉,因為權重很小說明這個樣本總能被正確分類了,刪除這些已經能正確分類的樣本,讓訓練更多集中於還不能正確分類的樣本上,提高訓練效率。預設為0.95。

mode:通過-mode傳入,它指出了訓練時用哪些模板haar特徵,有三個列舉值,mode==0表示Viola提出的原始矩形特徵,mode==1表示所有垂直的haar特徵,mode==2表示所有特徵。預設為0。

symmetric:通過-sym或-nonsym傳入,它指出了正樣本是否垂直對稱。

equalweights:通過-eqw傳入,如果有-ewq則equalweights值為1.否則預設為0。1表示所有樣本的初始化權重相等,0表示不等。

width:通過-w傳入,指出正樣本的寬
height:通過-h傳入,指出正樣本的高

boosttype:通過-bt傳入,分為四類值{ “DAB”, “RAB”, “LB”, “GAB” } :0 - Discrete AdaBoost ,1 - Real AdaBoost ,2 - LogitBoost ,3 - Gentle AdaBoost 分別代表4個應用的boost演算法的種類,預設為Gab

stumperror:通過-err傳入,它指出了四種在訓練弱分類器時的計算閾值方法:1.misclass 2.gini 3.entropy 4.least sum of squares。

maxtreesplits: 通過-maxtreesplits傳入,表示樹節點數的最大值。一般為0。

minpos:能過-minpos傳入,訓練過程中,節點可使用的正樣本數目。正樣本根據節點被分類,通常來說,minpos不小於npos / nsplits

bg_vecfile:通過-bg-vecfile傳入,如果有引數-bg-vecfile傳入表示其值為true,則表示負樣本與正樣本類似是.vec檔案的形式傳入,否則負樣本是以圖片路徑清單形式傳入,它決定了讀取負樣本的形式。