閱讀778 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【原】訓練自己haar-like特征分類器並識別物體(2)

在上一篇文章中,我介紹了《訓練自己的haar-like特征分類器並識別物體》的前兩個步驟:

1.準備訓練樣本圖片,包括正例及反例樣本

2.生成樣本描述文件

3.訓練樣本

4.目標識別

=================

今天我們將著重學習第3步:基於haar特征的adaboost級聯分類器的訓練。若將本步驟看做一個係統,則輸入為正樣本的描述文件(.vec)以及負樣本的說明文件(.dat);輸出為分類器配置參數文件(.xml)。

老規矩,先介紹一下這篇文章需要的工具,分別是(1)訓練用的opencv_haartraining.exe,該程序封裝了haar特征提取以及adaboost分類器訓練過程;(2)haarconv.exe(老版本命名法)或者convert_cascade.exe(新版本命名法),該程序用於合並各級分類器成為最終的xml文件。一般這兩個程序都能在opencv的工程文件裏找到,請善用ctrl+F。若沒有,則請到https://en.pudn.com/downloads204/sourcecode/graph/texture_mapping/detail958471_en.html 中下載opencv_haartraining.exe以及相應dll庫,到https://mail.pudn.com/downloads554/sourcecode/graph/detail2285048.html 中下載haarconv.exe以及相應dll庫。必備的dll庫如下圖所示,為了方便你可以將exe以及dll都拷貝出來。目錄結構見結尾附圖

工具都準備好了,下麵進入正題:

1.訓練分類器

打開cmd,cd到當前目錄,運行命令:

1
opencv_haartraining.exe -data ./cascade -vec ./pos/sample_pos.vec -bg ./neg/sample_neg.dat</span> -npos 20 -nneg 60 -mem 200 -mode ALL -w 20 -h 20

參數說明,這個要好好看,出錯了好調試

複製代碼
-data 指定生成的文件目錄, 
-vec vec文件名, 
-bg 負樣本描述文件名稱,也就是負樣本的說明文件(.dat) 
-nstage 20 指定訓練層數,推薦15~20,層數越高,耗時越長。
-nsplits 分裂子節點數目,選取默認值 2 
-minhitrate 最小命中率,即訓練目標準確度。
-maxfalsealarm最大虛警(誤檢率),每一層訓練到這個值小於0.5時訓練結束,進入下一層訓練,
-npos 在每個階段用來訓練的正樣本數目,
-nneg每個階段用來訓練的負樣本數目 這個值可以設置大於真正的負樣本圖像數目,程序可以自動從負樣本圖像中切割出和正樣本大小一致的,這個參數一半設置為正樣本數目的1~3倍 -w -h樣本尺寸,與前麵對應 -mem 程序可使用的內存,這個設置為256即可,實際運行時根本就不怎麼耗內存,以MB為單位 -mode ALL指定haar特征的種類,BASIC僅僅使用垂直特征,ALL表示使用垂直以及45度旋轉特征

-sym或者-nonsym,後麵不用跟其他參數,用於指定目標對象是否垂直對稱,若你的對象是垂直對稱的,比如臉,則垂直對稱有利於提高訓練速度
複製代碼

其中要注意,負樣本使用的是.dat文件,而不是.vec文件。訓練結束後會在cascade目錄下生成0-N的子目錄。訓練過程如下圖,我的正樣本20,負樣本60,小試牛刀,畢竟數據量有限。

 

想讓自己更強大,就應該知道這張圖裏麵一些參數的意思。

1
2
3
4
5
6
7
BACKGROUNG PROCESSING TIME 是負樣本切割時間,一般會占用很長的時間
N 為訓練層數
%SMP 樣本占總樣本個數
ST.THR 閾值,
HR 擊中率,
FA 虛警,隻有當每一層訓練的FA低於你的命令中聲明的maxfalsealarm數值才會進入下一層訓練
EXP.ERR 經驗錯誤率

 

2.合並子分類器生成xml文件

輸入命令:

1
haarconv.exe ./cascade haar_adaboost.xml 25 25

若你使用的是convert_cascade.exe則是另外一種格式:

1
convert_cascade.exe --size="20x20" ..\cascade haar_adaboost.xml

想知道用法可以輸入xxx.exe  usage,用法以及參數說明一目了然

 

3.總結以及注意事項

看起來很簡單是不是,你錯了!真正做起來會有各種各樣的錯誤發生讓你措手不及。以下是我總結的問題及分析:

1)訓練時間非常久,少則秒鍾,多則幾天甚至一禮拜。具體的時間跟你樣本的選取、樣本數量、機器的性能有著直接聯係。舉個例子,有人正樣本7097負樣本2830,在8核3.2Ghz的機器上,開啟了多核並行加速(MP)的情況下訓練了一周時間,跑到19層。鏈接https://blog.csdn.net/liulina603/article/details/8197889 。這個真心有點久了,有點誇張。舉這個例子是想跟你說明,這是一件耗時間的事情,所以請你耐心等待。

2)卡死在某一層,好像進入死循環。這種情況一般跟樣本的選擇有關,尤其是負樣本。當剩下所有的negtive樣本在臨時的cascade Classifier中evaluate的結果都是0(也就是拒絕了),隨機取樣本的數目到幾百萬都是找不到誤檢測的neg樣本了,因而沒法跳出循環!

解決方法是,增大負樣本數目,增大負樣本之間的變化!

3)訓練帶某一層出錯,報錯提示下圖。查看cascade目錄下發現確實走到第5層。這種情況跟上一種情況其實有點類似,都是opencv_haartraining.exe無法正常terminate。而我們的關注點在於,所生成的這些子分類器能用嗎?要依實際情況而定。拿下圖來說,在第5層的時候FA已經很低了,0.125000,說明效果已經夠用。2)中也是這個道理。

 

 

That`s all.




【原】訓練自己haar-like特征分類器並識別物體(2)


最後更新:2017-04-03 05:40:07

  上一篇:go 判斷用戶是否開啟了定位功能
  下一篇:go 加密解密