opencv 2.1網(wǎng)上查的另一種資料 訓(xùn)練分類器成功,在此與大家分享。 參考英文資料網(wǎng)址: http://note./SciSoftware/haartraining.html#e134e74e 樣本訓(xùn)練要求 1、杯子的背景要統(tǒng)一嗎,因?yàn)橛行┍尘笆前咨行┦堑谋尘吧?,還有些深色的背景色 答:背景色要統(tǒng)一 2、整個(gè)圖的大小就是最外面一個(gè)框框起來(lái)那么大, 問(wèn)題是:我需要在原圖基礎(chǔ)上截圖嗎,如:只把紅框框起來(lái)的那部分截出來(lái)???
答:不用的 3、那圖片是256色的還是彩色的呢? 答:灰度最佳
5、一般來(lái)說(shuō),訓(xùn)練分類器用的什么 圖片 就用什么 圖片作測(cè)試 6、那正樣本選擇方面有沒(méi)有要求,如玻璃杯 8、那關(guān)于杯子這個(gè)正樣本,我要弄大約多少?gòu)垐D片呀? 9、負(fù)樣本最好含有正樣本中的背景部分
訓(xùn)練失敗的原因很多: 1、負(fù)樣本數(shù)目太少,導(dǎo)致Adaboost算法漢有跳出死循環(huán), 2、負(fù)樣本之間重復(fù)部分過(guò)多,或正樣本尺寸過(guò)大,導(dǎo)致訓(xùn)練分類器時(shí)內(nèi)在溢出。
.vec文件里的東西是用二進(jìn)制的形式表示的。 本文現(xiàn)在正在做人頭檢測(cè)。視頻中的人頭尺寸,光照,角度都很不相同。 整個(gè)過(guò)程分為兩步: 1. 創(chuàng)建樣本 2. 訓(xùn)練分類器 3、 利用訓(xùn)練好的分類器進(jìn)行目標(biāo)檢測(cè)。 現(xiàn)在讓我一一講述。 1. 創(chuàng)建樣本 ◆ 樣本分兩種: 正樣本與負(fù)樣本(也有人翻譯成:正例樣本和反例樣本),其中正樣本是指待檢目標(biāo)樣本(例如人臉,汽車,鼻子等),負(fù)樣本指其它任意圖片。 ◆ 所有樣本圖片都應(yīng)該有同一尺寸,如20 * 20,并放在相應(yīng)文件目錄下, ◆ 集合文件格式(collection file format)和描述文件格式(description file format) 集合文件格式(collection file format)就是如下形的描述文件: [filename] [filename] [filename] … 描述文件格式(description file format)就是如下形的描述文件: [filename] [# of objects] [[x y width height] [... 2nd object] ...] [filename] [# of objects] [[x y width height] [... 2nd object] ...] [filename] [# of objects] [[x y width height] [... 2nd object] ...] …. (x, y) 指左上角的坐標(biāo),width和 height 分別是樣本的寬和高,這里我的圖片是20*20的,所以兩個(gè)值都是20 ◆ 負(fù)樣本用集合文件格式描述,正樣本用描述文件格式描述?。ㄟ@點(diǎn)網(wǎng)上很多文章都搞錯(cuò)了!) ▼創(chuàng)建樣本步驟: 一. 把所有正樣本圖片放在posdata的文件夾下,把所有負(fù)樣本圖片放在negdata文件夾下 (這里我以人臉圖片樣本為例)
(注:以上這些 20*20 的圖片均來(lái)自MIT人臉庫(kù),可以在csdn下載) 二. 分別為正樣本和負(fù)樣本創(chuàng)建描述文件 A. 為正樣本創(chuàng)建描述文件格式文件info.txt,并且把這個(gè)文件放在與樣本圖片同一目錄下,例如我的目錄為C:/OpenCV2.1/bin/posdata a) 在命令行下 輸入以下命令: dir /b > info.txt b) 打開(kāi)info.txt, 按ctrl+h, 把所有的bmp 換成 bmp 1 0 0 20 20 c) 刪除info.txt最后一行的 “info.txt” d) 結(jié)果如下:(1代表一個(gè)文件,0 0 20 20表示這個(gè)文件的2個(gè)頂點(diǎn)位置坐標(biāo)) B. 為負(fù)樣本創(chuàng)建集合文件格式文件bg.txt, 并且把這個(gè)文件放在與樣本圖片同一目錄下,例如我的目錄為I:/negdata a) 在命令行下 輸入以下命令: dir /b > bg.txt b) 刪除bg.txt最后一行的 “bg.txt” c) 結(jié)果如下:
三. 創(chuàng)建樣本。 Opencv 自帶有創(chuàng)建樣本的exe 文件,在 …/OpenCV2.1/bin 目錄下, 這里我創(chuàng)建120個(gè)sample: 命令是: opencv_createsamples.exe -info e:\test\posdata0\info.txt -vec e:\test\posdata0\pos.vec -num 120 -w 20 -h 20 如圖:
結(jié)果如圖:
(關(guān)于 opencv_createsamples.exe 的參數(shù)用法,在參考英文資料網(wǎng)址http://note./SciSoftware/haartraining.html#e134e74e,里有詳細(xì)介紹; 需要說(shuō)明的是,我這里用的參數(shù)并沒(méi)有 –bg, 因?yàn)楦鶕?jù)那份文檔,有了 –vec 和 –info 之后,就表示:Create training samples from some (從很多正樣本中創(chuàng)建sample, 沒(méi)有distortions) 經(jīng)歷千辛萬(wàn)苦,我們終于看到sample被創(chuàng)建成功了,接下來(lái)的工作就簡(jiǎn)單多了 ▼訓(xùn)練分類器 還是在…/OpenCV2.1/bin目錄下,輸入命令: opencv_haartraining.exe -data e:\test\data0\cascade0 -vec e:\test\posdata0\pos.vec -bg e:\test\negdata0\negdata0.txt -npos 120 -nneg 120 -nsplits 2 -mem 512 -nonsym -w 20 -h 20 -minpos 100 -nstages 4
回車 (注意: 1. 參數(shù)-vec 一定要是剛剛創(chuàng)建樣本產(chǎn)生的a.vec,且把完整路徑也寫(xiě)上去,我試過(guò)用相對(duì)路徑,但總會(huì)訓(xùn)練失??; bg.txt 也要用絕對(duì)路徑; .vec文件里的東西是用二進(jìn)制的形式表示的。 2. –w 和 –h 都要寫(xiě)上與樣本大小的一致的尺寸 3. 若遇到“內(nèi)存什么不能read”的問(wèn)題,很有可能是bg.txt的格式有誤,回去 4. 關(guān)于 opencv_haartraining.exe 的參數(shù)用法,在參考英文資料網(wǎng)址http://note./SciSoftware/haartraining.html#e134e74e,里有詳細(xì)介紹 ) 結(jié)果如下: (可能實(shí)際結(jié)果與上圖有出入, 但看到最后的 在E:\test\data0目錄會(huì)生成一份cascade0.xml文檔,這個(gè)就是我們想要的結(jié)果了! ============================================================================ OpenCV訓(xùn)練分類器制作xml文檔之一 我的問(wèn)題:有了opencv自帶的那些xml人臉檢測(cè)文檔,我們就可以用cvLoad()這個(gè)函數(shù)加載他們,讓他們對(duì)我們的人臉進(jìn)行檢測(cè),但是,現(xiàn)在生活中的計(jì)算機(jī)視覺(jué)并不遠(yuǎn)遠(yuǎn)是檢測(cè)人臉,還有很多物品需要識(shí)別,所以,能不能自己做個(gè)xml的檢測(cè)文檔,用它來(lái)檢測(cè)自己需要的東西呢?例如,檢測(cè)一個(gè)可樂(lè)瓶!
問(wèn)題解決: 首先了解下,目標(biāo)檢測(cè)分為三個(gè)步驟: 1、 樣本的創(chuàng)建 2、 訓(xùn)練分類器 3、 利用訓(xùn)練好的分類器進(jìn)行目標(biāo)檢測(cè)。 一,樣本的創(chuàng)建: (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è)前提條件。 訓(xùn)練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標(biāo)樣本(例如可樂(lè)瓶,人臉等),反例樣本指其它任意圖片,所有的樣本圖片都被歸一化為同樣的尺寸大小(例如,20x20)。1 、負(fù)樣本(反例樣本)可以來(lái)自于任意的圖片,但這些圖片不能包含目標(biāo)特征。 負(fù)樣本由背景描述文件來(lái)描述。背景描述文件是一個(gè)文本文件,每一行包含了一個(gè)負(fù)樣本圖片的文件名(基于描述文件的相對(duì)路徑)。該文件必須手工創(chuàng)建。
2,正樣本
現(xiàn)在,我們來(lái)看正樣本的創(chuàng)建步驟: 正樣本由程序createsample程序來(lái)創(chuàng)建。該程序的源代碼由OpenCV給出,并且在bin目錄下包含了這個(gè)可執(zhí)行的程序。 …… info.txt e:\test\posdata B1_001.bmp …… 背景(負(fù)樣本)描述文件negdata.txt的內(nèi)容如下: 圖片imag1.bmp包含了單個(gè)目標(biāo)對(duì)象實(shí)體,矩形為(0,0,20,20)。 -info <collect_file_name> C:\Program Files\OpenCV\bin>createsamples -info e:\test\posdata\info.txt -vec e:\test\posdata\pos.vec -num 18 -w 20 -h 20【解釋下】。。。。
小貼士1: 可以采用Dos命令生成樣本描述文件(一般樣本圖片上萬(wàn)幅),在Dos下進(jìn)入圖片目錄,輸入dir /b *.bmp > negdata.txt, 則會(huì)在此目錄中產(chǎn)生一個(gè)negdata.txt,文件中包含所有當(dāng)前目錄下的文件名,就可以建成負(fù)樣本描述文件。對(duì)于正樣本描述文件,方法同負(fù)樣本,只要把bmp替換成1 0 0 20 20即可。如果樣本圖片太多,在txt中替換會(huì)導(dǎo)致程序無(wú)法響應(yīng),可以先把內(nèi)容拷貝到word中替換后再拷貝回來(lái)。 小貼士2: 一些處理后的人臉圖片的網(wǎng)址 http://www./challenges/VOC/databases.html#VOC2005_1 三、訓(xùn)練分類器 C:\Program Files\OpenCV\bin>haartraining -data e:\test\data\cascade -vec e:\test\posdata\pos.vec -bg e:\test\negdata\negdata.txt -npos 18 -nneg 45 -nsplits 1 -mem 512 -mode ALL -w 20 -h 20 -minhitrage 0.998 -maxfalsealarm 0.5 -nstages 訓(xùn)練開(kāi)始,如下圖,可能會(huì)一小段時(shí)間才訓(xùn)練完成。
(可能實(shí)際結(jié)果與上圖有出入, 但看到最后的 在bin目錄會(huì)生成一份可愛(ài)的data.xml文檔,這個(gè)就是我們想要的結(jié)果了! 訓(xùn)練結(jié)束后,會(huì)在目錄data下生成一些子目錄,即為訓(xùn)練好的分類器。 訓(xùn)練結(jié)束后,還要使用haarconv.exe生成xml文件,可以通過(guò)下列網(wǎng)頁(yè)下載。 http://www./forum/viewtopic.php?t=5181 重要!可能遇到的問(wèn)題: 1.如果跑到某一個(gè)分類器時(shí),幾個(gè)小時(shí)也沒(méi)有反應(yīng),而且顯示不出訓(xùn)練百分比,這是因?yàn)槟愕呢?fù)樣本數(shù)量太少,或者負(fù)樣本的尺寸太小,所有的負(fù)樣本在這個(gè)分類器都被reject了,程序進(jìn)入不了下一個(gè)循環(huán),果斷放棄吧。解決方法:負(fù)樣本盡量要大一些,比如我的正樣本是40*15,共300個(gè),負(fù)樣本是640*480,共500個(gè)。(我當(dāng)時(shí)的錯(cuò)誤就出現(xiàn)在這,把負(fù)本改大后,就成功了) 2.讀取樣本時(shí)報(bào)錯(cuò):Negative or too large argument of CvAlloc function,網(wǎng)上說(shuō)這個(gè)錯(cuò)誤是因?yàn)閛pencv規(guī)定單幅iplimage的內(nèi)存分配不能超過(guò)10000,可是我的每個(gè)負(fù)樣本都不會(huì)超過(guò)這個(gè)大小,具體原因不明。后來(lái)我把負(fù)樣本的數(shù)量減少,尺寸加大,這個(gè)問(wèn)題就解決了。 3.訓(xùn)練的過(guò)程可能經(jīng)常出錯(cuò),耐心下來(lái)不要著急,我在訓(xùn)練MRI分類器的時(shí)候失敗了無(wú)數(shù)次。失敗的時(shí)候有兩件事可以做,第一,調(diào)整正負(fù)樣本的數(shù)量,再試。第二,調(diào)整負(fù)樣本的大小,祝大家好運(yùn)。 =============================================================================================
opencv haar訓(xùn)練--訓(xùn)練樣本(4) 1.海爾訓(xùn)練
Usage: ./haartraining -data <dir_name> -vec <vec_file_name> -bg <background_file_name> [-npos <number_of_positive_samples = 2000>] [-nneg <number_of_negative_samples = 2000>] [-nstages <number_of_stages = 14>] [-nsplits <number_of_splits = 1>] [-mem <memory_in_MB = 200>] [-sym (default)] [-nonsym] [-minhitrate <min_hit_rate = 0.995000>] [-maxfalsealarm <max_false_alarm_rate = 0.500000>] [-weighttrimming <weight_trimming = 0.950000>] [-eqw] [-mode <BASIC (default) | CORE | ALL>] [-w <sample_width = 24>] [-h <sample_height = 24>] [-bt <DAB | RAB | LB | GAB (default)>] [-err <misclass (default) | gini | entropy>] [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>] [-minpos <min_number_of_positive_samples_per_cluster = 500>]
$ haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7000 -nneg 3019 -w 20 -h 20 -nonsym -mem 512 -mode ALL
[-bt <DAB | RAB | LB | GAB (default)>] [-err <misclass (default) | gini | entropy>] [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>] [-minpos <min_number_of_positive_samples_per_cluster = 500>]
2.生成XML文件
$ convert_cascade --size="<sample_width>x<sampe_height>" <haartraining_ouput_dir> <ouput_file>
$ convert_cascade --size="20x20" haarcascade haarcascade.xml
|
|
來(lái)自: xinminima > 《目標(biāo)分類檢測(cè)》