如何用OpenCV訓練自己的分類器_第1頁
如何用OpenCV訓練自己的分類器_第2頁
如何用OpenCV訓練自己的分類器_第3頁
如何用OpenCV訓練自己的分類器_第4頁
如何用OpenCV訓練自己的分類器_第5頁
免費預覽已結束,剩余11頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、如何用OpenC蜴I練自己的分類器2009-09-0422:15最近要做一個性別識別的項目,在人臉檢測與五官定位上我采用OPENC的haartraining進行定位,這里介紹下這兩天我學習的如何用opencv訓練自己的分類器。在這兩天的學習里,我遇到了不少問題,不過我遇到了幾個好心的大俠幫我解決了不少問題,特別是無忌,在這里我再次感謝他的幫助。一、簡介目標檢測方法最初由PaulViolaViola01提出,并由RainerLienhartLienhart02對這一方法進行了改善。該方法的基本步驟為:首先,利用樣本(大約幾百幅樣本圖片)的harr特征進行分類器訓練,得到一個級聯(lián)的boosted分

2、類器。分類器中的“級聯(lián)”是指最終的分類器是由幾個簡單分類器級聯(lián)組成。在圖像檢測中,被檢窗口依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區(qū)域就被排除了,全部通過每一級分類器檢測的區(qū)域即為目標區(qū)域。分類器訓練完以后,就可以應用于輸入圖像中的感興趣區(qū)域的檢測。檢測到目標區(qū)域分類器輸出為1,否則輸出為00為了檢測整副圖像,可以在圖像中移動搜索窗口,檢測每一個位置來確定可能的目標。為了搜索不同大小的目標物體,分類器被設計為可以進行尺寸改變,這樣比改變待檢圖像的尺寸大小更為有效。所以,為了在圖像中檢測未知大小的目標物體,掃描程序通常需要用不同比例大小的搜索窗口對圖片進行幾次掃描。目前支持這種分

3、類器的boosting技術有四種:DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost。"boosted"即指級聯(lián)分類器的每一層都可以從中選取一個boosting算法(權重投票),并利用基礎分類器的自我訓練得到。根據上面的分析,目標檢測分為三個步驟:1、樣本的創(chuàng)建2、訓練分類器3、利用訓練好的分類器進行目標檢測。二、樣本創(chuàng)建訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意圖片。負樣本負樣本可以來自于任意的圖片,但這些圖片不能包含目標特征。負樣本由背景描述文件來描述。背景描述文件是一

4、個文本文件,每一行包含了一個負樣本圖片的文件名(基于描述文件的相對路徑)。該文件創(chuàng)建方法如下:采用Dos命令生成樣本描述文件。具體方法是在Dos下的進入你的圖片目錄,比如我的圖片放在D:faceposdata下,則:按Ctrl+R打開Windows運行程序,輸入cmd打開DO階令窗口,輸入d:回車,再輸入cdD:facenegdata進入圖片路徑,再次輸入dir/b>negdata.dat,則會圖片路徑下生成一個negdata.dat文件,打開該文件將最后一行的negdata.dat刪除,這樣就生成了負樣本描述文件。dos命令窗口結果如下圖:正樣本對于正樣本,通常的做法是先把所有正樣本裁

5、切好,并對尺寸做規(guī)整(即縮放至指定大?。?,如下圖所示:由于HaarTraining訓練時輸入的正樣本是vec文件,所以需要使用OpenCVl帶的CreateSamples程序(在你所按照的opencvbin下,如果沒有需要編譯opencvappsHaarTrainingmake下的.dsw文件,注意要編譯release版的)將準備好的正樣本轉換為vec文件。轉換的步驟如下:1)制作一個正樣本描述文件,用于描述正樣本文件名(包括絕對路徑或相對路徑),正樣本數(shù)目以及各正樣本在圖片中的位置和大小。典型的正樣本描述文件如下:posdata/1(10).bmp1112323posdata/1(11).b

