1. 程式人生 > >OpenCV 訓練分類器生成XML檔案【完整過程】

OpenCV 訓練分類器生成XML檔案【完整過程】

在網上找了好多相關資訊,有幾篇寫的很好的:

通過這幾篇以及我之前的學習,將今天實踐的過程分享一下:

首先再次說一下整體生成的流程:

1:收集需要訓練的正、負樣本。

2:對正樣品歸一化處理,負樣本不處理,但是保證負畫素尺寸 >=正樣品畫素尺寸(或者有的人也稱作縮放處理,不過我感覺還是歸一化處理比較好聽)。

3:生成正、負樣本描述檔案。

4:樣本訓練。

詳細總結:

1:收集樣品。

剛開始僅僅是做個小實驗,所以數量暫時不用太多,我選擇的正樣品是45個,負樣品是60個,一般情況下負樣品儘量比正樣品多,畢竟當想尋找一個東西的時候,先找到其他東西的概率更大,如果負樣品比正樣品少,那麼就會造成“卡死”始終不出結果(詳細解釋

http://hi.baidu.com/spmno/item/039899fe88ea0e5dc9f337f9),要想詳細計劃一下正負樣品的數量,這個網址裡邊(http://bbs.csdn.net/topics/390388465)最下邊一段英文或許能夠幫助你,我今天沒有時間具體看了,明天再看。

今天看完了這個數量介紹,糾正我之前的錯誤,正樣品貌似經過計算比負樣品多:

vec-file has to contain >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S,where S is a count of samples from vec-file that can be recognized as background right away.


例子:

It worked for me. I also had same problem, I was following the famous tutorial on HAAR training but wanted to try the newer training utility 

with -npos 7000 -nneg 2973
so i did following calcs:


vec-file has to contain >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S

7000 >= (numPos + (20-1) * (1 - 0.999) * numPos) + 2973

(7000 - 2973)/(1 + 19*0.001) >= numPos

numPos <= 4027/1.019

numPos <= 3951 ~~ 3950

and used:

-npos 3950 -nneg 2973

It works.

2:歸一化處理。

這個是一個必要條件,當分類器在你想要檢測的圖片上尋找目標的時候,它不能所有位置、所有大小都各種亂找,那樣一張圖片的執行次數就會相當的巨大,而且如果正樣品的大小不統一,那麼彼此之間也就沒有太大的可比性和聯絡性了,所謂歸一化處理,就是讓所有圖片的畫素尺寸一樣,比如我的正樣品全部是64*64畫素的,處理方法,可以看看該大神的文章:http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html

3:正負描述檔案。

正:


跟這裡一樣,第一列表示圖片的名字,第二列表示該圖片中有多少個正樣例,一般為1,如果有很多(比如在人群中有很多人臉),那麼有多少個這個引數就寫幾,比如是K個,那麼接下來就要有4*k個數據,也就是k組資料,每組資料是這樣的:x y width height。

負:

僅僅需要圖片名字,不需要引數:

4:訓練。

首先需要建立正樣例的檔案:a.vec。

命令列:opencv_createsamples.exe -info C:/Users/rockyli/Desktop/expression/anger/info.txt -vec a.vec -num 45 -w 64 -h 64

之後,再執行個命令就哦了:

opencv_haartraining.exe  -data xml -vec a.vec -bg C:\Users\rockyli\Desktop\expression\other\other.txt  -npos 45 -nneg 60 -nstages 4  -nsplits 1 -sym -w 64 -h 64 -mode all -mem 1024

結果:



由於樣本數量以及質量很少、以及訓練使用的引數設定,檢測效果很一般:


我也是初學者,望大神看到有什麼錯誤的地方多多指教。

要是誰有什麼不解的可以隨時留言,大家一起交流才會更快的成長嘛。