先前在windows系統(tǒng)訓(xùn)練的xml,在應(yīng)用的時候效果不是很好壳嚎,檢測有很大的誤差席爽,這里有幾點經(jīng)驗(也是出問題的時候,在網(wǎng)上找到的解決方法及理論知識)蹦玫。
---采集正負(fù)樣本的數(shù)量及尺寸---
1.數(shù)量:
正樣本500赎婚,負(fù)樣本1500(如果在訓(xùn)練時要用到500正樣本和1500負(fù)樣本,那么在采集的時候需要都要多采集一些樱溉,大概多采100張左右)
為什么要多采挣输?
因為在訓(xùn)練時,要填寫-numPos 和 -numNeg這兩個參數(shù)饺窿,而根據(jù)實際訓(xùn)練情況歧焦,要滿足以下要求:
實際準(zhǔn)備的正樣本數(shù)量(讀入vec-file的正樣本數(shù)) >= numPos + (numStage - 1) * numPos * (1 - minHitRate)
vec-file的正樣本數(shù)就是根據(jù)原始的正樣本生成的,所以如果-numPos設(shè)為500的話,vec-file的數(shù)量就需要大一些绢馍,如果較小的話就會出現(xiàn)(Bad argument < Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.)的錯誤向瓷。
相關(guān)參數(shù):
vec-fil:通過opencv_createSamples利用pos.txt生成的pos.vec文件(正樣本數(shù)就是pos.txt讀取的原始正樣本的數(shù)量)
numPos:每一級stage訓(xùn)練所需的正樣本數(shù)目(本人原始正樣本數(shù)為565,那numPos就設(shè)置為500)
numStage:訓(xùn)練的級數(shù)舰涌,相當(dāng)于keras中的epoch猖任,默認(rèn)為20,本人設(shè)置為15( stage數(shù)不是越大越好瓷耙,過大可能會導(dǎo)致過擬合 )
minHitRate:分類器的每一級希望得到最小檢測率(即正樣本被判斷有效的比例)朱躺,最優(yōu)設(shè)置0.9999
2.尺寸:
正樣本( 50px * 50px )?
正樣本的尺寸設(shè)置為20*20 / 30*30 / 50*50都行,但不能太大搁痛,如果太大就會導(dǎo)致(?OpenCV Error: Insufficient memory (Failed to allocate 65408 bytes) in unknown function )內(nèi)存分配不夠的錯誤长搀。
負(fù)樣本( 300px * 300px )
負(fù)樣本的尺寸必須要大于正樣本的6倍或者更大。
因為首先我們要知道訓(xùn)練程序中寫的numNeg參數(shù)表示每級訓(xùn)練用到的負(fù)樣本數(shù)鸡典,本人把它設(shè)置為1500源请。其實這個numNeg的大小和原始負(fù)樣本數(shù)量沒有任何關(guān)聯(lián), 因為numNeg是通過滑動窗口在原始負(fù)樣本上不斷滑動采集彻况,得到的預(yù)處理負(fù)樣本圖像的數(shù)量(滑動窗口的大小就是正樣本的大小谁尸,這里是50*50)
負(fù)樣本的尺寸如果不夠大,或者和正樣本一樣大纽甘,滑動窗口就無法在原始負(fù)樣本上滑動來采集足夠多的訓(xùn)練圖像良蛮,再加上如果收集到的原始負(fù)樣本的數(shù)量可能并不比正樣本多多少,也許就是3悍赢、4倍决瞳。這樣的話就會導(dǎo)致(?執(zhí)行opencv_traincascade訓(xùn)練程序過程中中斷 )的錯誤,同時會報(Train dataset for temp stage can not be filled. Branch training terminated左权。)這時我們發(fā)現(xiàn)訓(xùn)練圖中的FA(?FalseAlarm,虛警率 )為0瞒斩,表示負(fù)樣本已全部被正確分類了,也就不會有負(fù)樣本繼續(xù)參與下一輪的訓(xùn)練了涮总,所以就退出了胸囱。
所以在準(zhǔn)備原始負(fù)樣本的時候一定要保證尺寸足夠大,同時包含的內(nèi)容足夠復(fù)雜瀑梗。
---numPos 和 numNeg的比例---
numPos : numNeg = 1:3,這是最優(yōu)的比例
1. 當(dāng)numPos和numNeg比例接近的時候1:1烹笔,對numNeg內(nèi)負(fù)樣本的看中程度很低,在實際的生活中負(fù)樣本肯定遠(yuǎn)遠(yuǎn)多于正樣本抛丽。
2. 當(dāng)numPos和numNeg比例較大的時候1:10谤职,對numNeg內(nèi)負(fù)樣本多于看中而忽略了正樣本的統(tǒng)計特性,造成正樣本權(quán)重總和很小亿鲜,當(dāng)權(quán)重小于一定程度的時候可能很大一部分正樣本都不參與訓(xùn)練了允蜈。
--- Haar和LBP特征 ---
基于LBP特征的分類器幾乎能和基于Harr特征的分類器擁有一樣的性能冤吨,并且由于LBP屬于整數(shù)型的特征,所以在訓(xùn)練的時候要比Haar特征快得多饶套。
所以在訓(xùn)練的參數(shù)中要添加 -featureType LBP漩蟆,這樣能加快訓(xùn)練速度
以上是在整個準(zhǔn)備和訓(xùn)練期間需要注意的事項,現(xiàn)在正式開始妓蛮。
系統(tǒng):Ubuntu16.04
opencv版本:opencv3.2.0
python版本:python2.7
opencv本人用的版本是源碼編譯的opencv3.2.0,安裝鏈接已給出怠李,進(jìn)入python后>>>import cv2不報錯,即為安裝成功蛤克。
--- 數(shù)據(jù)準(zhǔn)備 ---
新建一個/my_xml文件夾作為項目根目錄捺癞,將正樣本放入/my_xml/pos中,將負(fù)樣本放入/my_xml/neg中构挤。
還需要opencv_createsamples 和?opencv_traincascade這兩個程序髓介,在/usr/local/bin中可以找到,通過( cp 程序路徑 目標(biāo)路徑 )復(fù)制過來就OK了筋现,當(dāng)前目錄如下:
---生成樣本路徑文件---
生成正樣本的pos.txt路徑文件版保,命令行進(jìn)入根目錄運(yùn)行:
ls pos/*.*>pos.txt
然后將剛生成的pos.txt文件在sublime中打開,按住鼠標(biāo)滾輪夫否,往下拖,即可選中當(dāng)前列叫胁;按一下鍵盤的“END”鍵凰慈,光標(biāo)即可跳轉(zhuǎn)到字符串尾部,效果如下:
生成neg.txt同理,不過格式稍有不同输钩,最終兩個文件的效果如下:
---生成正樣本的vec文件---
命令行進(jìn)入根目錄豺型,運(yùn)行以下代碼:
opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 50 -h 50
出現(xiàn)以下效果,同時在根目錄生成pos.vec文件买乃,即為成功:
--- 開始訓(xùn)練 ---
開始訓(xùn)練前姻氨,在根目錄底下新建一個/data目錄,用于存放訓(xùn)練完畢的xml文件剪验,當(dāng)前根目錄效果如下:
運(yùn)行以下代碼肴焊,開始訓(xùn)練
opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 500 -numNeg 1500 -numStages 15 -featureType LBP -w 50 -h 50 -minHitRate 0.9999 -maxFalseAlarmRate 0.5
相關(guān)參數(shù):
-data : 存放xml文件的目錄
-vec : 正樣本vec文件源
-bg : 負(fù)樣本路徑txt文件
-numPos : 正樣本數(shù)量
-numNeg : 負(fù)樣本數(shù)量
numStages:訓(xùn)練分類器的級數(shù)
-featureType: 默認(rèn)使用Haar特征,還有LBP和HOG可供選擇(HOG為opencv2.4.0版本以上)
-w -h : 樣本寬高
-minHitRate :分類器的每一級希望得到最小檢測率(即正樣本被判斷有效的比例)
-maxFalseAlarmRate:分類器的每一級希望的最大誤檢率(負(fù)樣本判定為正樣本的概率)
-mode:?選擇訓(xùn)練中使用的Haar特征類型功戚。BASIC只使用右上特征娶眷,ALL使用所有右上特征及45度旋轉(zhuǎn)特征(使用Haar特征的前提下,否則不使用此參數(shù))
出現(xiàn)以下畫面啸臀,表示訓(xùn)練順利進(jìn)行:
--- 驗證效果 ---
迭代玩15次后届宠,在/data目錄下生成了一堆xml文件,我們選用cascade.xml
python代碼如下:
效果如下:
參考文章:
https://blog.csdn.net/u014587123/article/details/78507649?locationNum=6&fps=1