Haar 特徵訓練步驟詳
一、準備樣本階段
事先準備好正樣本和負樣本。這裡只是先用於做Haar特徵訓練步驟的熟悉用,所以用opencv寫了個程式,主要是做圖片的變形處理。如旋轉和亮度調節等。當然最後檢測的效果指定很不好,這裡先作為步驟熟悉來用的。
我們首先取出一幅圖片(以交通標誌為例),可在網上下載,然後通過程式,在對這幅圖片進行亮度調節和旋轉後,得到700多張圖片(圖片格式設定為bmp或jpg)。我們取出其中的245幅圖片作為本次的訓練正樣本。然後通過這個程式,有設定批量生成負樣本的功能,總共從一張大圖片中隨機摳出700張負樣本圖片。這裡,由於是事先用程式寫好的,所以,正樣本和負樣本的大小均為50*50。
程式如下圖所示:
這是正負樣本的程式截圖,最後得到如下的結果:
說明一下,根據網上查到的資料,這裡最好用灰度圖進行操作,所以最後生成的都是8位深度的灰度圖。大小統一為50*50。
二、正負樣本樣本描述檔案的制定
因為這裡我們正樣本是用程式自寫的,所以不用直接在文件裡改大小,而沒有進行標定,實際上,我們需要用objectmaker進行標定,具體使用可自行上網查。
這裡用到的是opencv自帶的一個程式,叫做opencv_createsamples.exe,具體在opencv下的bin裡。
把上面的pos和neg資料夾裡的正負樣本,還有opencv裡opencv_createsamples.exe放到一個資料夾裡,為了不出現cmd控制檯裡的檔名過長而讀不出來的情況,儘可能精簡檔案路徑,如:
這樣,直接在F盤下工作就好。
其中,pos資料夾裡放置的是剛才生成的正樣本圖片,neg資料夾裡放置的是剛才生成的負樣本檔案。
之後,就是進行樣本描述檔案的生成了。
PS:如果不能執行這兩個exe,就把opencv裡bin的dll全拷到這裡,和exe位於同一級即可。
樣本描述檔案的生成,需要用到cmd命令提示符,首先,開啟命令提示符。
按照如下圖所示進入到該資料夾裡(具體可百度,很簡單,是cd命令)。
這裡的樣本描述檔案,正樣本需要的是一個.vec的檔案,負樣本需要的是一個.dat的檔案。.vec檔案可以通過.dat檔案通過後面的操作來進行,這裡先放一下。
我們先對這正負樣本生成.dat檔案的操作。
首先,對正樣本進行。
先通過命令提示符,進入到pos資料夾。然後輸入dir /b > sample_pos.dat,就可以生成一個.dat的檔案。這個dir /b > sample_pos.dat命令的作用是把當前資料夾下所有圖片名稱寫入到.dat裡(當然txt也是可以的,這裡直接生成.dat)。這個.dat的名稱我們先設為sample_pos,當然,設為其他的名稱也可以,不過,一旦設定,就不要改了,後面都會需要到這個名稱的。
然後,同樣的,對負樣本進行同樣的處理。最後在neg檔案件裡生成sample_neg.dat。
這時得到的.dat檔案還不能用,因為是沒有處理過的,我們還要對其進行處理。這裡用到一個叫做editplus的工具。主要是對txt檔案裡的樣本進行替換工作。
我們首先把剛才生成的正樣本的.dat檔案進行修改,點選.dat,右鍵用editplus開啟,下把下方的用紅框框住的地方刪掉。
然後,把jpg改為jpg 1 0 0 50 50,全部更改,就進行了一個標定。
這裡一定要注意!負樣本也是把最下面兩行刪掉,但是,不要把jpg改為jpg 1 00 50 50,
一旦修改,就會出現Invalid background description file!錯誤。這裡一定注意。
這樣就好了,對正負樣本的.dat就處理完成。
然後,是對正樣本的.dat轉化為.vec進行處理。
開啟剛才的命令提示符。
輸入opencv_createsamples.exe -info ./pos/sample_pos.dat -vec ./pos/sample_pos.vec -num 245 -w 20 -h 20
如下圖所示:
其中,各個變數的含義為:
引數說明:-info,指樣本說明檔案
-vec,樣本描述檔案的名字及路徑
-num,總共幾個樣本,要注意,這裡的樣本數是指標定後的20x20的樣本數,而不是大圖的數目,其實就是樣本說明檔案第2列的所有數字累加 和。
-w -h 指明想讓樣本縮放到什麼尺寸。這裡的奧妙在於你不必另外去處理第1步中被矩形框出的圖片的尺寸,因為這個引數幫你統一縮放!
-show 是否顯示每個樣本。樣本少可以設為YES,要是樣本多的話不要顯式地設定,因為關視窗會關到你哭。原本這裡說的是設成NO,不過,建議不要設定,這樣就不會彈出了。
看到Done,就是已經對其處理好了,最後是得到.vec的檔案。
負樣本不用這樣處理,直接用.dat檔案就好。
以上,就是樣本描述檔案的生成過程。
三、進行訓練分類器
用到的是opencv_haartraining.exe,該程式封裝了haar特徵提取以及adaboost分類器訓練過程。也在opencv 的bin下面,就是上面的第一個截圖,把這個exe放到和pos 的同一級目錄就好。然後,新建一個資料夾,名字叫cascade,也是和pos位於目錄的同一級。
Cmd,cd到當前目錄,然後輸入
opencv_haartraining.exe -data ./cascade -vec ./pos/sample_pos.vec -bg ./neg/sample_neg.dat -npos 245 -nneg 700 -mem 200 -mode ALL -w 20 -h 20
如圖:
其中各個引數含義:
-data 指定生成的檔案目錄, -vec vec檔名, -bg 負樣本描述檔名稱,也就是負樣本的說明檔案(.dat) -nstage 20 指定訓練層數,推薦15~20,層數越高,耗時越長。-nsplits 分裂子節點數目,選取預設值 2
-minhitrate 最小命中率,即訓練目標準確度。-maxfalsealarm最大虛警(誤檢率),每一層訓練到這個值小於0.5時訓練結束,進入下一層訓練,-npos 在每個階段用來訓練的正樣本數目,-nneg在每個階段用來訓練的負樣本數目 這個值可以設定大於真正的負樣本影象數目,程式可以自動從負樣本影象中切割出和正樣本大小一致的,這個引數一半設定為正樣本數目的1~3倍 -w -h樣本尺寸,與前面對應 -mem 程式可使用的記憶體,這個設定為256即可,實際執行時根本就不怎麼耗記憶體,以MB為單位 -mode ALL指定haar特徵的種類,BASIC僅僅使用垂直特徵,ALL表示使用垂直以及45度旋轉特徵-sym或者-nonsym,後面不用跟其他引數,用於指定目標物件是否垂直對稱,若你的物件是垂直對稱的,比如臉,則垂直對稱有利於提高訓練速度
四、合併分類器生成.xml檔案
蠻簡單的,直接在cmd裡,輸入convert_cascade.exe --size="20x20"..\cascade haar_adaboost.xml 就可以了。
最後,出現cascade performance 就是成功了!
以上,就是haar訓練特徵的描述,希望對大家有幫助。
PS:不用.dat,直接用.txt也可以的