如何使用OpenCV中的AdBoost算法訓練分類器
首先,需要說明的是,OpenCV自帶的haar training提取的特征是haar特征 分類器是AdaBoost級聯分類器(如需了解Adaboost算法, 。所謂的級聯分類器,就是將若干的簡單的分量分類器(可以理解為一般的普通分類器)依次串聯起來,最終的檢測分類結果,要依次通過所有的分量分類器才能算是一個有效的檢測分類結果。否則,就認為當前檢測區域內沒有我們需要找的目標。
利用OpenCV自帶的haar training程序訓練一個分類器,需要經過以下幾個步驟:
(1)收集訓練樣本:
訓練樣本包括正樣本和負樣本。正樣本,通俗點說,就是圖片中只有你需要的目標。而負樣本的圖片只要其中不含有目標就可以了。但需要說明的是,負樣本也并非隨便選取的。例如,你需要檢測的目標是汽車,那么正樣本就應該是僅僅含有汽車的圖片,而負樣本顯然不能是一些包含天空的,海洋的,風景的圖片。因為你最終訓練分類器的目的是檢測汽車,而汽車應該出現在馬路上。也就是說,分類器最終檢測的圖片應該是那些包含馬路,交通標志,建筑物,廣告牌,汽車,摩托車,三輪車,行人,自行車等在內的圖片。很明顯,這里的負樣本應該是包含摩托車、三輪車、自行車、行人、路面、灌木叢、花草、交通標志、廣告牌等。
另外,需要提醒的是,adaboost方法也是機器學習中的一個經典算法,而機器學習算法的前提條件是,測試樣本和訓練樣本獨立同分布。所謂的獨立同分布,可以簡單理解為:訓練樣本要和最終的應用場合非常接近或者一致。否則,基于機器學習的算法并不能保證算法的有效性。此外,足夠的訓練樣本(至少得幾千張正樣本、幾千張負樣本)也是保證訓練算法有效性的一個前提條件。
這里,假設所有的正樣本都放在f:/pos文件夾下,所有的負樣本都放在f:/neg文件夾下;
(2)對所有的正樣本進行尺寸歸一化:
上一步收集到的正樣本,有很多的尺寸大小,有的是200*300,有的是500*800...尺寸歸一化的目的,就是把所有的圖片都縮放到同一大小。比如,都縮放到50*60的大小。
(3)生成正樣本描述文件:
所謂的正樣本描述文件,其實就是一個文本文件,只不過,很多人喜歡將這個文件的后綴改成.dat而已。正樣本描述文件中的內容包括:文件名 目標個數 目標在圖片中的位置(x,y,width,height)
典型的正樣本描述文件如下所示:
0.jpg 1 0 0 30 40
1.jpg 1 0 0 30 40
2.jpg 1 0 0 30 40
.....
不難發現,正樣本描述文件中,每一個正樣本占一行,每一行以正樣本圖片開頭,后面緊跟著該圖片中正樣本的數量(通常為1),以及正樣本在圖片中的位置
假如,f:\pos文件夾下有5000個正樣本圖片,每個圖片中僅有一個目標。那么,我們可以寫程序(遍歷文件夾中的所有圖片文件,將文件名寫入到文件中,將正樣本在圖片中的位置,大小都寫入文件中)生成一個pos.dat文件作為正樣本描述文件。
如何使用opencv 訓練分類器以及訓練過程中的問題
網上提供的級聯分類器訓練都是基于opencv_haartraining。照著上面的步驟成功訓練出了xml,但是用于識別的過程中,識別率很低。改換幾次樣本后,檢測效果還是一般。想想估計是自haar特征不能很好區分,所以想通過opencv_traincascade訓練下Lbp。將經驗寫下來,供自己以后回顧和其它人參考。 工具/原料 opencv2.1 (2.0版本以上均可) 方法/步驟 1 準備好正負樣本圖片,正樣本就是含有目標的圖片,負樣本就是不還有目標的圖片,建好文件夾,如圖所示。其中正樣本圖片最好是裁剪成同一尺寸,我這里是建成30*30,便于后期的說明文件的建立。圖片的編輯我使用的是美圖看看,批量編輯工具,可以批量將圖片改成同一尺寸。 2 建立正負樣本說明文件,在cmd下進入pos文件夾目錄里,輸入 dir /b > pos.txt,用editplus打開該文件,刪除最后一行,最后將名字歸一化如下所示:同樣的方法進入neg文件夾內,用同樣的方法建立描述文件neg.txt,用editplus打開該文件,只需刪掉最后一行 3 創建vec文件:將opencv_createsamples.exe和 opencv_traincascade.exe放到圖片文件夾的上層目錄,利用opencv_createsamples.exe應用程序在該目錄下使用如圖cmd命令: 其中的-vec是指定后面輸出vec文件的文件名,-info指定正樣本描述文件,-bg指定負樣本描述文件,-w和-h分別指正樣本的寬和高,-num表示正樣本的個數。執行完該命令后就會在當前目錄下生產一個pos.vec文件了。 4 使用opencv_traincascade.exe文件進行訓練 首先在當前目錄下新建一個dt文件夾用于存放生成的.xml文件。 在當前目錄使用cmd命令: D:\>opencv_traincascade.exe -data dt -vec pos.vec -bg neg/neg.txt -numPos 100 -n umNeg 300 -numStages 16 -precalcValbufSize 200 -precalcdxBufSize 1000 -featureTy pe LBP -w 30 -h 30截圖如下:其中-data 輸出目錄,-numPos正樣本數目-numNeg負樣本數目-numStages訓練級數