OpenCV中有兩個程序可以訓(xùn)練級聯(lián)分類器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一個新程序,使用OpenCV 2.x API 以C++ 編寫。這二者主要的區(qū)別是 opencv_traincascade 支持 Haar、Hog和 LBP(Local Binary Patterns) 三種特征,并易于增加其他的特征。與Haar特征相比,LBP特征是整數(shù)特征,因此訓(xùn)練和檢測過程都會比Haar特征快幾倍。LBP和Haar特征用于檢測的準(zhǔn)確率,是依賴訓(xùn)練過程中的訓(xùn)練數(shù)據(jù)的質(zhì)量和訓(xùn)練參數(shù)。訓(xùn)練一個與基于Haar特征同樣準(zhǔn)確度的LBP的分類器是可能的。
opencv_traincascade and opencv_haartraining 所輸出的分類器文件格式并不相同。注意,新的級聯(lián)檢測接口(參考 objdetect 模塊中的 CascadeClassifier 類)支持這兩種格式。 opencv_traincascade 可以舊格式導(dǎo)出訓(xùn)練好的級聯(lián)分類器。但是在訓(xùn)練過程被中斷后再重啟訓(xùn)練過程, opencv_traincascade ?and opencv_haartraining 不能裝載與中斷前不同的文件格式。
opencv_traincascade 程序使用TBB來處理多線程。如果希望使用多核并行運算加速,請使用TBB來編譯OpenCV。還有一些與訓(xùn)練相關(guān)的輔助程序。
opencv_createsamples 用來準(zhǔn)備訓(xùn)練用的正樣本數(shù)據(jù)和測試數(shù)據(jù)。 opencv_createsamples 能夠生成能被 opencv_haartraining 和 opencv_traincascade 程序支持的正樣本數(shù)據(jù)。它的輸出為以 *.vec 為擴(kuò)展名的文件,該文件以二進(jìn)制方式存儲圖像。
opencv_performance 可以用來評估分類器的質(zhì)量。它讀入一組標(biāo)注好的圖像,運行分類器并報告性能,如檢測到物體的數(shù)目,漏檢的數(shù)目,誤檢的數(shù)目,以及其他信息。
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
http://blog.csdn.net/delltdk/article/details/9186875
1 建立樣本集pos和neg
pos中存放正樣本的圖像,可以是一張圖像或多張圖像。neg中存放包含負(fù)樣本的圖像,可以是任意圖像,但是這些圖像中不能包含待檢測的物體。
注意:
一般需要一個很大的負(fù)樣本庫送給訓(xùn)練程序進(jìn)行訓(xùn)練。如果是絕對剛性的物體,如OpenCV的標(biāo)志,只有一張正樣本圖像,那么可以通過對物體圖像的隨機(jī)旋轉(zhuǎn)、改變標(biāo)志亮度以及將標(biāo)志放在任意的背景上而獲得大量的正樣本;如果是人臉,需要幾百甚至幾千個正樣本。在待檢測物體是人臉的情況下,需要考慮所有的人種、年齡、表情甚至胡子的樣式。
2 生成正\負(fù)樣本描述文件negdata.txt
(1) ? 負(fù)樣本描述文件negdata.txt
在命令行窗口輸入“cd d:\%....%\pos”路徑切換到neg文件夾下,輸入“dir/b>negdata.txt”就會在neg文件夾下生成描述文件negdata.txt,存放neg中所有圖片的文件名,注意要去掉最后的negdata.txt 。
注意:
如果把negdata.txt保存在neg文件夾外面,需要在每一行外面添加相對路徑或絕對路徑來指出樣本的所在位置。一種方法是將negdata.txt 文件中的內(nèi)容復(fù)制到word中,使用替換功能實現(xiàn)快速修改。neg替換為neg\neg
(2) ? 正樣本描述文件posdata.txt
與建立negdata.txt一樣建立posdata.txt,只不過在正樣本描述文件中需要指出目標(biāo)在每個樣本中的數(shù)量和位置如pos\1.bmp 1 x1 y1 x2 y2,其中(x1,y1,x2,y2)為目標(biāo)所在的矩形框,又如pos\1.bmp2 x1 y1 x2 y2 x1’ y1’ x2’ y2’
因為我們準(zhǔn)備的正樣本基本都是目標(biāo),因此只需在文件名后增加1 0 0 width height即可。
注意:
1若正樣本圖像是不同尺寸的,一方面可以使用ImageResize或matlab將圖像統(tǒng)一成同一尺寸在生成posdata.txt,或程序ImageToTxt直接生成具有不同尺寸圖像的正樣本描述文件。在此階段不歸一化的話,后續(xù)生成.vec文件的時候在程序中自動歸一化。
2樣本描述文件與圖像要一致,可以存在圖像但沒有寫在描述文件中,即有多余的圖像,但千萬不要在描述文件中寫不存在的圖像。
問題:
? ? ? ?歸一化尺寸的方法是否對訓(xùn)練結(jié)果有影響? opencv_createsamples 采用何種方法進(jìn)行歸一化?
sample = cvCreateImage( cvSize(winwidth, winheight ), IPL_DEPTH_8U, 1 );
fscanf( info, "%d %d %d%d", &x, &y, &width, &height )
? ? cvSetImageROI( src, cvRect( x, y, width,height ) );
cvResize( src, sample,
width >=sample->width && height >= sample->height ? CV_INTER_AREA :CV_INTER_LINEAR );
CV_INTER_NN ? ? ? ? 最近鄰插值
CV_INTER_LINER ? ? ?雙線性插值,缺省情況
CV_INTER_AREA ? ? ?使用像素關(guān)系重采樣,當(dāng)圖像縮小時候可以避免波紋出現(xiàn),當(dāng)圖像方法時類似CV_INTER_NN
CV_INTER_CUBIC ? ? 立方插值
3 生成.vec文件
生成的正樣本數(shù)目以及隨機(jī)的程度都可以通過 opencv_createsamples 的命令行參數(shù)控制。
使用create.dat調(diào)用%Opencv%\vs2008\bin\Release\ opencv_createsamples.exe
在createsamples.cpp中查閱參數(shù)設(shè)置
-info ? ? ? ? ? ? ? ? ? ? ? 輸入正樣本描述文件,默認(rèn)NULL
-img ? ? ? ? ? ? ? ? ? ? ? 輸入圖像文件名,默認(rèn)NULL
-bg ? ? ? ? ? ? ? ? ?負(fù)樣本描述文件,文件中包含一系列的被隨機(jī)選作物體背景的圖像文件名,默認(rèn)NULL
-num ? ? ? ? ? ? ? ? ?生成正樣本的數(shù)目,默認(rèn)1000
-bgcolor ? ? ? ? ? ? ?背景顏色,表示透明顏色,默認(rèn)0
-bgthresh ? ? ? ? 顏色容差,所有處于bgcolor-bgthresh和bgcolor+bgthresh之間的像素被置為透明像素,也就是將白噪聲加到前景圖像上,默認(rèn)80
-inv ? ? ? ? ? ? ? ? ?前景圖像顏色翻轉(zhuǎn)標(biāo)志,如果指定顏色翻轉(zhuǎn),默認(rèn)0(不翻轉(zhuǎn))
-randinv ? ? ? ? ? ? ?如果指定顏色將隨機(jī)翻轉(zhuǎn),默認(rèn)0
-maxidev ? ? ? ? ? ? 前景圖像中像素的亮度梯度最大值,默認(rèn)40
-maxxangle ? ? ? ? ? X軸最大旋轉(zhuǎn)角度,以弧度為單位,默認(rèn)1.1
-maxyangle ? ? ? ? ? Y軸最大旋轉(zhuǎn)角度,以弧度為單位,默認(rèn)1.1
-maxzangle ? ? ? ? ? Z軸最大旋轉(zhuǎn)角度,以弧度為單位,默認(rèn)0.5
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?輸入圖像沿著三個軸進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)角度由上述3個值限定。
-show ? ? ? ? ? ? ? 如果指定,每個樣本都將被顯示,按下Esc鍵,程序?qū)⒗^續(xù)創(chuàng)建樣本而不在顯示,默認(rèn)為0(不顯示)
-scale ? ? ? ? ? ? ? ?顯示圖像的縮放比例,默認(rèn)4.0
-w ? ? ? ? ? ? ? ? ?輸出樣本寬度,默認(rèn)24
-h ? ? ? ? ? ? ? ? ? 輸出樣本高度,默認(rèn)24
-vec ? ? ? ? ? ? ? ?輸出用于訓(xùn)練的.vec文件,默認(rèn)NULL
將正樣本描述文件中的正樣本轉(zhuǎn)換為灰度圖像并縮放到-w-h尺寸存入vec文件中。
(1)如果設(shè)置-img和-vec
調(diào)用cvCreateTrainingSamples,采用一張圖像創(chuàng)建訓(xùn)練樣本
(2)如果設(shè)置-img、-bg和-info
調(diào)用cvCreateTestSamples,采用一張圖像創(chuàng)建測試樣本。-bg在這里又有什么作用?目的是作為背景創(chuàng)建測試圖像。
(3)如果設(shè)置-info和-vec(采用正樣本描述文件中的圖像創(chuàng)建訓(xùn)練樣本)
調(diào)用cvCreateTrainingSamplesFromInfo,在cvCreateTrainingSamplesFromInfo中將讀取樣本,并resize后調(diào)用icvWriteVecHeader和icvWriteVecSample創(chuàng)建vec文件。
(4)如果只設(shè)置-vec(只顯示vec文件中的樣本)
調(diào)用cvShowVecSamples查看和檢查保存在vec文件中正樣本
上述參數(shù)在create.dat中設(shè)置好,最后有一個pause,等待顯示結(jié)果:Done.Created num samples
4 訓(xùn)練過程
使用train.dat調(diào)用%Opencv%\vs2008\bin\Release\ opencv_traincascade.exe
在traincascade.cpp中查閱參數(shù)設(shè)置
1. 基本參數(shù)
-data ? ? ? ? ? ? ? ? ? ? ? ? ? ?目錄名,存放訓(xùn)練好的分類器,如果不存在訓(xùn)練程序自行創(chuàng)建
-vec ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?正樣本.vec文件,由opencv_createsamples生成
-bg ? ? ? ? ? ? ? ? ? ? ? ? ? ?負(fù)樣本描述文件
-numPos ? ? ? ? ? ? ? ? ? ? ?每級分類器訓(xùn)練時所用到的正樣本數(shù)目
-numNeg ? ? ? ? ? ? ? ? ? ? ? ?每級分類器訓(xùn)練時所用到的負(fù)樣本數(shù)目,可以大于-bg指定的圖片數(shù)目
?-numStages ? ? ? ? ? ? ? ? ?訓(xùn)練分類器的級數(shù)
?-precalcValBufSize ? ? ? ? ? 緩存大小,用于存儲預(yù)先計算的特征值,單位MB
-precalcIdxBufSize ? ? ? ? ? ?緩存大小,用于存儲預(yù)先計算的特征索引,單位M幣
-baseFormatSave ? ? ? ? ? ? ? ? 僅在使用Haar特征時有效,如果指定,級聯(lián)分類器將以老格式存儲
2. 級聯(lián)參數(shù)cascadeParams
-stageType ? ? ? ? ? ? ? ? ? ?級聯(lián)類型,staticconst char* stageTypes[] = { CC_BOOST };
-featureType ? ? ? ? ? ? ? ? ? ? 特征類型,staticconst char* featureTypes[] = { CC_HAAR, CC_LBP, CC_HOG };
-w ? ? ? ? ? ??
-h ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?訓(xùn)練樣本的尺寸,必須跟使用opencv_createsamples創(chuàng)建的訓(xùn)練樣本尺寸保持一致
3. Boosted分類器參數(shù)stageParams
-bt ? ? ? ? ? ? ? ? ? ? ?Boosted分類器類型
DAB-discrete Adaboost, RAB-RealAdaboost, LB-LogiBoost, GAB-Gentle Adaboost
-minHitRate ? ? ? ? ? ? ? ? ? ? ?分類器的每一級希望得到的最小檢測率,總的最大檢測率大約為
min_hit_rate^number_of_stages
-maxFalseAlarmRate ? ? ? ? ? 分類器的每一級希望得到的最大誤檢率,總的誤檢率大約為
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? max_false_rate^number_of_stages
-weightTrimRate ? ? ? ? ? ? ? Specifies whether trimming should beused and its weight. 一個還不錯的數(shù)值是0.95
-maxDepth ? ? ? ? ? ? ? ? ? 弱分類器的最大深度,一個不錯數(shù)值是1,二叉樹
-maxWeightCount ? ? ? ? ? ? 每一級中弱分類器的最大數(shù)目
4. Haar特征參數(shù)featureParams
-mode ? ? ? ? ? ? ? ? ? ? ? ? ?訓(xùn)練過程使用的Haar特征類型,CORE-Allupright ?ALL-All Features BASIC-Viola
上述參數(shù)設(shè)置好后調(diào)用CvCascadeClassifier::train進(jìn)行訓(xùn)練
將上述內(nèi)容在train.dat中編輯好,運行即可。訓(xùn)練最終生成一個-data指定級聯(lián)分類器的文件夾和一個cascade.xml文件,其余文件都是中間結(jié)果,當(dāng)訓(xùn)練程序被中斷之后,再重新運行訓(xùn)練程序?qū)⒆x入之前的訓(xùn)練結(jié)果,無需從頭重新訓(xùn)練,訓(xùn)練結(jié)束后可以刪除這些文件。
? ? ? ?在cascade.xml文件中主要有stageType,featureType,width,height,stageParams,featureParams,stageNum,stages和features節(jié)點。
stages中的stage數(shù)目是自己設(shè)定的,每個stage又包含多個weakClassifiers,每個weakClassifier又包含一個internalNodes和一個leafValues。internalNodes中四個變量代表一個node,分別為node中的left/right標(biāo)記,特征池中的ID和threshold。leafValues中兩個變量代表一個node,分別為leftleaf和right leaf值。
? ? ? ?features是分類器的特征池,每個Haar特征包含一個矩形rect和要提取的特征序號,每個Hog特征/LBP特征包含一個矩形。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
注意:
1. 包含負(fù)樣本的圖像一定不小于在create中設(shè)置的尺寸
負(fù)樣本圖像可以是不同的尺寸,但是圖像尺寸應(yīng)該比訓(xùn)練窗口的尺寸大,在使用負(fù)樣本圖像時,OpenCV自動從負(fù)樣本圖像中摳出一塊和正樣本同樣大小的區(qū)域作為負(fù)樣本。具體可查閱icvGetNextFromBackgroundData,具體摳圖過程為:
1) ?確定摳圖區(qū)域的左上角坐標(biāo)(Point.x, Point.y)
2) ?確定一個最小縮放比例,使得原負(fù)樣本圖像縮放后恰好包含選中負(fù)樣本區(qū)域
3) ?對原負(fù)樣本圖象按計算好的縮放比例進(jìn)行縮放
4) ?在縮放后的圖像上摳出負(fù)樣本。
2. –numPos一般比實際正樣本數(shù)量少200-300,-numNeg是否存在同樣的情況?正負(fù)樣本選擇規(guī)則?
如果出現(xiàn):訓(xùn)練停留在一個分類器長達(dá)幾小時沒有相應(yīng),問題出現(xiàn)在取負(fù)樣本的那個函數(shù) icvGetHaarTrainingDataFromBG中;只有當(dāng)之前的強(qiáng)分類器對負(fù)樣本集內(nèi)的樣本全部分類正確時才會出現(xiàn)死循環(huán),因為只要有一個樣本會被錯分為正樣本,那么通過count次掃描整個負(fù)樣本集就能得到count個負(fù)樣本,當(dāng)然這count個負(fù)樣本實際上就是一個負(fù)樣本的count個拷貝。為避免這種情況,負(fù)樣本集中的樣本數(shù)需要足夠多 。
不過此時的分類器已經(jīng)完全額、可以使用,因為它的誤檢率已經(jīng)很低,從實用性上時沒有任何問題的。所以我們可以通過設(shè)置-nstages 這個參數(shù)來限制分類器級數(shù),適當(dāng)時候停止并生成xml文件。
從CvCascadeBoost::train中去查閱
函數(shù) ? ? ? ? ? ? ? ?poscount= icvGetHaarTrainingDataFromVec( training_data, 0, npos,
? ? ? ? ? ? ? ? ? ? (CvIntHaarClassifier*)tcc, vecfilename, &consumed )負(fù)責(zé)從正樣本集*.vec 文件中載入 count(npos)個正樣本。在程序第一次運行到此(即訓(xùn)練第一個分類器之前)時,只要正樣本集中有 count 個樣本,就一定能取出 count 個正樣本。在以后運行到此時,有可能取不到 count 個樣本,因為
必須是用前面的級聯(lián)強(qiáng)分類器((CvIntHaarClassifier*) tcc)分類為正樣本(即分類正確的樣本)的樣本才會被取出作為下一個強(qiáng)分類器訓(xùn)練樣本,具體可參考 icvGetHaarTrainingData和icvEvalTreeCascadeClassifierFilter函數(shù)。
訓(xùn)練負(fù)樣本,具體可參考icvGetHaarTrainingDataFromBG和icvEvalTreeCascadeClassifierFilter函數(shù)。
int icvGetHaarTrainingDataFromBG(CvHaarTrainingData* data, int first, int count,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CvIntHaarClassifier*cascade, double* acceptance_ratio, const char * filename = NULL )
? 傳遞返回值的 acceptance_ratio 參數(shù)記錄的是實際取出的負(fù)樣本數(shù)與查詢過的負(fù)樣本數(shù)(如果通過前面級聯(lián)stage強(qiáng)分類器的負(fù)樣本數(shù)很少時,那么程序會循環(huán)重復(fù)讀取負(fù)樣本,并用thread_consumed_count計數(shù))之比(acceptance_ratio = ((double) count) / consumed_count),也就是虛警率,用于判斷已訓(xùn)練的級聯(lián)分類器是否達(dá)到指標(biāo),若達(dá)到指標(biāo),則停止訓(xùn)練過程。?
?
? 注意函數(shù) icvGetHaarTrainingData中一個主要的 For 循環(huán):
? ? ? ? for( i = first; i < first +count; i++ ) //共讀取 count 個負(fù)樣本,當(dāng)讀取不到
? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ?//這么多負(fù)樣本時將出現(xiàn)死循環(huán)!
?
? 對上面代碼中的注釋有必要進(jìn)一步說明一下:只有當(dāng)之前的強(qiáng)分類器對負(fù)樣本集內(nèi)的樣本全部分類正確時才會出現(xiàn)死循環(huán)。因為只要有一個樣本會被錯分為正樣本,那么通過 count次掃描整個負(fù)樣本集就能得到 count 個負(fù)樣本,當(dāng)然這 count 個負(fù)樣本實際上就是一個負(fù)樣本的 count 個拷貝。為避免這些情況的發(fā)生,負(fù)樣本集中的樣本數(shù)需要足夠多。
? 在負(fù)樣本圖像大小與正樣本大小完全一致時,假設(shè)最終的分類器虛警率要求是falsealarm,參加訓(xùn)練的負(fù)樣本要求是 count 個,則需要的負(fù)樣本總數(shù)可計算如下: TotalCount = count / falsealarm
? 以 Rainer Lienhart 的文章中的一些參數(shù)為例,falsealarm=0.5^20=9.6e-07, count=3000,
則 TotalCount=3000/(0.5^20)= 3,145,728,000=31 億。
函數(shù) icvGetHaarTrainingDataFromBG ()負(fù)責(zé)從負(fù)樣本集中載入 count 個負(fù)樣本。在程序第一次運行到此(即訓(xùn)練第一個分類器之前)時,只要負(fù)樣本集中有 count 個樣本,就一定能取出 count 個負(fù)樣本。在以后運行到此時,有可能取不到 count 個樣本,因為必須是用前面的級聯(lián)強(qiáng)分類器分類為正樣本的樣本(即分類錯誤的樣本)才會被取出作為下一個強(qiáng)分類器的負(fù)樣本輸入。
?
對于int icvGetHaarTrainingData( CvHaarTrainingData* data,int first, int count,
? ? ? ? ? ? ? ? ? ? ? ? ? ? CvIntHaarClassifier*cascade,
? ? ? ? ? ? ? ? ? ? ? ? ? ? CvGetHaarTrainingDataCallbackcallback, void* userdata,
? ? ? ? ? ? ? ? ? ? ? ? ? ? int*consumed, double* acceptance_ratio )
?這個函數(shù)的解釋:
這是個對于讀取正負(fù)樣本通用的函數(shù),區(qū)別在于callback的調(diào)用。在這個函數(shù)中有個變量thread_getcount,表示將樣本分為正樣本的數(shù)目(不論這個樣本是負(fù)樣本還是正樣本)。
? 傳遞返回值的 Consumed 參數(shù)表示為取 count 個正樣本,查詢過的正樣本總數(shù)。對于負(fù)樣本為空(null),沒有返回值。?
3.? 之前遇到過10*20的不能訓(xùn)練Hog特征的分類器?Hog特征是否存在尺寸限制?
? ? ? ? ?查閱Hog特征的計算方法,Opencv中HogDescriptor
? ? ? ? ? 訓(xùn)練方法大同小異,只是提取的特征是不一樣的,流程是一樣的
4.?在用opencv_traincascade訓(xùn)練分類器的時候,遇到了報錯如下:
Train dataset for temp stage can not be filled. Branch training terminated.
在stackoverflow上查了一下,問題的根源在于負(fù)樣本讀取失敗,導(dǎo)致問題的原因有:
1)負(fù)樣本描述文件neg.txt不能帶路徑名,即 : -bg neg.txt 是合法的, -bg negdata/neg.txt是非法的。所以必須把neg.txt文件跟exe文件放在同一個目錄下
2)當(dāng)切換了操作系統(tǒng)時,會因為txt文件的格式問題而導(dǎo)致了負(fù)樣本讀取失敗。比如:在windows操作系統(tǒng)下生出了neg.txt,但是在ubuntu下進(jìn)行訓(xùn)練,這樣就會導(dǎo)致錯誤,這是因為windows下txt文件換行符'\r'在ubuntu下無法識別
3)負(fù)樣本圖片的問題。我遇到的報錯原因就是用opencv處理負(fù)樣本后保存時沒有檢驗負(fù)樣本是否為空,即直接把空的mat寫入了文件,導(dǎo)致了報錯
5. 其它注意
1 關(guān)于正樣本,首先正樣本不是有些人說的,你實際有300個正樣本,在traincascade的時候可以寫成3000的,這種思路是沒有用的。在采集正樣本的時候你一定要注意保持所有樣本寬高比大致相同,如果你自己截圖,推薦使用光影魔術(shù)手?;蛘吲1频哪阕约簩憘€gui截圖工具。為了避免出現(xiàn)opencv error,在用opencv_traincascade.exe的時候,-numPos要稍微低于實際的正樣本數(shù)目,比如你有2100個你就可以將numpos設(shè)為1900-2000,
2 ?無論正樣本負(fù)樣本,圖片命名時不要用特殊字符,你就規(guī)規(guī)矩矩的命名pos1.jpg 。。。。。等等,特殊字符包括(),會出現(xiàn)opencv error,或者無法識別。
3 正負(fù)樣本比例1:2.5~1:3,曾經(jīng)有篇文章中說,為了減小false positive ,可以加大負(fù)樣本數(shù)目。
4 當(dāng)出現(xiàn)內(nèi)存不夠的情況時,有幾種方法:1 你可以在64為pc上跑,2 減小正負(fù)樣本的數(shù)目。3 減小正樣本的寬高。
參考鏈接:
?https://blog.csdn.net/xidianzhimeng/article/details/10470839
opencv訓(xùn)練自己的xml分類器以及如何獲取opencv_createsamples.exe和opencv_traincascade.exe_Lizaozao96的博客-CSDN博客
(終章)[圖像識別]13.OpenCV案例 自定義訓(xùn)練集分類器物體檢測_opencv 物體識別_ζ?? ??霧 ??狼 ???的博客-CSDN博客
【OpenCV學(xué)習(xí)記錄】級聯(lián)分類器訓(xùn)練與測試_Silence涂的博客-CSDN博客
【cascades訓(xùn)練】 使用Cascade Trainer GUI進(jìn)行級聯(lián)分類器訓(xùn)練_十年一夢實驗室的博客-CSDN博客
[Opencv]Cascade級聯(lián)分類器_cascade分類器_Chris_Liu_的博客-CSDN博客
OpenCV中級聯(lián)分類器Cascade訓(xùn)練方法(Linux)_opencv級聯(lián)分類器_灼灼其華R的博客-CSDN博客
常見問題
我嘗試使用opencv_traincascade.exe,但它啟動后幾秒鐘崩潰。這是我如何進(jìn)行:opencv_traincascade崩潰沒有解釋
這是因為您選擇的窗口大小。 traincascade.exe用于訓(xùn)練分類器的內(nèi)存隨著窗口大小成指數(shù)增長,并且有幾臺家用計算機(jī)可以處理traincascade中的100x100窗口大小。
執(zhí)行此練習(xí):打開任務(wù)管理器并監(jiān)視內(nèi)存使用情況當(dāng)你開始訓(xùn)練時,你會注意到當(dāng)程序不能分配更多內(nèi)存時程序崩潰。 要解決這個問題,你必須選擇一個更小的窗口大小。
您可以使用參數(shù)-precalcValBufSize 1024和-precalcIdxBufSize 1024.如果喜歡,可以增加數(shù)字,但需要將值放在RAM容量以下
樓主你好。我也在訓(xùn)練分類器,目前的問題是但是只訓(xùn)練了一層,識別率就到了1,F(xiàn)A=0,然后訓(xùn)練stage1就無限卡住,問題究竟出在哪里?
訓(xùn)練過程命令如下:
opencv_traincascade -data classifier -vec pos.vec -vg neg.txt -numPos 11000 -numNeg 26545 -numStage 15 -precalcValBufSize 10240 -precalcIdxBufSize 10240 -w 64 -h 64 -mode ALL
正樣本12519張、負(fù)樣本26545張、都是64x64尺寸,訓(xùn)練stage設(shè)置為15層。
參數(shù)都是比較正常的,為什么訓(xùn)練完stage0 結(jié)果就是HR=1,FA=0
再就卡到stage1了,頭疼??
-
-
負(fù)樣本數(shù)目設(shè)置不對,設(shè)定為總數(shù)的一半,或者其他值,反正要少與實際有的數(shù)目
-
-
你好...我看設(shè)置訓(xùn)練參數(shù)那...只是設(shè)置了每個強(qiáng)分類器包含的最大的弱分類器個數(shù)maxWeakCount...那每個強(qiáng)分離包含的弱分類器個數(shù)是怎么設(shè)定的?...
-
-
樣本路徑不對
-
vCascadeClassifier::train()這個函數(shù)概述了整個Cascade的執(zhí)行過程。包括訓(xùn)練前的初始化,各Stage的強(qiáng)分類器間的樣本集更新及強(qiáng)分類器訓(xùn)練都可看到其蹤影,最顯眼的還是其中的Stage訓(xùn)練的for大循環(huán)。
更新stage間的樣本, 要做到訓(xùn)練新的stage的時候仍保障正負(fù)樣本數(shù)足夠.
if ( !updateTrainingSet( tempLeafFARate ) )
{
樣本數(shù)不夠, 退出訓(xùn)練
cout << "Train dataset for temp stage can not be filled. Branch training terminated." << endl;
break;
}
if( tempLeafFARate <= requiredLeafFARate )
{
虛警率已經(jīng)達(dá)標(biāo) 不再繼續(xù)訓(xùn)練
cout << "Required leaf false alarm rate achieved. Branch training terminated." << endl;
break;
}
?編輯?網(wǎng)頁鏈接里面的函數(shù)解析這么說的
-
-
zhi_jin2016.05.20
樓主你好噻,我把參數(shù)改來改去都一直出現(xiàn)這樣的錯誤,可以幫忙看看問題出在哪里么~?
正:18587 負(fù):10926
根據(jù)公式:numpos<=(18587-10926)/(1+15*0.001) numpos<=7547.78...
E:\train>opencv_traincascade.exe -data xml -vec pos1.vec -bg negdata\neg.txt -numpos 7547 -numneg 10926 -numstages 16 -minHitRate 0.999 -featureType HAAR -w 20
-h 20
PARAMETERS:
cascadeDirName: xml
vecFileName: pos1.vec
bgFileName: negdata\neg.txt
numPos: 2000
numNeg: 1000
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 20
sampleHeight: 20
boostType: GAB
minHitRate: 0.999
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 2000 : 2000
Train dataset for temp stage can not be filled. Branch training terminated.
Cascade classifier can't be trained. Check the used training parameters. -
-
請問一下,你最后改成功了嗎?咋改的啊,我也遇到同樣的問題
-
你好。能過能發(fā)我一份正樣本和反樣本。我的郵箱1079666237@qq.com 謝謝
-
-
我現(xiàn)在遇到的問題是:
1、虛警率有些高,檢測時經(jīng)常會誤檢;
我使用正樣本大約4000個,負(fù)樣本大約8000個,minHitRate=0.997,maxFalseRate=0.5
我現(xiàn)在的命中率很高,請問怎么降低誤檢率?
2、第二個問題是如何調(diào)各個參數(shù)?如何提高樣本的質(zhì)量?如何評價樣本的質(zhì)量?謝謝! -
-
回復(fù)wangyuezhuiyi2016.11.08
我的一直出錯OpenCV Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
能不能給我個無限制條件能直接下載的地址,或者發(fā)我郵箱1079666237@qq.com 謝謝
-
-
kissmemissme2016.05.09
你好樓主,我要用隨機(jī)森林算法訓(xùn)練分類器怎么用呢
-
樓主,能不能麻煩發(fā)一份源代碼呢,非常感謝!!
-
-
回復(fù)第二個半價2016.04.29
源碼可以從opencv中找哈,在sources/apps/traincascade目錄下
-
-
為什么我把-numPos改成3200,程序自己只能識別2000呢,這是為什么啊,每次都是這樣,樓主請您解答啊,非誠感謝。負(fù)樣本改成什么數(shù)都可以識別
-
-
淺淺_mo回復(fù)lee3333332016.11.28
有可能是你-numPos的參數(shù)名中的p沒有寫成大寫
-
-
opencv_traincascade.exe,樓主能不能發(fā)給我一份呢,我的是2.4.6版本,為啥電腦就是找不到,用2.4.9版本出現(xiàn)很多問題,我的郵箱是xinxueab@163.com
-
-
西電之夢作者回復(fù)天使之一2014.10.13
給你發(fā)過去了,你看一下。
-
-
chen123123_sh2014.06.11
HOG和HAAR訓(xùn)練的模式是否相同?
-
-
西電之夢作者回復(fù)chen123123_sh2014.10.13
訓(xùn)練方法大同小異,只是提取的特征是不一樣的,流程是一樣的
-
-
樓主你好,我想問下xml里的leafvalue,它leftvalue和rightvalue是怎么算出來的呢?還有featureIdex和featcomponent的區(qū)別是啥呀
-
-
西電之夢作者回復(fù)hwl567892014.10.13
featureIndex表示特征池中的Id號(與features中的特征個數(shù)相對應(yīng)),featureComponent表示HOG特征的特征序號(0-35)
-
-
a201c501ys2014.02.23
樓主你好,我的正樣本250張10*40大小的,負(fù)樣本1000張跟正樣本一樣大小且不包含正樣本圖像的,但訓(xùn)練到第四層就卡住,不知道怎么回事?
-
-
你好,請問訓(xùn)練的正負(fù)樣本有沒有上限呢
我覺得是訓(xùn)練樣本數(shù)太少了,陷入了極小值而不能跳出,你試著多增加點樣本試試。采用adaboost訓(xùn)練的時候樣本數(shù)量最好足夠多。
-
-
樓主您好,剛開始用opencv的分類器,看您的文章的時候有些疑惑?!笆褂胏reate.dat調(diào)用%Opencv%\vs2008\bin\Release\ opencv_createsamples.exe”這句話什么意思??文章來源:http://www.zghlxwxcb.cn/news/detail-581571.html
-
那句話的意思就是自己寫一個擴(kuò)展名為dat的文件,里面包含下面的參數(shù)設(shè)置,相信看看opencv_createsamples程序的源文件您就明白了,dat文件就是main函數(shù)中argv參數(shù),argv[0]=應(yīng)用程序名,也就是 opencv_createsamples.exe文章來源地址http://www.zghlxwxcb.cn/news/detail-581571.html
到了這里,關(guān)于OpenCV分類檢測器訓(xùn)練的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!