一、簡介
目標檢測方法最初由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...