目錄結構
E:\Adaboost\
---------positive\ //正樣本文件夾
---------pimages\ //正樣本圖片所在文件夾
---------pos.dat //正樣本集描述文件
---------pos.vec //正樣本特徵集描述文件
---------nagative\ //負樣本文件夾
---------pimages\ //負樣本圖片所在文件夾
---------nag.dat //正樣本集描述文件
正樣本
1 收集樣本
找617張帶有車牌的圖片,一開始設置大小 200*200 左右,報內存錯誤。
後來重做,即將617張圖片中的車牌用畫圖軟件截取下來,重新設置大小爲60*17,並保存爲bmp文件。
我這人比較懶,617張車牌的照片?其實還是不容易找的。我是這樣做的:
1.1 先收集類似圖片
運用 網頁圖片保存能手 這個軟件批量下載圖片(這個軟件找的好辛苦,試過其它的有的收費有的基本不能用)我在百度圖片搜的關鍵詞有 “車牌” “車牌號” “蘇州車牌” “江蘇車牌” 等等,獲取了近7000張的圖片
1.2 利用以前寫的小軟件截取車牌
運用自己以前寫的小程序:車牌圖片截取軟件(運用opencv基於紋理檢測車牌,由於效果不太好,姑且用來爲adboost提供輔助收集車牌圖片),設置好樣本圖片所在的輸入路徑,在設置好車牌輸出路徑,運行即可得到 60*17 大小的bmp圖片
下載地址: http://download.csdn.net/detail/mkr127/5374301
PS由於效果不怎麼好嗎,所以在出來的圖片中你得刪掉無用的圖片,於是,幾千張的圖片我只收集到了617張車牌圖片,哈哈,很麻煩的。
BUG這個小軟件有bug,我懶得改,即圖片太大如5400*2700有時會出錯,還有每次運行的圖片不要太多,不然會出錯,將圖片 2000張一組就沒有問題。
當然,如果你不喜歡,可以自己手動截取。
1.3 將得到的617張正樣本圖片放在E:\Adaboost\positive\pimages\文件夾中
1.4 負樣本圖片
即不包含車牌的圖片,我收集了幾千張,用matlab 批量格式化爲 200*200大小的bmp圖片,放在E:\Adaboost\nagative\pimages\文件夾內
2 創建正負樣本描述文件
2.1 正樣本描述文件
cd E:\Adaboost\positive
dir pimages /b > pos.dat
a: 將jpg 替換爲 jpg 1 0 0 60 17
b: 選擇所有,tab鍵,將tab 替換爲圖片所在路徑
得:
2.1 負樣本描述文件
cd E:\Adaboost\nagative
dir pimages /b > nag.dat
選擇所有,tab鍵,將tab 替換爲圖片所在路徑
得
3 設置環境變量
添加Opencv庫中opencv_createsamples的環境變量,以便於在cmd中執行,在path中最後添加 ;C:\OpenCV\opencv\install\bin
4 創建正樣本特徵集描述文件
打開cmd,進入positive所在文件夾
cd E:\Adaboost\positive
opencv_createsamples -vec pos.vec -info pos.dat -num 617 -w 60 -h 17
//-num 正樣本數量 -w圖像寬 -h高
如下圖所示
在E:\Adaboost\positive下生成pos.vec文件,即正樣本特徵集描述文件。
5 開始訓練
cd E:\Adaboost\nagative
opencv_haartraining -data trainout -vec e:\Adaboost\positive\pos.vec -bg nag.dat -npos 317 -nneg 300 -mem 40000 -mode ALL -w 60 -h 17
//-mem分配的內存大小 -w正樣本寬 -h正樣本高
//-npos正樣本數量,-nneg 負樣本數量,至於爲什麼是這個值,最後將有分析。
6 遇到的錯誤
6.1 內存不夠的錯誤
那是因爲正樣本圖片太大了,我改爲60*17就正常了
6.2 OpenCV Error: Assertion failed (elements_read == 1)
原因:-nneg -npos 參數出錯參考:
http://bbs.csdn.net/topics/390388465
http://askbot.alekcac.webfactional.com/question/3085/why-always-opencv-error-assertion-failed-elements_read-1-in-unknown-function/
我英文不太好 - -!初步分析認爲:
假如我有正樣本總數 617 ,npos(正樣本參數設置的大小,待定);負樣本數 nneg 待定(我原有3000張左右), nstages 12
617 >= npos + (12-1)*0.001*npos +nneg
那麼假如分配 nneg=300,則npos<= (617-300)/1.011 = 317
6.3 再次測試
opencv_haartraining -data trainout -vec e:\Adaboost\positive\pos.vec -bg nag.dat -npos 317 -nneg 300 -mem 40000 -mode ALL -w 60 -h 17
問題搞定,我沒有設置-nstages=12 也沒錯,額,待進一步研究。
結果
跑到第四層的時候,跑了一天兩夜,仍然是第4階!哥不淡定了,查查估計是死循環了,網上說適當增加負樣本,
那麼我在控制檯中 Ctrl + C, 注意,是可以斷開的,以前我一直不敢...原來在執行訓練的話會自動加載 以前訓練的級,估計這就是級聯吧,都是自己摸索的,純粹的供大家參考,有不到之處盡請諒解。
我將負樣本增至600
opencv_haartraining -data trainout -vec e:\Adaboost\positive\pos.vec -bg nag.dat -npos 317 -nneg 600-mem 40000 -mode ALL -w 60 -h 17
這時候在很短的時間內跑到了第10階。進一步探究中。
接上
請注意,要確保 nag.dat 裏面的數據大於600行,因爲上一步執行到第10層時停止不動了
就停在這裏,於是我找到 nag.dat(負樣本描述文件)發現裏面的數據只有300行,怪不得,於是我追加打到1269行,此時我再執行
E:\Adaboost\nagative>opencv_haartraining -data trainout -vec e:\Adaboost\positive\pos.vec -bg nag.dat -npos 317 -nneg 900 -mem 40000 -mode ALL -w 60 -h 17
繼續向下訓練
截圖爲證
報一下我的數據,pos.dat =617行, pimages =617張 , nag.dat= 1269行 , nimages= 1269張
trainout 訓練到第十層
繼續向下探索,由於我對着個完全沒有經驗,如果大家覺得太過幼稚簡單,可以移步,呵呵,純當給像我這樣的一無所知之人一個借鑑。
僅此而已。
訓練結束
得到 分類器:
這時我在增大負樣本數到1269 發現到13級就訓練結束了,和負樣本數爲900的沒有區別,並且 E:\Adaboost\nagative\trainout.xml 自動更新覆蓋爲最新版,這下我就不用擔心以前的成果白費了,當然,最好做個備份,E:\Adaboost\nagative\trainout 這裏面的數據不要刪,以後增加正負樣本的數量的話我估計會自動累加,呵呵。
接下來開始測試:利用之前寫的人臉檢測代碼,將分類器改成我們測試的分類器,一切就容易起來!
實驗的結果還是挺差的,估計是樣本太少了,我的正樣本才600多,專業的最少都7-8000,也有可能是我的正樣本圖截的不好,用軟件截的,沒有手工的準確,再者就是網上的圖片不行,真正好的樣本還是比較少的。
測試結果:
接下來就是增加樣本數量,最後還不好的話,就增大樣本質量,哈哈!
如果以後有經歷,就寫個MFC通用的提取分類器的小程序,用來測試分類器的性能。
本人寫的通用小項目下載地址:可以提取分類器進行檢測,大家必須配置好OpenCV環境和在源碼中設置好分類器的路徑。
http://download.csdn.net/detail/mkr127/5397219
項目用到的正樣本訓練庫,額,分有點高,畢竟是本人從幾千張圖片中一張一張篩選出來的...算是我的辛苦費吧,勿噴我......
http://download.csdn.net/detail/mkr127/5418861
60-17像素bmp車牌 共617張。
7 參考文章
基於Adaboost算法的車牌檢測在OpenCV上的研究與實現.pdf
作者:鄧育林
http://wenku.baidu.com/view/5a3f464433687e21af45a971.html轉載請註明出處!