1. 程式人生 > >opencv之級聯分類器訓練屬於自己的xml檔案

opencv之級聯分類器訓練屬於自己的xml檔案

            基礎知識這裡就不講了,最近在做車牌識別系統中的車牌定位演算法,只講講自己訓練的可以進行車牌定位的xml檔案。這裡我是用的是opencv2.4.4版的opencv_createsamples.exe和opencv_haartraining.exe,實驗發現車牌定位效果並不是特別理想,當然,這跟訓練集有關係,也跟測試集車牌影象中車牌所佔比例大小不一有關係。明天再試試別的方法吧。

        訓練屬於自己的xml檔案,需以下幾個步驟:

        1、準備資料集,分為正樣本集和負樣本集;

        2、第二是下載opencv_createsamples.exe和opencv_

haartraining.exe;

        3、生成路徑,將正樣本集的路徑要存成 *.vec格式;負樣本集的路徑不做要求,*.txt就可以;

        4、訓練xml檔案

下面拿車牌定位來舉例:

一、準備資料集

正樣本集:就是已經定位好的車牌樣本;我這裡有100張,大小歸一化為44*14,且為灰度圖,存在d:/chepai/chepai/pos資料夾下。

         

        負樣本集:所有不包含車牌照片的影象均可當做負樣本集,不可重複,個數為正樣本集的3倍左右,大小可以不歸一化;我自己是從網上下載的,從中隨機選擇了315張,存在了d:/chepai/chepai/neg資料夾下。

下載地址:點選開啟連結

     二、準備exe檔案

               此時資料夾下有以下幾個部分:

         

        三、生成路徑

        在e:/chepai/chepai/pos資料夾下編寫一個bat程式,get route.bat,程式內容如下:

dir /b > pos.txt
        雙擊執行後,會出現pos.txt檔案出現,然後將txt檔案裡面非圖片的路徑都刪掉,如下圖中的頭兩行:



再然後將get route.bat和pos.txt都剪下到上一級檔案目錄(d:/chepai/chepai)下,最後將pos.txt中的圖片路徑改成相對路徑,並且在影象後面加上:樣本圖片中目標的個數 目標所在的座標;

完成後格式如下圖:


其中,1 0 0 44 14中的1表示目標個數,後面四個數字代表left top width height;

同樣的,得到neg.txt檔案,格式如下:


完成以上這些以後,得到如下的資料夾:


下面將正樣本的路徑pos.txt用CreateSamples.exe轉成pos.vec

        在d:/chepai/chepai資料夾下新建createsamples.bat,內容如下:

CreateSamples.exe -vec pos.vec  -info pos.txt -num 100 -w 44 -h 14 pause
其中,-num後面的數字是正樣本個數,-w後面的數字是正樣本圖片的長,-h後面的數字是正樣本圖片的高;

雙擊createsamples.bat後出現pos.vec即為執行成功;

         完成以上準備步驟後,資料夾為:



        四、訓練生成xml

        在d:/chepai/chepai資料夾下新建train.dat;內容如下:

haartraining.exe -data xml -vec pos.vec -bg neg.txt -nstages 5 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 100 -nneg 315 -w 44 -h 14 -mem 1024 -mode ALL pause

其中,

        -nstages表示的是訓練分類器的級數,不能太大也不能太小,太大的話會出現下圖的情況:


程式走到POS後不再出現NEG:,就是指找不到誤檢的neg樣本,沒法跳出迴圈;將nstages設定小一點兒就可以啦~

當然,如果太小的話,得到的xml檔案分類效果可能就會不好。

        -nsplits

        -minhitrate 分類器每一級希望得到的最小檢測率;

        -maxfalsealarm 分類器每一級希望得到的最大誤檢率;

        -w -h 必不可少,否則會報錯;

執行成功後會得到一個xml資料夾和一個xml.xml檔案;如下圖:


將xml.xml修改名稱為chepai.xml,然後用python或者C++呼叫自己訓練出來的chepai.xml來進行車牌定位吧~

python呼叫xml參考程式碼:點選開啟連結

C++呼叫xml參考程式碼:點選開啟連結