opencv haar+adaboost使用心得
最近在使用opencv裏的haar+adaboost做檢測,其實早在一年前的無錫已經看過用它做車徽檢測,然後再做識別(大眾,奔馳...)。這次終於要自己動手做了,網上有很多這方麵的資料,感謝大家分享他們的經驗。重複的東西這裏就不再贅述了,隻簡單的補充幾個大家容易疏忽的東西。
step1.首先是準備正負樣本,正樣本好說,打了標簽,解析xml文件,然後做點小旋轉就可以用了
負樣本就複雜了,第一點要求是不能包含正樣本,在我的應用場景中還需要盡可能多的提供場景的背景圖,而不是網上所說的從網絡上找一些不相幹的圖像,這些圖像加進來促進作用也不大,因為我的場景中根本不會出現它們,但也不會出現負作用。第二是負樣本數目盡可能的多,但這個還是量力而行吧,畢竟純體力活,沒多大的樂趣在裏麵。補充一句,樣本的目錄結構很簡單,隻要包含pos和neg兩個子文件夾和opencv_haartraining.exe,
opencv_createsamples.exe,convert_cascade.exe等幾個可執行程序,比如face-->face\train face\test
step2.生成正負樣本描述文件,描述文件保存在face目錄下與train test平級,命令如下:
打開cmd 分別cd 到正負樣本目錄
cd negdir
dir /b > negative.data
cd posdir
dir /b > positive.data
生成的描述文件當然還要替換才能夠最終使用 對於positive.data隻要在最後把jpg ->jpg 1 0 0 20 20,這裏注意最好是在word下麵替換好,再拷到txt下,速度快些,1 0 0 20 20的意思是這幅圖片包含一個正樣本目標,矩形區域為 0 0 20 20這裏由於我們的正樣本隻有一個目標,而且已經大小歸一化為20x20的圖像,所以這裏參數這麼定義,而且opencv的坐標是從0開始的,我開始想過是不是要寫成 0 0 19 19,本來看過網上一篇文章錯寫成1 1 20 20也沒出錯。正負樣本的.data文件都要做的一件事是:打開.data文件,替換掉不是圖片的行,比如positive.data negative.data.對於正樣本,由於大小一致,為了避免過多的IO操作,可以生成vec文件,cd 到face目錄 直接cd ..即可 然後輸入命令:
opencv_createsamples.exe -info "pos/positive.data" -vec pos.vec -num 7097 -w 20 -h 20
其中-num指定你的正樣本數目 -w 圖像寬度,-h圖像高度 生成描述文件
step3:經過上一步,準備工作已經做好,可以開始運行訓練了,輸入命令:
opencv_haartraining.exe -data haarcascade7097 -vec pos7097.vec -bg neg/negative.data -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7097 -nneg 7097 -w 20 -h 20 -mem 1024 -mode ALL
解釋下各個參數的含義 -data 指定生成的文件目錄, -vec vec文件名, -bg 負樣本描述文件路徑, -nstage 20 指定訓練層數,推薦15~20,層數越高,耗時越長。-nsplits 分裂子節點數目,選取默認值 2 -minhitrate 最小命中率,即訓練目標準確度。-maxfalsealarm最大虛警(誤檢率),每一層訓練到這個值小於0.5時訓練結束,進入下一層訓練,-npos 正樣本數目,-nneg 負樣本數目 這個值可以設置大於真正的負樣本圖像數目,程序可以自動從負樣本圖像中切割出和正樣本大小一致的 -nneg張圖 這個參數一半設置為正樣本數目的1~3倍, -w -h意思很明確, -mem 程序可使用的內存,這個設置為256即可,實際運行時根本就不怎麼耗內存。 -mode ALL指定haar特征的類型數目
step3:然後就是等待了 ,我用上麵的代碼,負樣本數目為2830,訓練了一周,當然如果實在等不住了,中間結果也可以生成xml文件,命令如下:
/*轉換為xml*/
convert_cascade.exe --size="20x20" ..\cascade ..\cascade.xml
ps:還有一個小建議:大家最好自己編譯opencv,這樣就可以vs--->project-->properties-->c++-->language-->OpenMp support 開啟openmp選項,編譯出來的exe就是多核並行的,提升速度很重要,我上麵說的一周就是openmp加速在8核,3.2Ghz的服務器上跑的。
用別人的總有一天要還,想要最快,不會出錯,最好自己寫 haar+ adaboost ,這樣選取負樣本(最耗時的部分)的程序也可以並行加速了。waiting for me
最後添加幾幅運行時圖片:
這個是我跑到19層的結果,其中BACKGROUNG PROCESSING TIME 是負樣本切割時間 很長很長
N 為訓練層數 %SMP 樣本占總樣本個數 ST.THR 閾值,HR 擊中率, FA 虛警 EXP.ERR 經驗錯誤率
這個是指定的haarcasade7079 文件中生成的每一層文件的文件夾
文件和文件中的內容,然後使用
convert_cascade.exe --size="20x20" ..\cascade ..\cascade.xml就可以生成xml文件
祝大家玩的開心 有問題可以發信到gjtjx@163.com,隻回複本文所包含的問題,
其他問題可以參看Opencv自帶的doc 中haar訓練的問題FAQ,還是參看英文原版的東西
節約時間.
最後更新:2017-04-03 05:40:06
上一篇:
win9x_win2k下對物理磁盤的操作
下一篇:
皮膚檢測算法三種,示例與代碼
阿裏大航杯AI電力大賽比賽分享及數加平台,機器學習pai使用經驗
Android開發7——android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1
MySQL運維實戰(一)之 係統變量潛規則
殺人遊戲web(on Github)
天貓美的簽200億大單 攜手探索物聯網時代
停止啟用了安全性的WAS Server而不手動輸入密碼之第二種選擇
jQuery對select的基本操作
java springmvc mybaits maven shiro 多數據源 後台框架源碼bootstrap
Mysql Connector 5.1 好用的新特性
2017最新鑫眾棋牌源碼:含最新版遊戲大廳+手機版網站+手機端大廳+代理係統+超強後台