6、mp1112323posdata/1(12).bmp1112323不過你可以把描述文件放在你的posdata路徑(即正樣本路徑)下,這樣你就不需要加前面的相對路徑了。同樣它的生成方式可以用負樣本描述文件的生成方法,最后用txt的替換工具將“bmp1全部替換成“bmp1112323”就可以了,如果你的樣本圖片多,用txt替換會導致程序未響應,你可以將內容拷到word下替換,然后再拷回來。bmp后面那五個數(shù)字分別表示圖片個數(shù),目標的起始位置及其寬高。這樣就生成了正樣本描述文件posdata.dat。2)運行CreateSamples程序。如果直接在VC環(huán)境下運行,可以在ProjectSetting

7、sDebug屬性頁的Programarguments欄設置運行參數(shù)。下面是一個運行參數(shù)示例:-infoD:faceposdataposdata.dat-vecD:facepos.vec-num50-w20-h20表示有50個樣本,樣本寬20,高20,正樣本描述文件為posdata.dat,結果輸出至Upos.veco或者在dos下輸入:"D:ProgramFilesOpenCVbincreatesamples.exe"-info"posdataposdata.dat"-vecdatapos.vec-num50-w20-h20運行完了會d:facedata

8、下生成一個*vec的文件。該文件包含正樣本數(shù)目,寬高以及所有樣本圖像數(shù)據。結果入下圖:D:FaceFilesNOpenCUbincBeatesanples.exe-infouposdataposdata.dat-uec:datapos_uec-num49-u20-h20InfoFilename:posddtaposdatd.datImsfileHane:<NULL>UecFilename:datapos.uecBGfilename:<NULL>Nun:49BGcolor:0BGthreshoId:8。Invert:FALSEMaxintensitydeuion:40Ma

9、xxan9le:1.1Haxyangrlet1-1Max2angle:g.5Showsamples:FALSEIf/idth:20Height=20Createtrainingsanplesfroninaescollection.»Dune-Created49samplesCreatesamples程序的命令行參數(shù):命令行參數(shù):vec<vec_file_name>訓練好的正作本的輸出文件名。img<image_file_name>源目標圖片麗如:一個公司圖標)bg<background_file_name>背景描述文件。一一num<numbe

10、r_of_samples>要產生的正樣本而窺量,和正樣本圖片數(shù)目相同。一bgcolor<background_color>背景色(假定當前圖片反灰度圖)。背景色制定了透明色。對于壓縮圖片,顏色方差量由bgthresh參數(shù)來指定。貝在bgcolorbgthresh和bgcolor+bgthresh中間的像素被認為是透明的。一bgthresh<background_color_threshold>inv如果指定,顏色會反色一randinv如果指定,顏色會任意反色一maxidev<max_intensity_deviation>背景色最大的偏向度。一一max

11、angel<max_x_rotation_angle>一maxangle<max_y_rotation_angle>,一maxzangle<max_x_rotation_angle>最大旋轉角度,以尤應為單位一show如果指定,每個樣本會被顯示出來,按下"esc"會關閉這一開關,即不顯示樣本圖片,而創(chuàng)建過程繼續(xù)。這是個有用的debug選項。w<sample_width>輸出樣本的麻受(以像素為單位)h«sample_height»輸出樣本的高蚤,以像素為單位。到此第一步樣本訓練就完成了。恭喜你,你已經學會訓

12、練分類器的五成功力了,我自己學這個的時候花了我一天的時間,估計你幾分鐘就學會了吧。三、訓練分類器樣本創(chuàng)建之后,接下來要訓練分類器,這個過程是由haartraining程序來實現(xiàn)的。該程序源碼由OpenCVl帶,且可執(zhí)行程序在OpenCV裝目錄的bin目錄下。Haartraining的命令行參數(shù)如下:data<dir_name>存放訓練心而分類器的路徑名。vec<vec_file_name>正樣本文件名(由trainingssamples程序或者由其他的方法創(chuàng)建的)bg<background_file_name>背景描述文件。一一npos<number_

13、of_positive_samples>,nneg<number_of_negative_samples>用來訓練每一個分類器階段的正/負樣本。合理的值是:nPos=7000;nNeg=3000一nstages<number_of_stages>訓練的階段數(shù)。一一一nsplits<number_of_splits>決定用于階段分類器的弱分類器。如果1,則一個簡單的stumpclassifier被使用。如果是2或者更多,則帶有number_of_splits個內部節(jié)點的CAR吩類器被使用。mem<memory_in_MB>預先計算的以MB為M

