1.正樣本文件采集:
需要使用到的工具:objectmarker
用於待識別對象的標注,並生成標注文件。需要注意的是,生成完標注文件之后(通常是info.txt文件),用編輯器打開文件,將所有路徑信息刪除,只保留文件名和其對應的標注信息,修改完成之后,將文件保存為sample_pos.dat(注意,文件名字不要改變,否則以后會很坑,這個具體還沒去研究源碼,應該是程序的問題);
ps:如果已經有了圖像的標注信息,那就可以跳過這一步了。
2.正樣本vec文件生成(sample文件)
工具:opencv_createsamples.exe
在工具所在目錄創建文件夾:pos,將采集到的正樣本,以及標注文件放入pos文件夾;
使用cmd進入工具所在目錄,執行命令:
opencv_createsamples.exe -info ./pos/sample_pos.dat -vec ./pos/sample_pos.vec -num 17 -w 20 -h 20 -show YES
ps:-num:正樣本個數
3.負樣本采集
建議正負樣本比例在1:3(具體還不知道,參考網上提供的數據)。負樣本在采集的時候尤其需要注意,盡量保持和正樣本環境相似,比如,正樣本圖像中包含要檢測的對象,負樣本圖像中最好剔除要檢測的對象,只保留背景。有條件的同學可以直接寫程序,對負樣本圖片進行切割,標准是40*40(因為我們的正樣本采用的是20*20)。
負樣本采集完成之后,在pos目錄的統計目錄創建文件夾:neg,將負樣本拷貝至neg目錄,然后使用命令行進入neg目錄,執行命令:
dir /b > sample_neg.dat
用文本編輯器打開dat文件,刪除最后一行:sample_neg.dat,保存文件;
ps:文件名字不要改變,否則會出錯
4.訓練樣本
到此為止,我們要准備的文件都已經准備好,可以進行訓練了。
使用的工具:opencv_haartraining.exe
進入工具所在目錄,先創建目錄:cascade,然后執行命令:
opencv_haartraining.exe -data ./cascade -vec ./pos/sample_pos.vec -bg ./neg/sample_neg.dat -nstage 20 -npos 100 -nneg 300 -mem 256 -mode ALL -w 20 -h 20
-nstage:要訓練多少層
-npos:每層的正樣本個數
-nneg:每層的負樣本個數
ps:在這一步經常會拋異常,通常都是負樣本文件不對,同時dat文件的名字一定要按照上面說的命名,否則會出錯;
5.合並xml文件
樣本訓練完成之后,cascade目錄下會生成多個子目錄,需要將這些目錄合並生成xml文件才能使用:
工具:c-example-convert_cascade.exe(ps:根據opencv的版本不同,這個工具的名字也可能不同)
執行命令:
c-example-convert_cascade.exe --size=20x20 ./cascade haar_adaboost.xml
到此,會在目錄中生成haar_adaboost.xml文件!
done!
說明:
1.所有的工具及其依賴文件建議統一放置在一個目錄中(比如:build);
2.除了負樣本描述文件的生成命令需要在neg目錄中執行,其他命令全部在build(假設你也有這個目錄,以各自的實際目錄為准)目錄中執行;
3.good luck!
參考:
1.http://www.cnblogs.com/wengzilin/p/3845271.html
2.http://blog.csdn.net/xuejiren/article/details/39493537
(Opencv Error: Assertion failed (elements_read==1))