用opencv3.3自帶的traincascade.exe訓練LBP特征的分類器
opencv3.3中有可以訓練分類器opencv_traincascade.exe,可以用HAAR、LBP和HOG特征訓練分類器。
這個函數都可以在opencv\build\x64\vc14\bin文件夾下找到,本文主要講opencv_traincascade.exe訓練LBP特征的分類器。
訓練的過程包過四步:
①樣本的準備
②對樣本進行處理
③生成樣本描述文件
④訓練分類器
1、樣本的準備
以行人訓練為例,首先正樣本是各種各樣的行人的照片,負樣本就是非人照片。樣本個數最好在上千個,個數太少訓練出來的分類器不能準確的檢測行人,網上對正負樣本的個數比例不盡相同,有的說3:1有的說7:3,具體的還是要自己去實驗,我用的正樣本有13692
ps:對正負樣本的幾點說明
正負樣本都要轉化成灰度圖,而且對於正樣本用haar特征訓練是規格化成20*20或其他大小,最好不要太大,過多的haar特征會影響分類器的訓練時間;對於LBP特征正樣本要規格化為24*24大小,而對於HOG要規格化成64*64. 負樣本對尺寸沒有統一要求,在訓練對應的分類器時,選擇的負樣本尺寸一定要大於等於正樣本規定的尺寸。
a)正樣本就是人的圖片就行了,盡量包含少的背景。
b)負樣本有兩點要求:
一、不能包含正樣本且盡可能多的提供場景的背景圖;
二、負樣本盡可能的多,而且要多樣化,和正樣本有一定的差距但是差別也不要太大,否則容易在第一級就全部被分類器reject,訓練時不能顯示負樣本的個數,從而導致卡死。
2、對樣本進行處理
在正負樣本中各寫一個批處理文件,如下圖:
PostiveData.bat內容如下:
@echo off :: 如果要文件名帶上路徑,則需要在dir這一句的%%~nxi上作改動 :: code by FBY && RMW if exist PostiveData.txt del PostiveData.txt /q ::for /f "delims=" %%i in (‘dir *.jpg /b /a-d /s‘) do echo %%~nxi PostiveData.txt for /f "delims=" %%i in (‘dir *.png *.jpg *.ppm /b /a-d /s‘) do ( echo %%~dpi%%~nxi 1 0 0 20 20>>PostiveData.txt ) if not exist PostiveData.txt goto no_file start PostiveData.txt exit :no_file cls echo %cur_dir% 文件夾下沒有單獨的文件 pause
NegativeData.bat內容如下:
@echo off :: 如果要文件名帶上路徑,則需要在dir這一句的%%~nxi上作改動 :: code by FBY && RMW if exist NegativeData.txt del NegativeData.txt /q for /f "delims=" %%i in (‘dir *.png *.jpg *.ppm /b /a-d /s‘) do ( echo %%~dpi%%~nxi>>NegativeData.txt ) if not exist NegativeData.txt goto no_file start NegativeData.txt exit :no_file cls echo %cur_dir% 文件夾下沒有單獨的文件 pause
最終生成的是PostiveData.txt和 NegativeData.txt文件。
①PostiveData.txt格式:
其中,第一列為圖像名,第二列為該圖像中正樣本的個數,最後的為正樣本在圖像中的位置以及需要摳出的正樣本的尺寸
②NegativeData.txt中只包含一列即圖像名。
3、生成樣本描述文件
對正負樣本進行以上預處理之後,就可以創建正樣本vec文件了。
首先把opencv自帶的訓練函數和正負樣本的.txt文件一起放到同一個文件夾下。如:
命令行進入opencv_createsamples.exe文件夾下,依次輸入:opencv_createsamples.exe -info PostiveData.txt -vec pos.vec -bg NegativeData.txt -num 13692 -w 20 -h 20 回車之後文件夾下就會出現pos.vec文件。
以上參數的含義如下:
-vec <vec_file_name>:訓練好的正樣本的輸出文件名。
-img<image_file_name>:源目標圖片(例如:一個公司圖標)
-bg<background_file_name>:背景描述文件。
-num<number_of_samples>:要產生的正樣本的數量,和正樣本圖片數目相同。
-bgcolor<background_color>:背景色(假定當前圖片為灰度圖)。背景色制定了透明色。對於壓縮圖片,顏色方差量由bgthresh參數來指定。則在bgcolor-bgthresh
和bgcolor+bgthresh 中間的像素被認為是透明的。
-bgthresh<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"會關閉這一開關,即不顯示樣本圖片,而創建過程
繼續。這是個有用的debug 選項。
-w<sample_width>:輸出樣本的寬度(以像素為單位)
-h<sample_height>:輸出樣本的高度(以像素為單位)
註意:只需要對正樣本進行以上操作,負樣本不需要生成vec文件
4、訓練分類器
在以上準備工作都做好的情況下,就可以進行訓練分類器了。
在cmd命令行下輸入:
D:\opencv3.3\build\x64\vc14\bin>opencv_traincascade.exe -data xml -vec pos.vec -bg NegativeData.txt -numPos 13692 -numNeg 5007 -numStages 20 -featureType LBP -w 20 -h 20
(其中-data後面的xml是在D:\opencv3.3\build\x64\vc14\bin下面的文件夾,新建一個空的文件夾就行)
按enter就可以進入訓練階段了。
opencv_traincascade.exe的命令行參數解釋如下:
-data <cascade_dir_name>:目錄用於保存訓練產生的分類器xml文件和中間文件(對於上面的LBP_classifier),如不存在訓練程序會創建它;
-vec <vec_file_name>:由 opencv_createsamples 程序生成的包含正樣本的vec文件名(對應上面的pos_24_24.vec);
-bg <background_file_name>:背景描述文件,也就是包含負樣本文件名的那個描述文件(對應上面的neg\neg.txt);
-numPos <number_of_positive_samples>:每級分類器訓練時所用的正樣本數目(默認值為2000);
-numNeg <number_of_negative_samples>:每級分類器訓練時所用的負樣本數目,可以大於 -bg 指定的圖片數目(默認值為1000);
-numStages <number_of_stages>:訓練的分類器的級數(默認值為20級);
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:緩存大小,用於存儲預先計算的特征值(feature values),單位為MB(默認值為256);
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:緩存大小,用於存儲預先計算的特征索引(feature indices),單位為MB(默認值為256);
內存越大,訓練時間越短。
-baseFormatSave:這個參數僅在使用Haar特征時有效。如果指定這個參數,那麽級聯分類器將以老的格式存儲(默認不指定該參數項,此時其值為false;一旦指定則其值默認為true);
級聯參數:CvCascadeParams類,定義於cascadeclassifier.h
-stageType <BOOST(default)>:級別(stage)參數。目前只支持將BOOST分類器作為級聯的類型;
-featureType<{HAAR(default), LBP}>:特征的類型: HAAR - 類Haar特征; LBP - 局部紋理模式特征(默認Harr);
-w <sampleWidth>:訓練樣本的寬(單位為像素,默認24);
-h <sampleHeight>:訓練樣本的高(單位為像素,默認24);
訓練樣本的尺寸必須跟訓練樣本創建(使用 opencv_createsamples 程序創建)時的尺寸保持一致。
Boosted分類器參數:CvCascadeBoostParams類,定義於boost.h
-bt <{DAB, RAB, LB, GAB(default)}>:Boosted分類器的類型(DAB - Discrete
AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle
AdaBoost為默認);
-minHitRate <min_hit_rate>:分類器的每一級希望得到的最小檢測率(默認值為0.995),總的檢測率大約為 min_hit_rate^number_of_stages;
-maxFalseAlarmRate <max_false_alarm_rate>:分類器的每一級希望得到的最大誤檢率(默認值為0.5),總的誤檢率大約為 max_false_alarm_rate^number_of_stages;
-weightTrimRate <weight_trim_rate>:Specifies whether trimming should be used and its weight,一個還不錯的數值是0.95;
-maxDepth <max_depth_of_weak_tree>:弱分類器樹最大的深度。一個還不錯的數值是1,是二叉樹(stumps);
-maxWeakCount <max_weak_tree_count>:每一級中的弱分類器的最大數目(默認值為100)。The
boosted classifier (stage) will have so many weak trees
(<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;
其中訓練出來的某一級的結果如下:
等到分類器訓練到你自己設定的級數 就完成了。最後得到的cascad.xml就是我們需要的結果。
用opencv3.3自帶的traincascade.exe訓練LBP特征的分類器