opencv学习笔记——自己训练人脸识别分类器
???????在使用opencv自帶的分類器haarcascade_frontalface_alt.xml進(jìn)行人臉識(shí)別的基礎(chǔ)認(rèn)識(shí)后,決定自己訓(xùn)練一個(gè)分類器看一下效果。該過程大致可分為三個(gè)階段:樣本采集、分類器訓(xùn)練和運(yùn)用訓(xùn)練好的分類器進(jìn)行人臉檢測(cè)。
1、樣本的采集
????? ?在訓(xùn)練前,我們需要進(jìn)行正樣本及負(fù)樣本的采集。
????? ?正樣本采用的是ORL人臉數(shù)據(jù)庫中的部分圖像,本次共選用63張圖像,初始圖像大小為92*112,但在訓(xùn)練時(shí)出現(xiàn)了內(nèi)存不足的問題,因此將其尺寸歸一化為20*20。部分截圖如下:
???????負(fù)樣本采用的是weizmann團(tuán)隊(duì)http://www.wisdom.weizmann.ac.il/~vision/Seg_Evaluation_DB/dl.html 網(wǎng)站上的圖像分割數(shù)據(jù)庫里面的灰色圖像,總共200幅圖片,大小大約在300*200像素,截圖如下所示:
???????圖像采集完畢后,將其分別放在兩個(gè)文件夾pos_img(正樣本)和neg_img(負(fù)樣本)下。再新建一個(gè)xml文件夾,xml文件夾存放后面訓(xùn)練過程中產(chǎn)生的數(shù)據(jù)模型,最后opencv會(huì)將其轉(zhuǎn)換生成一個(gè)xml文件,也就是最終的分類器。
???????然后,從OpenCv安裝目錄中查找出如下兩個(gè)exe可執(zhí)行文件:
opencv_createsamples.exe:用于創(chuàng)建樣本描述文件,后綴名是.vec。專門為OpenCV訓(xùn)練準(zhǔn)備,只有正樣本需要,負(fù)樣本不需要。?
opencv_haartraining.exe:是OpenCV自帶的一個(gè)工具,封裝了haar特征提取以及adaboost分類器訓(xùn)練過程。?
???????一般來說,正負(fù)樣本數(shù)目比例為1:3時(shí)訓(xùn)練結(jié)果較好,但是不是絕對(duì)。由于每個(gè)樣本的差異性不同等因素,所以沒有絕對(duì)的比例關(guān)系。但是負(fù)樣本需要比正樣本多,因?yàn)樵瓌t上說負(fù)樣本的多樣性越大越好,我們才能有效降低誤檢率,而不僅僅是通過正樣本的訓(xùn)練讓其能識(shí)別物體。在本次訓(xùn)練中,我選擇了63個(gè)正樣本和200個(gè)負(fù)樣本,均為灰度圖像。
???????樣本準(zhǔn)備完畢后,打開Windows下的命令行窗口cmd,進(jìn)入指定目錄下。
在當(dāng)前pos_img目錄下生成一個(gè)pos.txt記錄所有圖片的名稱。?
打開該txt文件,將pos.txt去掉,并將pgm 改為pgm 1 0 0 20 20。
這里1表示當(dāng)前圖片重復(fù)出現(xiàn)的次數(shù)是1, 0 0 20 20表示目標(biāo)圖片大小是矩形框從(0,0)到(20,20)。?
同理,進(jìn)入neg_img目錄,生成neg.txt,然后打開文件去掉neg.txt,其余不做改動(dòng)。
結(jié)束后將pos.txt和neg.txt拷出,與opencv_createsamples.exe文件放在一個(gè)目錄下:
2、使用opencv_createsamples.exe建立訓(xùn)練需要的參數(shù)列表
???????Windows控制臺(tái)進(jìn)入指定目錄下,我們之前已經(jīng)在目錄下放了opencv_createsamples.exe文件,在控制臺(tái)下輸入opencv_createsamples.exe可以得到各參數(shù)信息:?
在命令行窗口輸入:
則在當(dāng)前目錄下,產(chǎn)生一個(gè)pos.vec文件。
指令介紹:
-vec pos.vec:指定生成的文件,最終生成的就是pos.vec;?
-info pos_img\pos.txt:目標(biāo)圖片描述文件,在pos\pos.txt;?
-bg neg_img\neg.txt:背景圖片描述文件,在neg\neg.txt;?
-w 20:輸出樣本的寬度,20;?
-h 20:輸出樣本的高度,20;?
-num 63:要產(chǎn)生的正樣本數(shù)量,63;
3、訓(xùn)練模型
???????Windows控制臺(tái)進(jìn)入指定目錄下,我們之前已經(jīng)在目錄下放了opencv_haartraining.exe文件,在控制臺(tái)下輸入opencv_haartraining.exe可以得到各參數(shù)信息:?
然后輸入指令進(jìn)行訓(xùn)練:
指令介紹:
-vec pos.vec:正樣本文件名;?
-bg neg_img\neg.txt:背景描述文件;?
-data xml:指定存放訓(xùn)練好的分類器的路徑名,也就是前面建立的xml文件夾;?
-w 20:樣本圖片寬度,20;?
-h 20:樣本圖片高度,20;?
-mem 1024:提供的以MB為單位的內(nèi)存,很明顯,這個(gè)值越大,提供的內(nèi)存越多,運(yùn)算也越快;?
-npos 45:取45個(gè)正樣本,小于總正樣本數(shù);?
-neg 180:取180個(gè)負(fù)樣本,小于總負(fù)樣本數(shù);?
-nstages 5:指定訓(xùn)練層數(shù),層數(shù)越高耗時(shí)越長(zhǎng);?
-nsplits 5:分裂子節(jié)點(diǎn)數(shù)目, 默認(rèn)值 為2;(本來設(shè)置為5 ,但訓(xùn)練時(shí)一直出差錯(cuò),改為默認(rèn)值后可正常訓(xùn)練)。
在這里-npos ?-neg 兩個(gè)參數(shù)若直接與正負(fù)樣本總數(shù)相同,則在訓(xùn)練過程中會(huì)出現(xiàn)錯(cuò)誤:訓(xùn)練中途,程序突然終止,提示"OpenCV Error: Assertion failed (elements_read == 1) in icvGetHaarTraininDataFromVecCallback, file ..\..\..\..\opencv\apps\haartraining\cvhaartraining.cpp, line 1861"。-npos的意思是每次訓(xùn)練從.vec文件中隨機(jī)選取npos個(gè)正樣本。由于存在虛警,在每一次訓(xùn)練一個(gè)強(qiáng)分類器之后,會(huì)把那些分類錯(cuò)誤的從整個(gè)樣本庫中剔除掉,總的樣本就剩下 CountVec = CountVec - (1 - minhitrate)* npos,在第二個(gè)強(qiáng)分類器的訓(xùn)練過程中就是從剩下的Countvec抽樣,一直這樣進(jìn)行nstage次,所以就有CountVec >= (npos + (nstages - 1)*(1 -minhitrate) * npos ) + nneg 。當(dāng)把npos設(shè)置與vec中總樣本數(shù)相同時(shí),第二個(gè)強(qiáng)分類器訓(xùn)練時(shí),必然就會(huì)報(bào)錯(cuò),提示樣本數(shù)不足。只要將取值改小即可。
接下來要做的就是等待訓(xùn)練結(jié)束:
訓(xùn)練過程參數(shù)解釋:
N:層數(shù) ?%
SMP:樣本的使用率?
F : +表示通過翻轉(zhuǎn),否則是-
ST.THR : 分類器的閾值?
HR:當(dāng)前分類器 對(duì)正樣本識(shí)別正確的概率
FA:當(dāng)前分類器 對(duì)負(fù)樣本識(shí)別錯(cuò)誤的概率
EXP.ERR : 分類器的期望錯(cuò)誤率
訓(xùn)練結(jié)束后會(huì)在根目錄下生成xml.xml文件,在xml文件夾下生成最終的分類器:
4、測(cè)試
????? ?用自己訓(xùn)練的分類器替換opencv自帶的分類器進(jìn)行人臉識(shí)別:
因?yàn)橛?xùn)練的樣本過少,分類器的層數(shù)也不多,分類效果并不好,還有待提高。
總結(jié)
以上是生活随笔為你收集整理的opencv学习笔记——自己训练人脸识别分类器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测度上Lebesgue积分的确定
- 下一篇: 最牛的SEO儿歌 SEO三字经