1. 程式人生 > >opencv3.3 級聯分類器生成xml以及遇到的一些問題

opencv3.3 級聯分類器生成xml以及遇到的一些問題

opencv3.3 訓練級聯分類器訓練成功 來分享一波

今天遇到一位群友 對於級聯分類器有點問題 於是我決定把訓練的過程分享出來,並且和大家說說訓練過程中可能會出現的問題。

建立樣本步驟:

準備訓練集

     首先 準備好訓練集 正樣本和負樣本 (我做的是車牌識別  所以選取的正樣本是車牌),

正樣本放在positive資料夾下的img資料夾裡(positive上面那個img資料夾存放的負樣本,大家不要混淆了)




正樣本的話 不需要相同大小 ,但是一定要相同比例 ,怕出問題的的就把正樣本變成相同大小吧。

我用的60*17的車牌圖片

負樣本的話,是指不包含正樣本的其他任意圖片,最好能有各種不同大小的不同場景的圖片。


我將負樣本放在img目錄下


這個負樣本是網上下的 相同大小 20*20 有點粗糙 大家不要學我 。。(最好是能有各種不同大小不同場景的!!)

樣本準備好了 接下來生成路徑

為正負樣本生成描述檔案:

 將資料夾下的圖片遍歷一遍 儲存到txt檔案裡,可以用程式碼,也可以手動的複製貼上路徑寫入txt。。

我用的java將資料夾下的圖片遍歷出來的 ,java程式碼在下面連結

資源連結



接下來展示一下存放正樣本路徑的txt的內容



正樣本用描述檔案格式描述 如下

[filename] [# of objects] [[x y width height] [... 2nd object] ...]

x y指的是圖片左上角座標 width height指的是圖片寬高

舉個例子:

img/0001.bmp 1 0 0 60 17  

1代表一個檔案 0 0 代表左上角x y座標 60 17 表示寬高 


看這個紅框程式碼 自己領悟

然後就是負樣本的txt檔案 負樣本用集合檔案格式描述

集合檔案格式(collection file format)就是如下形的描述檔案:

[filename]

我將負樣本放在bg.txt檔案下 



建立樣本 直接上圖


這就是生成樣本的exe,win+R 輸入cmd  進入該路徑


可以看到相關的一些引數 -vec 後面跟著要存放的路徑 -num指的是正樣本數量 -w是輸出樣本的寬 -h是輸出樣本的高  這就上面提到的 為什麼可以大小不相同 一定要相同比例的問題


.vec檔案生成 。


在此注意 正樣本.txt需要ANSI編碼,那位群友使用的C#遍歷資料夾圖片 使用UNICODE編碼,會出現如下內容:parse errorDone. Created 0 samples 據說-num數量不對也會出現該情況


經測試 使用utf-8編碼 會出現如下情況


.vec檔案建立後 就是訓練分類器了

訓練分類器


由該程式來實現,opencv2.x應該是叫haartarining.exe opencv3.x將haar和lbp整合成一個,就是上面紅框標註

和上面使用opencv_createsamples.exe相同 cmd 進入該目錄


使用命令 -data 是存放訓練好的分類器的路徑 -vec 就是存放.vec的路徑 -bg 負樣本描述檔案 -numPos 每一階段訓練的正樣本數量  -numNeg 每一階段訓練的負樣本數量 (網上說-numPos的引數要比實際正樣本數量小,-numNeg 的引數要比實際負樣本數量大 ,具體情況不太瞭解) -numStages 訓練階段數 (這個引數不能太大也不能太小 下面會說到) -featureType 選擇LBP還是HAAR 在此選用LBP -w -h 訓練樣本尺寸 和vec生成的尺寸大小相同 不然會宕機 -minHitRate  最小命中率 -maxFalseAlarmRate 最大虛警率  這兩個引數下面連結有說明 在此不多說

http://www.mamicode.com/info-detail-1724988.html

對了 提醒一下  如果 -featureType選擇HAAR 需要在加上 -mode ALL 


然後就是回車 等待訓練


如果卡在POS這裡 不要緊張 慢慢等待 我是等了十分鐘左右才跳出 如果很久都沒跳出 -numStages引數說明太大 改小一點 即可 當然 如果太小的話 生成的xml文件分類效果可能就不太好 

當出現如下提示  表示訓練完畢



然後就可以看到一個xml文件生成 , 底下的那個stage0.xml stage1.xml  params.xml是是每一階段訓練生成的xml,最終生成的cascade.xml 

訓練過程會有很多問題 大家多嘗試  正樣本負樣本最好 1:3 ,1:4   比如我正樣本617個 負樣本2300多個 

然後就是使用我們訓練的xml檔案了