如何利用OpenCV自带的级联分类器训练程序训练分类器
介紹
使用級(jí)聯(lián)分類器工作包括兩個(gè)階段:訓(xùn)練和檢測(cè)。 檢測(cè)部分在OpenCVobjdetect?模塊的文檔中有介紹,在那個(gè)文檔中給出了一些級(jí)聯(lián)分類器的基本介紹。當(dāng)前的指南描述了如何訓(xùn)練分類器:準(zhǔn)備訓(xùn)練數(shù)據(jù)和運(yùn)行訓(xùn)練程序。參考:http://jingyan.baidu.com/article/4dc40848f50689c8d946f197.html
?
利用OpenCV自帶的haar?training程序訓(xùn)練一個(gè)分類器,需要經(jīng)過(guò)以下幾個(gè)步驟:
(1)收集訓(xùn)練樣本:
? ? ? ? 訓(xùn)練樣本包括正樣本和負(fù)樣本。正樣本,通俗點(diǎn)說(shuō),就是圖片中只有你需要的目標(biāo)。而負(fù)樣本的圖片只要其中不含有目標(biāo)就可以了。但需要說(shuō)明的是,負(fù)樣本也并非隨便選取的。例如,你需要檢測(cè)的目標(biāo)是汽車,那么正樣本就應(yīng)該是僅僅含有汽車的圖片,而負(fù)樣本顯然不能是一些包含天空的,海洋的,風(fēng)景的圖片。因?yàn)槟阕罱K訓(xùn)練分類器的目的是檢測(cè)汽車,而汽車應(yīng)該出現(xiàn)在馬路上。也就是說(shuō),分類器最終檢測(cè)的圖片應(yīng)該是那些包含馬路,交通標(biāo)志,建筑物,廣告牌,汽車,摩托車,三輪車,行人,自行車等在內(nèi)的圖片。很明顯,這里的負(fù)樣本應(yīng)該是包含摩托車、三輪車、自行車、行人、路面、灌木叢、花草、交通標(biāo)志、廣告牌等。
? ? ? ? 另外,需要提醒的是,adaboost方法也是機(jī)器學(xué)習(xí)中的一個(gè)經(jīng)典算法,而機(jī)器學(xué)習(xí)算法的前提條件是,測(cè)試樣本和訓(xùn)練樣本獨(dú)立同分布。所謂的獨(dú)立同分布,可以簡(jiǎn)單理解為:訓(xùn)練樣本要和最終的應(yīng)用場(chǎng)合非常接近或者一致。否則,基于機(jī)器學(xué)習(xí)的算法并不能保證算法的有效性。此外,足夠的訓(xùn)練樣本(至少得幾千張正樣本、幾千張負(fù)樣本)也是保證訓(xùn)練算法有效性的一個(gè)前提條件。
? ? ? ? 這里,假設(shè)所有的正樣本都放在 /pos文件夾下,所有的負(fù)樣本都放在 /neg文件夾下;
(2)對(duì)所有的正樣本進(jìn)行尺寸歸一化:
上一步收集到的正樣本,有很多的尺寸大小,有的是200*300,有的是500*800...尺寸歸一化的目的,就是把所有的圖片都縮放到同一大小。比如,都縮放到50*60的大小。(程序或者光影魔術(shù)手都可以)
(3)生成正樣本描述文件:
? ? ? ? 所謂的正樣本描述文件,其實(shí)就是一個(gè)文本文件,只不過(guò),很多人喜歡將這個(gè)文件的后綴改成.dat而已。正樣本描述文件中的內(nèi)容包括:文件名?目標(biāo)個(gè)數(shù)?目標(biāo)在圖片中的位置(x,y,width,height)典型的正樣本描述文件如下所示:0.jpg?1?0?0?30?40….
? ?假如,\pos文件夾下有5000個(gè)正樣本圖片,每個(gè)圖片中僅有一個(gè)目標(biāo)。命令行下 dir /b > pos.dat生成一個(gè)pos.dat文件作為正樣本描述文件。
(4)創(chuàng)建正樣本vec文件
????由于haarTraining訓(xùn)練的時(shí)候需要輸入的正樣本是vec文件,所以需要使用createsamples程序來(lái)將正樣本轉(zhuǎn)換為vec文件。(例如:f:\pos\pos.vec)。
Createsamples程序的命令行參數(shù):
命令行參數(shù):
-vec?<vec_file_name>
訓(xùn)練好的正樣本的輸出文件名。
-img<image_file_name>
源目標(biāo)圖片(例如:一個(gè)公司圖標(biāo))
-bg<background_file_name>
背景描述文件。
-num<number_of_samples>
要產(chǎn)生的正樣本的數(shù)量,和正樣本圖片數(shù)目相同。
-bgcolor<background_color>
背景色(假定當(dāng)前圖片為灰度圖)。背景色制定了透明色。對(duì)于壓縮圖片,顏色方差量由bgthresh參數(shù)來(lái)指定。則在bgcolor-bgthresh和bgcolor+bgthresh中間的像素被認(rèn)為是透明的。
-bgthresh<background_color_threshold>
-inv
如果指定,顏色會(huì)反色
-randinv
如果指定,顏色會(huì)任意反色
-maxidev<max_intensity_deviation>
背景色最大的偏離度。
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle>
最大旋轉(zhuǎn)角度,以弧度為單位。
-show
如果指定,每個(gè)樣本會(huì)被顯示出來(lái),按下"esc"會(huì)關(guān)閉這一開(kāi)關(guān),即不顯示樣本圖片,而創(chuàng)建過(guò)程繼續(xù)。這是個(gè)有用的debug選項(xiàng)。
-w<sample_width>
輸出樣本的寬度(以像素為單位)
-h《sample_height》
輸出樣本的高度,以像素為單位。
(5)?創(chuàng)建負(fù)樣本描述文件
在保存負(fù)樣本的文件夾下生成一個(gè)負(fù)樣本描述文件,具體步驟同(3),此處不再贅敘;?
(6)進(jìn)行樣本訓(xùn)練
????該步驟通過(guò)調(diào)用OpenCV\bin目錄下的haartraining程序(新版本的opencv改名為opencv_haartraining)來(lái)完成。其中,Haartraining的命令行參數(shù)為:
-data<dir_name>
存放訓(xùn)練好的分類器的路徑名。
-vec<vec_file_name>
正樣本文件名(由trainingssamples程序或者由其他的方法創(chuàng)建的)
-bg<background_file_name>
背景描述文件。
-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples>
用來(lái)訓(xùn)練每一個(gè)分類器階段的正/負(fù)樣本。合理的值是:nPos?=?7000;nNeg?=?3000
-nstages<number_of_stages>
訓(xùn)練的級(jí)聯(lián)分類器層數(shù)。
-nsplits<number_of_splits>
決定用于階段分類器的弱分類器。如果1,則一個(gè)簡(jiǎn)單的stump?classifier被使用。如果是2或者更多,則帶有number_of_splits個(gè)內(nèi)部節(jié)點(diǎn)的CART分類器被使用。
-mem<memory_in_MB>
預(yù)先計(jì)算的以MB為單位的可用內(nèi)存。內(nèi)存越大則訓(xùn)練的速度越快。
-sym(default)
-nonsym
指定訓(xùn)練的目標(biāo)對(duì)象是否垂直對(duì)稱。垂直對(duì)稱提高目標(biāo)的訓(xùn)練速度。例如,正面部是垂直對(duì)稱的。
-minhitrate《min_hit_rate》
每個(gè)階段分類器需要的最小的命中率。總的命中率為min_hit_rate的number_of_stages次方。
-maxfalsealarm<max_false_alarm_rate>
沒(méi)有階段分類器的最大錯(cuò)誤報(bào)警率。總的錯(cuò)誤警告率為max_false_alarm_rate的number_of_stages次方。
-weighttrimming<weight_trimming>
指定是否使用權(quán)修正和使用多大的權(quán)修正。一個(gè)基本的選擇是0.9
-eqw
-mode<basic(default)|core|all>
選擇用來(lái)訓(xùn)練的haar特征集的種類。basic僅僅使用垂直特征。all使用垂直和45度角旋轉(zhuǎn)特征。
-w《sample_width》
-h《sample_height》
訓(xùn)練樣本的尺寸,(以像素為單位)。必須和訓(xùn)練樣本創(chuàng)建的尺寸相同。
一個(gè)訓(xùn)練分類器的例子:
"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
訓(xùn)練結(jié)束后,會(huì)在目錄data下生成一些子目錄,即為訓(xùn)練好的分類器。
(7)?生成xml文件
上一步在進(jìn)行haartraining的時(shí)候,會(huì)在data目錄下生成一些目錄及txt文件,我們需要調(diào)用opencv\bin\haarconv.exe將這些txt文件轉(zhuǎn)換為xml文件,也就是所謂的分類器。
????至此,分類器的訓(xùn)練工作已完成。剩下的,就是在程序中加載xml文件,并調(diào)用相應(yīng)的函數(shù)接口來(lái)實(shí)現(xiàn)分類檢測(cè)的作用了。
其實(shí)這個(gè)方法有點(diǎn)老了,新一點(diǎn)有這個(gè):http://blog.csdn.net/liulina603/article/details/8598681
轉(zhuǎn)載于:https://www.cnblogs.com/taopanpan/p/4000875.html
總結(jié)
以上是生活随笔為你收集整理的如何利用OpenCV自带的级联分类器训练程序训练分类器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hadoop集群_Eclipse开发环境
- 下一篇: 【网络流】 HDU 4183 Pahom