OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别
上一篇文章中介紹了如何使用OpenCV自帶的haar分類器進行人臉識別(點我打開)。
這次我試著自己去訓練一個haar分類器,前后花了兩天,最后總算是訓練完了。不過效果并不是特別理想,由于我是在自己的筆記本上進行訓練,為減少訓練時間我的樣本量不是很大,最后也只是勉強看看效果了。網上有關的資料和博客可以說很多了,只要耐心點總是能成功的。
采集樣本:
首先要訓練,就得有訓練集。網上有很多國外高校開源的庫可供下載:
1、卡耐基梅隆大學圖像數據庫(點我打開)
2、MIT人臉數據庫(點我打開)
3、ORL人臉數據庫(點我打開)
由于是國外的網站,可能需要翻墻,所以下載可能會有些麻煩。這里給出了我在網上收集的訓練集,正樣本為20*20的人臉圖片,負樣本為50*50的背景圖片。樣本集下載地址:http://download.csdn.net/detail/hongbin_xu/9887672。
準備工作:
在指定目錄中放入以下所提到的文件夾及文件。
將正樣本放在pos文件夾中,負樣本放在neg文件夾中,xml文件夾存放后面訓練過程中產生的數據模型,最后opencv會將其轉換生成一個xml文件,也就是最終的分類器。
從OpenCv安裝目錄中查找出如下兩個exe可執行文件。
opencv_createsamples.exe:用于創建樣本描述文件,后綴名是.vec。專門為OpenCV訓練準備,只有正樣本需要,負樣本不需要。
opencv_haartraining.exe:是OpenCV自帶的一個工具,封裝了haar特征提取以及adaboost分類器訓練過程。
一般來說,正負樣本數目比例在1:3的時候訓練結果比較好,但是不是絕對。由于每個樣本的差異性不同等因素,所以沒有絕對的比例關系。但是負樣本需要比正樣本多,因為原則上說負樣本的多樣性越大越好,我們才能有效降低誤檢率,而不僅僅是通過正樣本的訓練讓其能識別物體。為了節約時間,我選了1500個正樣本和4500個負樣本。
獲取樣本路徑列表:
打開Windows下的命令行窗口,進入指定目錄下。
1、建立正樣本的描述文件:
首先進入pos文件夾中,輸入:
在當前pos目錄下生成一個pos.txt記錄所有圖片的名稱。
打開記事本,去除pos.txt最后一行的pos文件夾;
將所有jpg替換成 jpg 1 0 0 20 20。這里1表示當前圖片重復出現的次數是1, 0 0 20 20表示目標圖片大小是矩形框從(0,0)到(20,20)。
2、建立負樣本的描述文件:
接下來重新進入neg文件夾,輸入:
之后,生成neg.txt文件,這里負樣本不做其他修改。
3、使用opencv_createsamples.exe建立訓練需要的參數列表:
Windows控制臺進入指定目錄下,我們之前已經在目錄下放了opencv_createsamples.exe文件,在控制臺下輸入opencv_createsamples.exe可以得到各參數信息:
在當前目錄下輸入如下指令:
當前目錄下,產生了pos.vec文件。
簡要介紹指令:
-vec pos.vec:指定生成的文件,最終生成的就是pos.vec;
-info pos\pos.txt:目標圖片描述文件,在pos\pos.txt;
-bg neg\neg.txt:背景圖片描述文件,在neg\neg.txt;
-w 20:輸出樣本的寬度,20;
-h 20:輸出樣本的高度,20;
-num 1500:要產生的正樣本數量,1500;
訓練模型:
Windows控制臺進入指定目錄下,我們之前已經在目錄下放了opencv_haartraining.exe文件,在控制臺下輸入opencv_haartraining.exe可以得到各參數信息:
輸入如下指令進行訓練:
簡要介紹指令:
-vec pos.vec:正樣本文件名;
-bg neg\neg.txt:背景描述文件;
-data xml:指定存放訓練好的分類器的路徑名,也就是前面建立的xml文件夾;
-w 20:樣本圖片寬度,20;
-h 20:樣本圖片高度,20;
-mem 1024:提供的以MB為單位的內存,很明顯,這個值越大,提供的內存越多,運算也越快;
-npos 1000:取1000個正樣本,小于總正樣本數;
-neg 3000:取3000個負樣本,小于總負樣本數;
-nstages 2:指定訓練層數,層數越高耗時越長;
-nsplits 5:分裂子節點數目, 默認值 為2;
其他參數:
-minhitrate:最小命中率,即訓練目標準確度;
-maxfalsealarm:最大虛警(誤檢率),每一層訓練到這個值小于0.5時訓練結束,進入下一層訓練;
-sym或者-nonsym:臉是否垂直對稱,若是,則選前者,且可以加快訓練速度。
輸入指令之后就是等待了,最后可以看到結果如下:
這里我的層數太少了,導致訓練結果不是很好,一般要增加到15~20層才能有較好的效果。
中間可能遇到的問題:
可能在訓練的過程中,過了很長時間但是卻一直停留在某一層不動,上網查找解決辦法如下:增大負樣本數目,增大負樣本之間的變化! 增加負樣本,然后重新接著訓練,注意更改負樣本的數目。
詳細說明可以查看:http://blog.csdn.net/jimeshui/article/details/42039615
參考鏈接:
1.http://blog.csdn.net/yangleo1987/article/details/52883864
2.http://blog.csdn.net/u014365862/article/details/52997019
總結
以上是生活随笔為你收集整理的OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习记录(一):使用haar
- 下一篇: Zedboard学习(二):zedboa