最近在做識(shí)別的過程中發(fā)現(xiàn)sift與surf的特征并不容易篩選,想找一下有沒有比較好篩選特征的方法,在檢索的過程中發(fā)現(xiàn)了基于haar特征的級(jí)聯(lián)adboost的方法篡九,這個(gè)方法能有效的篩選哪些是更好的haar特征拭卿。雖然暫時(shí)還沒有相處關(guān)聯(lián)的思路,但用這個(gè)可以做基于傳統(tǒng)方法的目標(biāo)識(shí)別充石,所以就在網(wǎng)上學(xué)習(xí)了一下怎么訓(xùn)練這個(gè)級(jí)聯(lián)分類器莫换。網(wǎng)上訓(xùn)練這個(gè)分類器基本上是基于opencv2中的open_haartraining.exe,這是一個(gè)封裝好了的訓(xùn)練算法骤铃,只要把文件格式弄好拉岁,參數(shù)輸入進(jìn)去,就可以訓(xùn)練出來(lái)級(jí)聯(lián)分類器了惰爬,但是我用的是opencv3喊暖,很苦惱,沒有這個(gè)open_haartraining.exe撕瞧,只有opencv_traincascade陵叽,索性就開始使用了(open_haartraining.exe只能訓(xùn)練haar特征的分類器,但是opencv_traincascade可訓(xùn)練多種特征的分類器丛版,比如haar巩掺,hog,lbp等等)页畦。
opencv_traincascade的原理暫時(shí)沒有詳細(xì)的探查過胖替,之后回來(lái)補(bǔ)上。接下來(lái)詳細(xì)的講一下整個(gè)級(jí)聯(lián)分類器的整個(gè)訓(xùn)練過程。
訓(xùn)練過程主要分為以下四步:
1.配置訓(xùn)練環(huán)境
2.制作訓(xùn)練數(shù)據(jù)集
3.生成正樣本描述文件(.vec文件)
4.訓(xùn)練樣本分類器
5.常見錯(cuò)誤
配置訓(xùn)練環(huán)境
opencv的源代碼是用c++寫的刊殉,但是提供了其他主流語(yǔ)言的接口殉摔,但是這個(gè)訓(xùn)練的過程需要調(diào)用opencv自帶的兩個(gè)可執(zhí)行程序open_createsample.exe和opencv_traincascade.exe來(lái)訓(xùn)練分類器里面的參數(shù),并保存在xml文件中记焊,這樣你的其他語(yǔ)言就可以調(diào)用了逸月。
首先需要找到open_createsample.exe和opencv_traincascade.exe這兩個(gè)程序在計(jì)算機(jī)中的位置,比如我的在C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin(如果找不到遍膜,在搜索欄直接搜索這兩個(gè)程序)
這是我這個(gè)地址里面的文件目錄碗硬,我只截取了很小一段內(nèi)容,其實(shí)還有很多dll文件和很多其他的文件瓢颅,但是我們現(xiàn)在不需要那些
xml:用于存放訓(xùn)練好的分類器的參數(shù)恩尾,這個(gè)文件夾不是自帶的,需要?jiǎng)?chuàng)建
negdata:存放負(fù)樣本的文件夾挽懦,這個(gè)文件不是自帶的翰意,需要?jiǎng)?chuàng)建
posdata:存放正樣本的文件夾,這個(gè)文件不是自帶的信柿,需要?jiǎng)?chuàng)建
negdata.txt:負(fù)樣本的文件路徑冀偶,這個(gè)文件不是自帶的,需要?jiǎng)?chuàng)建渔嚷,創(chuàng)建過程下面會(huì)提到
posdata24x16.txt:正樣本的文件路徑进鸠,這個(gè)文件不是自帶的,需要?jiǎng)?chuàng)建形病,創(chuàng)建過成下面會(huì)提到
posdata24x16.vec:生成的正樣本描述文件客年,這個(gè)文件不是自帶的,需要?jiǎng)?chuàng)建漠吻,創(chuàng)建過程下面會(huì)提到
opencv_createsamples.exe:生成正樣本描述文件的可執(zhí)行程序量瓜,這個(gè)是文opencv中自帶的
opencv_haartraining.exe:訓(xùn)練樣本的可執(zhí)行程序,這個(gè)也是opencv中自帶的
制作訓(xùn)練數(shù)據(jù)集
首先將要訓(xùn)練的正類樣本和負(fù)類樣本放入posdata這個(gè)文件夾中侥猩,這里的樣本圖片需要是灰度圖片榔至,且不要大于100*100。備注:負(fù)樣本的數(shù)量要大于正樣本的數(shù)量欺劳,我用的是正負(fù)樣本數(shù)量比為1:3,這個(gè)會(huì)影響大訓(xùn)練效果铅鲤,具體需要怎樣的比例需要自己把控划提,但負(fù)樣本過少會(huì)出現(xiàn)錯(cuò)誤。
接下來(lái)需要生成正負(fù)樣本的文件路徑邢享,使得訓(xùn)練中可以順利的找到每個(gè)樣本鹏往。先進(jìn)入正樣本目錄,新建一個(gè)txt文件骇塘,并在中輸入如下內(nèi)容
dir /b/s/p/w *.jpg > num.txt
然后關(guān)掉這個(gè)txt伊履,把這個(gè)txt的后綴名改為bat韩容,他會(huì)變成下面這個(gè)樣子
雙擊這個(gè)bat文件,會(huì)生成這樣一個(gè)txt文件
我們現(xiàn)在需要通過記事本的替換功能修改一下這個(gè)txt文件的內(nèi)容
替換好之后應(yīng)該是這個(gè)樣子
posdata是樣本的相對(duì)路徑唐瀑,最后的1 0 0 64 64群凶,最后兩位數(shù)代表你的樣本圖像的大小,需要根據(jù)自己的樣本圖片改寫哄辣,由于文件中指出的位置是相對(duì)路徑请梢,所以我們需要把這個(gè)txt文件放到與open_createsample.exe和opencv_traincascade.exe這兩個(gè)程序的同一級(jí)文件當(dāng)中,并把這個(gè)txt文件的名字改為posdata
以上給出了正樣本文件路徑的生成方法力穗,負(fù)樣本的方法也相同毅弧,但是負(fù)樣本的絕對(duì)路徑不用改為相對(duì)路徑,也不需要在最后加1 0 0 64 64当窗,且名字改為negdata就可以了够坐,negdata.txt內(nèi)應(yīng)該是這樣的
生成正樣本描述文件
打開cmd.exe輸入以下內(nèi)容進(jìn)入open_createsample.exe和opencv_traincascade.exe這兩個(gè)程序的文件地址(以下是我的)
cd C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin
再繼續(xù)輸入以下內(nèi)容(num后是正樣本數(shù),w和h代表樣本圖片的大醒旅妗)
opencv_createsamples.exe -info posdata.txt -vec pos.vec -num 100 -w 64 -h 64
運(yùn)行成功是這樣的
-info 樣本的說(shuō)明文件
-vec 正樣本描述文件的名字以及路徑
-num 正樣本數(shù)量
-w-h樣本圖片的大小
程序成功運(yùn)行后會(huì)生成posdata.vec
訓(xùn)練樣本分類器
打開cmd.exe輸入以下內(nèi)容進(jìn)入open_createsample.exe和opencv_traincascade.exe這兩個(gè)程序的文件地址(以下是我的)
cd C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin
再繼續(xù)輸入以下內(nèi)容(numPos后是正樣本數(shù)咆霜,numNeg后是負(fù)樣本數(shù),w和h代表樣本圖片的大兴恢臁)
opencv_traincascade.exe -data xml -vec pos.vec -bg negdata.txt -numPos 100 -numNeg 226 numStages 20 -featureType LBP -w 64 -h 64
運(yùn)行成功是這樣的(會(huì)迭代很多輪蛾坯,直到達(dá)到閾值或者訓(xùn)練完二十輪)
常見錯(cuò)誤
posdata.txt中的路徑需要是相對(duì)路徑,而negdata.txt中的路徑需要是絕對(duì)路徑疏遏,如果路徑寫錯(cuò)會(huì)出現(xiàn)下面的情況
在創(chuàng)建訓(xùn)練數(shù)據(jù)集和訓(xùn)練樣本分類器是代碼中的空格不能少脉课,如果少了會(huì)出現(xiàn)下面的情況
最后正樣本集中的樣本需要只包含目標(biāo)物體,盡量不要包含其他物體财异,如果要識(shí)別人臉倘零,那就整張圖都只有臉。否則訓(xùn)練效果會(huì)很差戳寸。另外正樣本的尺寸必須小于等于負(fù)樣本的尺寸