14、位的可用內存。內存越大則訓練的速度越快。sym(default)一nonsym指定訓練的目標對象是否垂直對稱。垂直對稱提高目標的訓練速度。例如,正面部是垂直對稱的。minhitrate«min_hit_rate»每個階段分類器需要向最小的命中率??偟拿新蕿閙in_hit_rate的number_of_stages次方。一maxfalsealarm<max_false_alarm_rate>沒有階段分類器的最大褥誤才誦率。頻的錯誤警告率為max_false_alarm_rate的number_of_stages次方。weighttrimming<weigh

15、t_trimming>指定是否使用權修正和使多大的權修正。一個基本的選擇是0.9一eqwmode<basic(default)|core|all>選擇用來訓練的haar特征集的種類。basic僅僅使用垂直特征。all使用垂直和45度角旋轉特征。一w«sample_width»h«sample_height»訓練樣本的尺:,(以像素為單位)。必須和訓練樣本創(chuàng)建的尺寸相同。一個訓練分類器的例子:"D:ProgramFilesOpenCVbinhaartraining.exe"-datadatacascade-vecdat

16、apos.vec-bgnegdatanegdata.dat-npos49-nneg49-mem200-modeALL-w20-h20訓練結束后,會在目錄data下生成一些子目錄,即為訓練好的分類器。訓練結果如下:恭喜你,你已經學會訓練分類器的九成功力了。四:利用訓練好的分類器進行目標檢測。這一步需要用到performance.exe,該程序源碼由OpenCW帶,且可執(zhí)行程序在OpenCV裝目錄的bin目錄下。performance.exe-datadata/cascade-infoposdata/test.dat-w20-h20-rs30performance的命令行參數(shù)如下:Usage:./

17、performance-data<classifier_directory_name>-info<collection_file_name>-maxSizeDiff<max_size_difference=1.500000>-maxPosDiff<max_position_difference=0.300000>-sf<scale_factor=1.200000>-ni一-nos<number_of_stages=-1>-rs<roc_size=40>-w<sample_width=24>-h<

18、;sample_height=24>也可以用opencv的cvHaarDetectObjects函數(shù)進行檢測: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文件,其中的原因尚待研究。

19、我的問題:有了opencv自帶的那些xml人臉檢測文檔,我們就可以用cvLoad()這個函數(shù)加載他們,讓他們對我們的人臉進行檢測,但是,現(xiàn)在生活中的計算機視覺并不遠遠是檢測人臉,還有很多物品需要識別,所以,能不能自己做個xml的檢測文檔,用它來檢測自己需要的東西呢?例如,檢測一個可樂瓶!問題解決:首先了解下,目標檢測分為三個步驟:1、樣本的創(chuàng)建2、訓練分類器3、利用訓練好的分類器進行目標檢測。一,樣本的創(chuàng)建:訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本(例如可樂瓶,人臉等),反例樣本指其它任意圖片,所有的樣本圖片都被歸一化為同樣的尺寸大?。ɡ?,20x20)。1負樣本(反例樣本

20、)可以來自于任意的圖片,但這些圖片不能包含目標特征。負樣本由背景描述文件來描述。背景描述文件是一個文本文件,每一行包含了一個負樣本圖片的文件名(基于描述文件的相對路徑)。該文件必須手工創(chuàng)建。例如,假定目錄下有bg1.bmpbg2.bmp這2個負樣本的圖片,這2個圖片放在img目錄下,所以其背景描述文件bg.txt的內容為_img/bg1.bmp1002428_ing/bg2.bmp1002428_img/bg3.bmp1002428_ing/bg4.bmp1002428_img/bg5.bmp1002428_ing/bg6.bmp1002428_img/bg7.bmp1002428_ing/b

