opencv3-基于opencv_traincascade級(jí)聯(lián)分類器的訓(xùn)練步驟

最近在做識(shí)別的過(guò)程中發(fā)現(xiàn)sift與surf的特征并不容易篩選,想找一下有沒(méi)有比較好篩選特征的方法,在檢索的過(guò)程中發(fā)現(xiàn)了基于haar特征的級(jí)聯(lián)adboost的方法,這個(gè)方法能有效的篩選哪些是更好的haar特征。雖然暫時(shí)還沒(méi)有相處關(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,很苦惱,沒(méi)有這個(gè)open_haartraining.exe,只有opencv_traincascade,索性就開(kāi)始使用了(open_haartraining.exe只能訓(xùn)練haar特征的分類器,但是opencv_traincascade可訓(xùn)練多種特征的分類器,比如haar,hog,lbp等等)。

opencv_traincascade的原理暫時(shí)沒(méi)有詳細(xì)的探查過(guò),之后回來(lái)補(bǔ)上。接下來(lái)詳細(xì)的講一下整個(gè)級(jí)聯(lián)分類器的整個(gè)訓(xùn)練過(guò)程。
訓(xùn)練過(guò)程主要分為以下四步:

1.配置訓(xùn)練環(huán)境
2.制作訓(xùn)練數(shù)據(jù)集
3.生成正樣本描述文件(.vec文件)
4.訓(xùn)練樣本分類器
5.常見(jiàn)錯(cuò)誤

配置訓(xùn)練環(huán)境

opencv的源代碼是用c++寫(xiě)的,但是提供了其他主流語(yǔ)言的接口,但是這個(gè)訓(xùn)練的過(guò)程需要調(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)建過(guò)程下面會(huì)提到
posdata24x16.txt:正樣本的文件路徑,這個(gè)文件不是自帶的,需要?jiǎng)?chuàng)建,創(chuàng)建過(guò)成下面會(huì)提到
posdata24x16.vec:生成的正樣本描述文件,這個(gè)文件不是自帶的,需要?jiǎng)?chuàng)建,創(chuàng)建過(guò)程下面會(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ù)樣本過(guò)少會(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)在需要通過(guò)記事本的替換功能修改一下這個(gè)txt文件的內(nèi)容


替換好之后應(yīng)該是這個(gè)樣子

posdata是樣本的相對(duì)路徑,最后的1 0 0 64 64,最后兩位數(shù)代表你的樣本圖像的大小,需要根據(jù)自己的樣本圖片改寫(xiě),由于文件中指出的位置是相對(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)該是這樣的

生成正樣本描述文件

打開(kāi)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代表樣本圖片的大?。?br> 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)練樣本分類器

打開(kāi)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代表樣本圖片的大?。?br> 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)練完二十輪)

常見(jiàn)錯(cuò)誤

posdata.txt中的路徑需要是相對(duì)路徑,而negdata.txt中的路徑需要是絕對(duì)路徑,如果路徑寫(xiě)錯(cuò)會(huì)出現(xiàn)下面的情況



在創(chuàng)建訓(xùn)練數(shù)據(jù)集和訓(xùn)練樣本分類器是代碼中的空格不能少,如果少了會(huì)出現(xiàn)下面的情況



最后正樣本集中的樣本需要只包含目標(biāo)物體,盡量不要包含其他物體,如果要識(shí)別人臉,那就整張圖都只有臉。否則訓(xùn)練效果會(huì)很差。另外正樣本的尺寸必須小于等于負(fù)樣本的尺寸
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容