【MFC基礎入門】基於Adaboost算法的車牌檢測在OpenCV上的研究與實現

目錄結構

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

運用文本編輯軟件對生成的文件 pos.dat 進行替換修改:
a: 將jpg 替換爲 jpg 1 0 0 60 17
b: 選擇所有,tab鍵,將tab 替換爲圖片所在路徑
得:


2.1 負樣本描述文件

cd E:\Adaboost\nagative
dir pimages /b > nag.dat

運用文本編輯軟件對生成的文件 pos.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

轉載請註明出處!



發佈了49 篇原創文章 · 獲贊 220 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章