OpenCV訓練分類器

2021-04-24 20:19:37 字數 4101 閱讀 1454

一、簡介

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

分類器中的"級聯"是指最終的分類器是由幾個簡單分類器級聯組成。在影象檢測中,被檢視窗依次通過每一級分類器, 這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。

分類器訓練完以後,就可以應用於輸入影象中的感興趣區域(與訓練樣本相同的尺寸)的檢測。檢測到目標區域(汽車或人臉)分類器輸出為1,否則輸出為0。為 了檢測整副影象,可以在影象中移動搜尋視窗,檢測每乙個位置來確定可能的目標。 為了搜尋不同大小的目標物體,分類器被設計為可以進行尺寸改變,這樣比改變待檢影象的尺寸大小更為有效。所以,為了在影象中檢測未知大小的目標物體,掃瞄 程式通常需要用不同比例大小的搜尋視窗對進行幾次掃瞄。

目前支援這種分類器的boosting技術有四種: discrete adaboost, real adaboost, gentle adaboost and logitboost。

"boosted" 即指級聯分類器的每一層都可以從中選取乙個boosting演算法(權重投票),並利用基礎分類器的自我訓練得到。

根據上面的分析,目標檢測分為三個步驟:

1、 樣本的建立

2、 訓練分類器

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

二、樣本建立

訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本(例如人臉或汽車等),反例樣本指其它任意,所有的樣本都被歸一化為同樣的尺寸大小(例如,20x20)。

負樣本負樣本可以來自於任意的,但這些不能包含目標特徵。負樣本由背景描述檔案來描述。背景描述檔案是乙個文字檔案,每一行包含了乙個負樣本的檔名(基於描述檔案的相對路徑)。該檔案必須手工建立。

e.g: 負樣本描述檔案的乙個例子:

假定目錄結構如下:

則背景描述檔案bg.txt的內容為:

正樣本正樣本由程式craatesample程式來建立。該程式的源**由opencv給出,並且在bin目錄下包含了這個可執行的程式。

正樣本可以由單個的目標或者一系列的事先標記好的來建立。

createsamples程式的命令列引數:

命令列引數:

-vec

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

-bg背景描述檔案。

-num

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

-bgcolor

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

-bgthresh

-inv

如果指定,顏色會反色

-randinv

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

-maxidev

背景色最大的偏離度。

-maxangel

-maxangle,

-maxzangle

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

-show

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

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

-h《sample_height》

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

注:正樣本也可以從乙個預先標記好的影象集合中獲取。這個集合由乙個文字檔案來描述,類似於背景描述檔案。每乙個文字行對應乙個。每行的第乙個元素是檔名,第二個元素是物件實體的個數。後面緊跟著的是與之匹配的矩形框(x, y, 寬度,高度)。

下面是乙個建立樣本的例子:

positive

img1.bmp ……

img5.bmp

negative

bg1.bmp

bg2.bmp

info.dat

bg.txt

正樣本描述檔案info.dat的內容如下:

positive/imag1.bmp 1 0 0 24 28 ……

positive/imag5.bmp 1 0 0 24 28

img1.bmp包含了單個目標物件實體,矩形為(0,0,24,28)。

-info

標記特徵的集合的描述檔案。

背景(負樣本)描述檔案的內容如下:

nagative/bg1.bmp

nagative/bg2.bmp

我們用乙個批處理檔案run.bat來進行正樣本的建立:該檔案的內容如下:

cd    e:"face"bin

createsamples     -vec e:"face"a.vec

-info e:"face"info.dat

-bg e:"face"bg.txt

-num 5

-show

-w 24

-h 28

其中e:"face"bin目錄包含了createsamples可執行程式,生成的正樣本檔案a.vec在e:"face目錄下。

三、訓練分類器

樣本建立之後,接下來要訓練分類器,這個過程是由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》

訓練樣本的尺寸,(以畫素為單位)。必須和訓練樣本建立的尺寸相同。

乙個訓練分類器的例子:

同上例,分類器訓練的過程用乙個批處理檔案run2.bat來完成:

cd e:"face"bin

haartraining -data e:"face"data

-vec e:"face"a.vec

-bg e:"face"bg.txt

-npos 5

-nneg 2

-w 24

-h 28

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

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

OpenCV訓練分類器

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

訓練Opencv分類器

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

OpenCV訓練分類器

看到的不錯的資料,記錄下來,以備不時之需。按ctrl r開啟windows執行程式,輸入cmd開啟dos命令視窗,輸入 d 回車,再輸入cd d face negdata進入路徑,再次輸入dir b negdata.dat,則會路徑下生成乙個negdata.dat檔案,開啟該檔案將最後一行的negd...