手把手教你訓練分類器

轉載自:http://zhan.renren.com/xjtuopencv?gid=3602888498033866847


訓練過程就是上面的三步

關於正負樣本的一些理解:

       正樣本即包括目標的圖片,一般較小(教程裏提到的一般是24*24 20*20 18*18<單位是像素但是在實際做的時候總有種太模糊,什麼都看不清的感覺,我覺得應該可以適當的加大圖像,提供更多細節試試,雖然這必然會導致更多的運算時間,而且在進行處理之前,應將所有正樣本進行標準化處理<統一大小,轉化爲灰度圖>

        負樣本,與正樣本相反很容易理解,即任何不包含檢測目標的圖像,對負樣本的標準化處理並不嚴格,僅有:灰度圖 <可能也能使用彩圖,在選項裏又看到bgcolor這個選項,對圖像的大小的限制是大於正樣本尺寸(必須滿足,是由於訓練器的算法決定),同時負樣本的數量一般遠多於正樣本的數量(2-3倍或以上的樣子)

         關於合適的樣本數量,教程還有opencv中推薦的都是正樣本1000+,負樣本3000+,這意味着訓練時間會很長(目測一晚上+),當然如果你只是來試試看訓練方法怎麼樣,那麼可是使用少量樣本比如100+的正樣本。

        下面進入正題:

首先我們要獲得一個正樣本的描述文件

用於描述正樣本文件名(包括絕對路徑或相對路徑),

正樣本數目以及各正樣本在圖片中的位置和大小。典型的正樣本描述文件如下:

face_100/face00001.bmp 1 0 0 20 20

face_100/face00002.bmp 1 0 0 20 20

face_100/face00003.bmp 1 0 0 20 20

其中face_100/是相對路徑,face00001.bmp是圖片名稱,1 0 0 20 20 分別表示 1張圖片,本樣本左下角座標(不一定是左下,但是肯定是距離原點最近的點)是0 0,右上角的座標(同樣的道理不一定是右上角)是20 20

 

具體方法是在Dos 下的恰當目錄敲入dir/b > samples.dat,則會生成一個samples.dat,裏面包含所有正樣本文件名列表,但沒有相對路徑名和正樣本位置信息。在samples.dat 文件各行行首增加“face _100/”的方法是使用文本編輯器替換功能,先選中所有行,然後按Tab 鍵爲每行增加一個製表位,然後將製表位全部替換爲“face _100/”即可。通過將“bmp”替換爲“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。

註釋:圖片文件的格式不侷限與bmp jpg png都行,其他格式的沒試過,估計opencv支持的都可以

運行 CreateSamples.exe 程序。下面是一個運行參數示例:

-info F:\FaceDetect\samples.dat -vec F:\FaceDetect\samples.vec -num 200 -w 20 -h 20

表示有200 個樣本,樣本寬20,高20,正樣本描述文件爲samples.dat,結果輸出到samples.vec。

運行完了會生成一個*.vec 的文件。

 

         對於負樣本的描述文件其處理方法與正樣本基本相同,但是一個負樣本的描述文件應該是做到這樣的程度:

face_100/face00001.bmp

face_100/face00002.bmp

face_100/face00003.bmp

即只有圖片的路徑,名稱,而沒有圖片數量大小的描述,而且其也不是vec文件,而是dir /b>時所指定的文件

 

非常重要的一點,所有的樣本描述的條目中,路徑和文件名內部不允許出現空格,原因自己想

 

樣本創建之後,接下來要訓練分類器,這個過程是由haartraining 程序來實現的。該程序源

碼由OpenCV 自帶,且可執行程序在OpenCV 安裝目錄的bin 目錄下。

Haartraining 的命令行參數如下:

-data<dir_name>

存放訓練好的分類器的路徑名。

-vec<vec_file_name>

正樣本文件名(由trainingssamples 程序或者由其他的方法創建的)

-bg<background_file_name>

背景描述文件。

-npos<number_of_positive_samples>,

-nneg<number_of_negative_samples>

用來訓練每一個分類器階段的正/負樣本。合理的值是:nPos = 7000;nNeg = 3000

-nstages<number_of_stages>

訓練的階段數。

-nsplits<number_of_splits>

決定用於階段分類器的弱分類器。如果1,則一個簡單的stump classifier 被使用。如果是2

或者更多,則帶有number_of_splits 個內部節點的CART 分類器被使用。

-mem<memory_in_MB>

預先計算的以MB 爲單位的可用內存。內存越大則訓練的速度越快。

-sym(default)

-nonsym

指定訓練的目標對象是否垂直對稱。垂直對稱提高目標的訓練速度。例如,正面部是垂直對

稱的。

-minhitrate《min_hit_rate》

每個階段分類器需要的最小的命中率。總的命中率爲min_hit_rate 的number_of_stages 次

方。

-maxfalsealarm<max_false_alarm_rate>

沒有階段分類器的最大錯誤報警率。總的錯誤警告率爲max_false_alarm_rate 的

number_of_stages 次方。

-weighttrimming<weight_trimming>

指定是否使用權修正和使用多大的權修正。一個基本的選擇是0.9

-eqw

-mode<basic(default)|core|all>

選擇用來訓練的haar 特徵集的種類。basic 僅僅使用垂直特徵。all 使用垂直和45 度角旋轉

特徵。

-w《sample_width》

-h《sample_height》

訓練樣本的尺寸,(以像素爲單位)。必須和訓練樣本創建的尺寸相同。

一個訓練分類器的例子:

"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec

-bg negdata\negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20

訓練結束後,會在目錄data 下生成一些子目錄,即爲訓練好的分類器。

值得提醒的是xml文件在於data目錄同級的目錄下<如果訓練成功的話>

我在試着訓練時使用的參數

注意 -nsplits 這個選項應該儘量設置成2(到底有沒有更高的值,我也不知道,應該有吧),這樣會獲得起碼比較細緻的訓練過程,如果選的話,我不知道你們會怎麼樣,反正我是隻得到了一個6k大小的xml文件,幾乎不能用

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