1. 程式人生 > >用opencv3.3自帶的traincascade.exe訓練LBP特征的分類器

用opencv3.3自帶的traincascade.exe訓練LBP特征的分類器

不能 有效 格式 aar file jpg for rotation 方差

opencv3.3中有可以訓練分類器opencv_traincascade.exe,可以用HAAR、LBP和HOG特征訓練分類器。

這個函數都可以在opencv\build\x64\vc14\bin文件夾下找到,本文主要講opencv_traincascade.exe訓練LBP特征的分類器。

訓練的過程包過四步:

①樣本的準備

②對樣本進行處理

③生成樣本描述文件

④訓練分類器

1、樣本的準備

  以行人訓練為例,首先正樣本是各種各樣的行人的照片,負樣本就是非人照片。樣本個數最好在上千個,個數太少訓練出來的分類器不能準確的檢測行人,網上對正負樣本的個數比例不盡相同,有的說3:1有的說7:3,具體的還是要自己去實驗,我用的正樣本有13692

個負樣本5007個。把正負樣本分別放在不同的文件夾下如:negative,positive。

技術分享

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特征的分類器