21、g8.bmp1002428_img/bg9.bmp1002428_ing/bg10.bmp1002428這樣負樣本建立完畢,先保存!等會用!2,正樣本現(xiàn)在,我們來看正樣本的創(chuàng)建步驟:正樣本由程序createsample程序來創(chuàng)建。該程序的源代碼由OpenCV給出,并且在bin目錄下包含了這個可執(zhí)行的程序。例如你opencv安裝目錄為c:既C:OpenCVbin,你找找就有正樣本可以由單個的目標圖片或者一系列的事先標記好的圖片來創(chuàng)建!2-2在用createsamples.exe這個程序前,先來了解下這個程序的一些命令組合模式Createsamples程序的命令行參數(shù):命令行參數(shù):vec<v

22、ec_file_name>訓練好的正樣本的輸出文件名。img<image_file_name>源目標圖片(例如:一個公司圖標)bg<background_file_name>背景描述文件。num<number_of_samples>要產生的正樣本的數(shù)量,和正樣本圖片數(shù)目相同。一bgcolor<background_color>背景色(假定當前圖片為灰度圖)。背景色制定了透明色。對于壓縮圖片,顏色方差量由bgthresh參數(shù)來指定。則在bgcolorbgthresh和bgcolor+bgthresh中間的像素被認為是透明的。一bgthresh

23、<background_color_threshold>一inv如果指定,顏色會反色一randinv如果指定,顏色會任意反色一maxidev<max_intensity_deviation>背景色最大的偏離度。一maxangel<max_x_rotation_angle>一maxangle<max_y_rotation_angle>,一maxzangle<max_x_rotation_angle>最大旋轉角度,以弧度為單位。show如果指定,每個樣本會被顯示出來,按下"esc”會關閉這一開關,即不顯示樣本圖片,而創(chuàng)建過程繼續(xù)

24、。這是個有用的debug選項。w<sample_width>輸出樣本的寬度(以像素為單位)h«sample_height»輸出樣本的高度,以像素為單位。注:正樣本也可以從一個預先標記好的圖像集合中獲取。這個集合由一個文本文件來描述,類似于背景描述文件。每一個文本行對應一個圖片。每行的第一個元素是圖片文件名,第二個元素是對象實體的個數(shù)。后面緊跟著的是與之匹配的矩形框(x,y,寬度,高度)。了解了創(chuàng)建函數(shù)的命令行參數(shù)現(xiàn)在我們對正樣本舉個例子:假設有5個正樣本圖片文件img1.bmp,img5.bmp;創(chuàng)建一個正樣本的txt文本文檔,名字為info.txt正樣本描述文

25、件info.txt的內容如下positiveZimage1.bmp1002428positiveZimage2.bmp1002428positiveZimage3.bmp1002428positiveZimage4.bmp1002428positiveZimage5.bmp1002428positiveZimage6.bmp1002428圖片img1.bmp包含了單個目標對象實體,矩形為(0,0,24,28)。注意:要從圖片集中創(chuàng)建正樣本,要用一info參數(shù)而不是用一img參數(shù)。info<collect_file_name>標記特征的圖片集合的描述文件。背景(負樣本)描述文件的內容

26、如下:_imgZbg1.bmp1002428_ingZbg2.bmp1002428_imgZbg3.bmp1002428_ingZbg4.bmp1002428_imgZbg5.bmp1002428_ingZbg6.bmp1002428_imgZbg7.bmp1002428_ingZbg8.bmp1002428_imgZbg9.bmp1002428_ingZbg10.bmp10024281個新文件夾|E八這個文伴夾發(fā)布.Webinfo.txt形文件夾fel籍檔電文檔這幾個文件的位置在同個文件夾下,jxeartrBiriing.exe二JpositiveW文本文檔111KB哎,看圖,一目了然:現(xiàn)在

27、說了這么多廢話,現(xiàn)在開始干了:首先,打開,DOS,(開始-運行-輸入cmd)缺換到剛那個文件放的文件夾下,如圖,dos命令的缺換用cd,不詳說。irostiftWindow含XPE版本牙】心版權所有1985-2001MicrosoftCorp.如圖輸入的命令如圖j-DocunentsandSettingrsMldministratorJe:i:x>cdfacei-Xface>cdbin:Facebin>createsanpiesexe-veca.vec-infoinfo.txtbgLg.txtnuiin6-w24h28然后按回車鍵,會出現(xiàn)生成正樣本文件的信息:如圖三、訓練分類

