機器學習中級聯分類器的使用(基於OpenCV)

最近項目上需要用到機器學習,特利用OpenCV自帶的可執行程序對圖像樣本進行分類處理。

利用OpenCV中opencv_createsample.exe和opencv_traincascade.exe對圖像進行分類的主要步驟可分爲以下幾個部分:

1.準備正樣本和負樣本

我準備的正樣本爲30*30的bmp圖(8位),特別注意的是正樣本大小要一致!

並將其放到pos文件夾下,利用windows自帶的批處理程序,生成pos.dat文件(pos路徑下),pos文件格式如下:

同樣地,將負樣本放在新建的neg文件夾下,並生成neg.dat文件(.dat格式可以更改的)

2.生成vec描述文件

將pos文件夾下的所有樣本生成.vec文件,該部分可以在pos和neg文件夾的同級目錄下新建createsamples.bat文件(批處理文件),文件中內容如下:

opencv_createsamples.exe -vec pos\pos.vec -info pos\pos.dat -num 130 -w 30 -h 30

其中pos.vec文件放在pos文件夾中,-num爲正樣本的數目,-w 寬度 -h 高度

可以在後面添加pause,以便批處理後暫停查看處理信息,具體如下:

生成後的效果圖如下:

若上述報錯,一定要仔細查找出錯原因,否則後續無法正常進行!

3.生成分類器

首先要在pos文件夾和neg文件夾同級目錄下新建data文件夾(以便存儲生成的分類器文件),同時新建calssify.bat批處理文件,其內容如下:

特別注意上述的路徑!後續生成過程出現問題,很大一部分原因是路徑出現問題!其參數說明如下:

-------------------------------------------

-data data 分類生成的文件放置的位置(在剛纔新建的data文件夾裏)

-vec pos\pos.vec 加載vec文件(pos.vec文件在pos文件夾裏)

-bg neg\neg.dat 加載負樣本文件

-numPos 130 正樣本的數量

-numNeg 50 負樣本的數量(neg文件夾下有50張負樣本)

-numStages 15 樣本訓練的層數(層數多,耗時長,建議15~20)

-w 30 -h  30 樣本大小

-minHitRate 0.9999 最小命中率(訓練目標的準確度)

-maxFalseAlarmRate 0.5 最大誤檢率(每一層的訓練值小於該值,即可進行下一層的訓練)

-mode ALL 特徵檢測的方式(ALL表示haar全方位檢測)

此外還有:

-mem 可用於設置電腦使用內存

-numStages 訓練分類器的級數,強分類器的個數

-precalcValBufSize 緩存大小,用於存儲預先計算的特徵值,單位MB

-precalcldxBufSize 緩存大小,用於存儲預先計算的特徵索引,單位MB

-featureType  特徵檢測類型(默認Haar特徵,還有LBP和HOG特徵)

-------------------------------------------

訓練後效果圖如下:

中間省略。。。

訓練的stage較多,一部分原因是參數設置,另外一部分原因是樣本大小。

-----------------------------------------------------------------

生成完畢後,可在data文件夾下看到生成的.xml文件(分類器數據),後續進行樣本預測可用cascade.xml文件。

整個處理過程,速度還是很快的(我的數據很少),期間容易出錯的地方包括:

1.各文件的路徑(相對路徑關係);

2.pos.dat文件中數據的排列格式(當然後綴不一定要取.dat,也可以.txt)

3.樣本過大,比如全是60*60的,且參數設置嚴格,訓練非常耗時,可能需要十幾個小時!,樣本最好爲20*20(我的爲30*30);

-----------------------------------------------------------------

注意事項:

1.正負樣本數量搭配最好滿足 1:(2.5~3.0);

2.負樣本的尺寸最好比正樣本尺寸大很多,例如正樣本爲20*20,負樣本爲1024*960;

3.負樣本之間需要有較大的差異性;

4.numPos最好要小於.vec文件中正樣本的數量,一般取0.9倍的正樣本數量;

5.正樣本中樣本圖案像素數量要大於背景圖像像素數量(即正樣本要集中體現樣本圖案!);

6.-numNeg 中負樣本的數量可以超過實際負樣本的數量(通常這樣的效果較好!);

7.訓練的速度 LBP>HOG>HARR(HARR的速度非常慢!);

-----------------------------------------------------------------

-----------------------------------------------------------------

下面展示利用級聯分類器進行特定目標檢測的效果。

1.正樣本總數774個,大小爲30*30;

2.負樣本總數2690個,大小爲120*120;

3.訓練採用的配置參數如下:特徵模式爲LBP;特徵集爲CORE;級聯層數20級;每一級正樣本數600個;每一級負樣本數5000個;最小檢出率爲0.9999;最大虛警率0.5。

4.訓練耗時半小時左右(i7處理器、8G內存);

5.訓練完成後,將.xml加載到檢測中,檢測函數對象.detectMultiScale中scaleFactor爲1.1,minNeighors爲1,flags爲4,minSize和maxSize分別爲21*21、30*30。參數具體含義可以參考opencv官方文檔。

6.被檢測對象如下:

7.不同對象被檢測的效果如下:

以上述檢測結果可看出,其檢測的效果並沒有想象中的那麼好!有的特徵沒有檢測出來,更有誤檢存在!(上中、下左、下右三幅圖全檢OK,其餘三幅存在問題!)。

在工業檢測中,上述的精度很難滿足實際的應用要求!直觀判斷,出現問題主要是因爲樣本的選取,其次是訓練參數的設置。

後續將進一步理解級聯分類器,致力於提高其檢測精度!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章