天天看點

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

前言

  紅胖子,來也!

  做圖像處理,經常頭痛的是明明分離出來了(非顔色的),分為幾塊區域,那怎麼知道這幾塊區域到底哪一塊是我們需要的,那麼這部分就涉及到需要識别了。

  識别可以自己寫模闆比對、特征點識别、級聯分類器訓練識别。

  本文章就是講解級聯分類器的訓練與識别。

明确目标

  目标是識别視訊中的歌手,我們先手動采集資料集合。

  視訊為《綠色》,如下圖:

訓練分類器前的準備工作

采集正樣本圖檔

  正樣本的尺寸不是必須一緻的,但是要和生成的正樣本矢量檔案中的寬高有相同的比例(因為訓練過程中,會根據設定的寬高進行等比縮放,比如設定正版本圖檔是128x128的,那麼樣本為256x256會縮放,假設楊文為256x128的那麼比例就不同了,這個圖怎麼處理?待定);

  正樣本圖檔應該盡可能包含少的幹擾背景資訊。在訓練過程中多餘的背景資訊也會成為正樣本的一個局部特征,此處與深度學習不同,深度學習現在主流無腦深度學習,圖像基本的一些去噪都可能不做。

  資料來源盡可能做到多樣化,比如樣本為車,車的姿态場景應稍豐富些。同一正樣本目标的圖像太多會使局部特征過于明顯,造成這個目标的訓練過拟合,影響檢測精度,不利于訓練器泛化使用。

  我們采集視訊的人臉,先把視訊解碼後儲存成jpg圖檔。

  此處省略一萬字…

建立樣本:opencv_createsamples.exe

  使用opencv自帶的指令行工具opencv_createsamples.exe

  • [-info <collection_file_name>]

    樣本說明檔案,每一行的内容為

xxx.jpg nums x y width height
           

  例如:圖檔中有兩個目标

xxx.jpg 2 0 0 100 100 200 200 100 100
           

  生成樣本在windows上依托指令行

dir /b > pos.data
           
  • [-img <image_file_name>]

      通過一張圖檔的扭曲形變成多張圖檔作為樣本,就填寫這個參數,參數的内容為要扭曲的圖檔的路徑。填入後,-info參數不再有效。

  • [-vec <vec_file_name>]

      樣本描述檔案的名字及路徑

  • [-bg <background_file_name>]

      負樣本描述檔案的名字及路徑,如果省略,則使用bgcolor的值填充作為背景。就是跟存放負樣本圖檔(背景圖檔)目錄位置相同的描述檔案的路徑,可用txt,dat等格式儲存,每一行的内容為:xxx.jpg。

  • [-inv]

      如果指定該标志,前景圖像的顔色将翻轉

  • [-randinv]

      如果指定該标志,顔色将随機地翻轉

  • [-num <number_of_samples = 1000>]

      總共幾個樣本,可以省略,則按照輸入的實際樣本數量産生

  • [-bgcolor <background_color = 0>]

      背景顔色(目前為灰階圖);背景顔色表示透明顔色。因為圖像壓縮可造成顔色偏差,顔色的容差可以由-bgthresh指定。所有處于bgcolor-bgthresh和bgcolor+bgthresh之間的像素都被設定為透明像素。

  • [-bgthresh <background_color_threshold = 80>]

      (參考-bgcolor)

  • [-maxidev <max_intensity_deviation = 40>]

      前景樣本裡像素的亮度梯度的最大值

  • [-maxxangle <max_x_rotation_angle = 1.100000>]

      x軸最大旋轉角度,機關弧度

  • [-maxyangle <max_y_rotation_angle = 1.100000>]

      y軸最大旋轉角度,機關弧度

  • [-maxzangle <max_z_rotation_angle = 0.500000>]

      z軸最大旋轉角度,機關弧度

  • [-show [<scale = 4.000000>]]

      顯示樣本,作為建立樣本時的調試

  • [-w <sample_width = 24>]

      樣本縮放到的尺寸

  • [-h <sample_height = 24>]

      樣本縮放到的尺寸

  • [-maxscale ]:
  • [-rngseed ]:

建立正樣本

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

建立負樣本

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

建立樣本檔案vec

opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -show -w 50 -h 70 \
                     -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28
           

(注意:LBP特征50x70等都可以可以訓練,實測HAAR則必須是24x24 or 20x20)

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

