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