28、器樣本創(chuàng)建之后,接下來要訓練分類器,這個過程是由haartraining程序來實現(xiàn)的。Haartraining的命令行參數(shù)如下:data<dir_name>存放訓練好的分類器的路徑名。vec<vec_file_name>正樣本文件名(由trainingssamples程序或者由其他的方法創(chuàng)建的)bg<background_file_name>背景描述文件。npos<number_of_positive_samples>,nneg<number_of_negative_samples>用來訓練每一個分類器階段的正/負樣本。合理的值是:n

29、Pos=7000;nNeg=3000一nstages<number_of_stages>訓練的階段數(shù)。一nsplits<number_of_splits>決定用于階段分類器的弱分類器。如果1,則一個簡單的stumpclassifier被使用。如果是2或者更多,則帶有number_of_splits個內部節(jié)點的CART分類器被使用。mem<memory_in_MB>預先計算的以MB為單位的可用內存。內存越大則訓練的速度越快。sym(default)一nonsym指定訓練的目標對象是否垂直對稱。垂直對稱提高目標的訓練速度。例如,正面部是垂直對稱的。一minhit

30、rate«min_hit_rate»每個階段分類器需要的最小的命中率。總的命中率為min_hit_rate的number_of_stages次方。一maxfalsealarm<max_false_alarm_rate>沒有階段分類器的最大錯誤報警率??偟腻e誤警告率為max_false_alarm_rate的number_of_stages次方。weighttrimming<weight_trimming>指定是否使用權修正和使用多大的權修正。一個基本的選擇是0.9eqwmode<basic(default)|core|all>選擇用來訓練

31、的haar特征集的種類。basic僅僅使用垂直特征。all使用垂直和45度角旋轉特征。w«sample_width»h«sample_height»訓練樣本的尺寸,(以像素為單位)。必須和訓練樣本創(chuàng)建的尺寸相同然后,同樣在dos命令行輸入harr這個函數(shù)的命令具體如圖E:>haapti'5ining.exe一datae-veca-vec-bgbg,txt-npos5nne卜2一如24f28然后,按回車,會出現(xiàn)下面的成果”界面:到目前為止,你自己需要的分類器的xml文檔就生成了,你自個找下你當前那個目錄,會發(fā)現(xiàn),多了幾個文件夾,請看圖:到目前

32、為止,就告一段落了,快一點了,還真冷,腳冰了?。ㄟ@里就只有幾個圖片,所以,很快訓練完,不過,要想訓練出檢測率高的xml,圖片的張數(shù)的很多,那時候,會訓練幾個小時到1天,時間幾天的時間,那時候,你只求你的電腦不要斷電!)1、OpenCV自帶的HaarTraining中的cvCreateTreeCascadeClassifier()函數(shù)最后出來的結果就是一個xml文件。而且為自己也親自實驗了,結果就是一個xml文件。在使用haartraining.exe的時候,注意到第一個參數(shù)是dirname。假設dirname="D:/haartraining/cascade",那么在整個訓

33、練結束的時候,會在D:/haartraining/cascade路徑下產生nstages個子文件夾。dirname的另一個作用就是用它來產生xml文件的存放路徑以及名字,像這樣的dirname就會在D:/haartraining路徑下生成cascade.xml。2、HaarTraining訓練過程:(1)、要訓練一個HaarTraining,總體上要分為3步:1)、準備正負樣本;2)、用CreateSample綱序建正樣本集;3)、用HaarTraining程序訓練,得到最終的分類器模型(xml文件)。(2)、主要步驟說明:1)、樣本準備正樣本:對于正樣本,通常的做法是先把所有正樣本裁切好,并對尺寸做規(guī)整(即縮放至指定大?。?。(這里我們直接從網上下載)由于HaarTraining訓I練時輸入的正樣本是vec文件,所以需要使用OpenCV自帶的CreateSample綱序將準備好的正樣本轉換為vec文件。轉換的步驟如下:A、制作一個正樣本描述文件,用于描述正樣本文件名(包括絕對路徑或相對路徑),正樣本數(shù)目以及各正樣本在圖片中的位置和大小;B、運行CreateSamples程序。如果直接在VC環(huán)境下運行,可以在ProjectSettingsDebug屬性頁的Progr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論