訓練樣本opencv_traincascade.exe

  使用opencv自帶的指令行工具opencv_traincascade.exe,可以訓練三個特征目标:HAAR、HOG、LBP。

  • -data <cascade_dir_name>

      訓練的分類器的存儲目錄。

  • -vec <vec_file_name>

      通過opencv_createsamples生成的vec檔案,正樣本的資料。

  • -bg <background_file_name>

      負樣本說明檔案,主要包含負樣本檔案所在的目錄及負樣本檔案名。

  • [-numPos <number_of_positive_samples = 2000>]

      每級分類器訓練時所用到的正樣本數目,但是應當注意,這個數值一定要比準備正樣本時的數目少。

  • [-numNeg <number_of_negative_samples = 1000>]

      每級分類器訓練時所用到的負樣本數目,可以大于-bg指 定的圖檔數目。

  • [-numStages <number_of_stages = 20>]

      訓練分類器的級數,強分類器的個數

  • [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]

      緩存大小,用于存儲預先計算的特征值,機關MB

  • [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]

      緩存大小,用于存儲預先計算的特征索引,機關MB

  • [-baseFormatSave]

      僅在使用Haar特征時有效,如果指定,級聯分類器将以老格式存儲。

  • [-numThreads <max_number_of_threads = 1>]

      支援多線程并行訓練

  • [-acceptanceRatioBreakValue = -1>]

      此參數用于确定模型應保持學習的精确程度以及何時停止。一個好的指導方針是訓練不超過10e-5(等于10*10^(-5) ),以確定模型不會過度訓練您的訓練資料。預設情況下,此值設定為-1以禁用此功能。

–cascadeParams–

  • [-stageType <BOOST(default)>]

      級聯類型,目前隻能取BOOST

  • [-featureType <{HAAR(default), LBP, HOG}>]

      訓練使用的特征類型,目前支援的特征有Haar,LBP和HOG

  • [-w <sampleWidth = 24>]

      訓練的正樣本的寬度,Haar特征的w和h一般為20,LBP特征的w和h一般為24,HOG特征的w和h一般為64

  • [-h <sampleHeight = 24>]

      訓練的正樣本的高

–boostParams–

  • [-bt <{DAB, RAB, LB, GAB(default)}>]

      增強分類器類型:DAB-Discrete AdaBoost,RAB-Real AdaBoost,LB-LogitBoost,GAB-Gentle AdaBoost。

  • [-minHitRate <min_hit_rate> = 0.995>]

      類器每個階段的最小期望命中率。總體命中率估計為(最小命中率^階段數)。

  • [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]

      分類器每個階段的最大期望誤報率。

  • [-weightTrimRate <weight_trim_rate = 0.95>]

      指定是否應使用修剪及其權重。一個不錯的選擇是0.95。

  • [-maxDepth <max_depth_of_weak_tree = 1>]

      弱樹的最大深度。一個不錯的選擇是1,這是樹樁的情況。

  • [-maxWeakCount <max_weak_tree_count = 100>]

      每個級聯階段的最大弱樹數。提升分類器(stage)将具有許多弱樹(<=maxWeakCount),以實作給定的-maxFalseAllRate。

–haarFeatureParams–

  • [-mode <BASIC(default) | CORE | ALL>]

      選擇訓練中使用的Haar特征集的類型。基本隻使用直立特征,而所有特征都使用全套直立和45度旋轉特征集。

訓練級聯分類器

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 64 -h 64
           

訓練出錯如下:

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

更換LBP特征,繼續訓練:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 64 -h 64
           

訓練出錯如下:

  根據錯誤寬高是要跟建立的樣本一樣,改為50x70,(建立的樣本為50x70),繼續訓練:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt  \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
           

  負樣本再生成一次絕對路徑:

dir /b /s >negAb.txt
           

  删掉非圖檔的行

  然後繼續訓練:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
           

訓練出錯,如下:

手動建立data目錄

OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

  繼續訓練:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
           

  然後,正常訓練,訓練完成:

如何訓練Haar

  要訓練haar特征級聯分類器,最開始建立樣本就必須為24x24 or 20x20的(經過多次嘗試論證),最終設定24x24訓練出來如下:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 24 -h 24
           

  訓練

opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -\
show -w 24 -h 24 -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28
           
OpenCV開發筆記(七十一):紅胖子8分鐘帶你深入級聯分類器訓練

  使用該級聯分類器,使用cascade.xml加載即可。

Haar級聯分類器的測試

  級聯分類器的測試請參考《OpenCV開發筆記(五十四):紅胖子8分鐘帶你深入了解Haar級聯分類器進行人臉檢測(圖文并茂+淺顯易懂+程式源碼)》

上一篇:《OpenCV開發筆記(七十):紅胖子帶你傻瓜式編譯VS2017x64版本的openCV4》

下一篇:持續補充中…