OpenCV訓練分類器

2021-06-22 06:46:03 字數 3910 閱讀 7915

看到的不錯的資料,記錄下來,以備不時之需。

按ctrl+r開啟windows執行程式,輸入cmd開啟dos命令視窗,輸入 d:回車,再輸入cd d:\face\negdata進入路徑,再次輸入dir /b > negdata.dat,則會路徑下生成乙個negdata.dat檔案,開啟該檔案將最後一行的negdata.dat刪除,這樣就生成了負樣本描述檔案。

正樣本對於正樣本,通常的做法是先把所有正樣本裁切好,並對尺寸做規整(即縮放至指定大小)。

posdata/1(10).bmp 1 1 1 23 23

posdata/1(11).bmp 1 1 1 23 23

posdata/1(12).bmp 1 1 1 23 23

不過你可以把描述檔案放在你的posdata路徑(即正樣本路徑)下,這樣你就不需要加前面的相對路徑了。同樣它的生成方式可以用負樣本描述檔案的生成方法,最後用txt的替換工具將「bmp」全部替換成「bmp 1 1 1 23 23

」就可以了,如果你的樣本多,用txt替換會導致程式未響應,你可以將內容拷到word下替換,然後再拷回來。bmp後面那五個數字分別表示個數,目標的起始位置及其寬高。這樣就生成了正樣本描述檔案posdata.dat。

2) 執行createsamples程式。如果直接在vc環境下執行,可以在project\settings\debug屬性頁的program arguments欄設定執行引數。下面是乙個執行引數示例:

-info d:\face\posdata\posdata.dat -vec d:\face\pos.vec -num 50 -w 20 -h 20

表示有50個樣本,樣本寬20,高20,正樣本描述檔案為posdata.dat,結果輸出到pos.vec。

或者在dos下輸入:

"d:\program files\opencv\bin\createsamples.exe"-info "posdata\posdata.dat" -vec data\pos.vec -num 50 -w 20 -h 20

執行完了會d:\face\data下生成乙個*.vec的檔案。該檔案包含正樣本數目,寬高以及所有樣本影象資料。結果入下圖:

createsamples程式的命令列引數:

命令列引數:

-vec

訓練好的正樣本的輸出檔名。

-img

源目標(例如:乙個公司圖示)

-bg背景描述檔案。

-num

要產生的正樣本的數量,和正樣本數目相同。

-bgcolor

背景色(假定當前為灰度圖)。背景色制定了透明色。對於壓縮,顏色方差量由bgthresh引數來指定。則在bgcolor-bgthresh和bgcolor+bgthresh中間的畫素被認為是透明的。

-bgthresh

-inv

如果指定,顏色會反色

-randinv

如果指定,顏色會任意反色

-maxidev

背景色最大的偏離度。

-maxangel

-maxangle,

-maxzangle

最大旋轉角度,以弧度為單位。

-show

如果指定,每個樣本會被顯示出來,按下"esc"會關閉這一開關,即不顯示樣本,而建立過程繼續。這是個有用的debug選項。

-w輸出樣本的寬度(以畫素為單位)

-h《sample_height》

輸出樣本的高度,以畫素為單位。

到此第一步樣本訓練就完成了。恭喜你,你已經學會訓練分類器的五成功力了,我自己學這個的時候花了我一天的時間,估計你幾分鐘就學會了吧。

三、訓練分類器

樣本建立之後,接下來要訓練分類器,這個過程是由haartraining程式來實現的。該程式原始碼由opencv自帶,且可執行程式在opencv安裝目錄的bin目錄下。

haartraining的命令列引數如下:

-data

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

-vec

正樣本檔名(由trainingssamples程式或者由其他的方法建立的)

-bg背景描述檔案。

-npos,

-nneg

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

-nstages

訓練的階段數。

-nsplits

決定用於階段分類器的弱分類器。如果1,則乙個簡單的stump classifier被使用。如果是2或者更多,則帶有number_of_splits個內部節點的cart分類器被使用。

-mem

預先計算的以mb為單位的可用記憶體。記憶體越大則訓練的速度越快。

-sym(default)

-nonsym

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

-minhitrate《min_hit_rate》

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

-maxfalsealarm

沒有階段分類器的最大錯誤報警率。總的錯誤警告率為max_false_alarm_rate的number_of_stages次方。

-weighttrimming

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

-eqw

-mode

選擇用來訓練的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下生成一些子目錄,即為訓練好的分類器。

訓練結果如下:

恭喜你,你已經學會訓練分類器的九成功力了。

四:利用訓練好的分類器進行目標檢測。

這一步需要用到performance.exe,該程式原始碼由opencv自帶,且可執行程式在opencv安裝目錄的bin目錄下。

performance.exe -data data/cascade -info posdata/test.dat-w 20 -h 20 -rs 30

performance的命令列引數如下:

usage: ./performance

-data

-info

[-maxsizediff ]

[-maxposdiff ]

[-sf ]

[-ni]

[-nos ]

[-rs ]

[-w ]

[-h ]

也可以用opencv的cvhaardetectobjects函式進行檢測:

cvseq* faces = cvhaardetectobjects( img, cascade,storage,1.1, 2, cv_haar_do_canny_pruning,cvsize(40, 40) ); //3. 檢測人臉

注:opencv的某些版本可以將這些目錄中的分類器直接轉換成xml檔案。但在實際的操作中,haartraining程式卻好像永遠不會停止,而且沒 有生成xml檔案,後來在opencv的yahoo論壇上找到乙個haarconv的程式,才將分類器轉換為xml檔案,其中的原因尚待研究。

OpenCV訓練分類器

opencv訓練分類器 一 簡介 目標檢測方法最初由paul viola viola01 提出,並由rainer lienhart lienhart02 對這一方法進行了改善。該方法的基本步驟為 首先,利用樣本 大約幾百幅樣本 的 harr 特徵進行分類器訓練,得到乙個級聯的boosted分類器。分...

訓練Opencv分類器

由於在做乙個專案的需要,接觸到opencv。並使用其中的機器識別,自己會的實在不多。在使用它自帶的人臉分類器時,用自己的arm板上的攝像頭拍的,基本上識別不出。於是自己想訓練乙個分類器 用自己arm板上的攝像頭拍 給自己在專案中使用。於是找了個教室,拍了三百張 回去做分類器。開始以為做分類器會很麻煩...

OpenCV訓練分類器

一 簡介 目標檢測方法最初由paul viola viola01 提出,並由rainer lienhart lienhart02 對這一方法進行了改善。該方法的基本步驟為 首先,利用樣本 大約幾百幅樣本 的 harr 特徵進行分類器訓練,得到乙個級聯的boosted分類器。分類器中的 級聯 是指最終...