Ubuntu利用opencv訓(xùn)練自己的xml文件

先前在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)到字符串尾部,效果如下:

【1 :該樣本數(shù)目為1驼鹅;0 0 :表示樣本起始坐標(biāo)微谓;500 500 : 表示樣本寬高】

生成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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豌注,隨后出現(xiàn)的幾起案子伤塌,更是在濱河造成了極大的恐慌,老刑警劉巖幌羞,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸谜,死亡現(xiàn)場離奇詭異,居然都是意外死亡属桦,警方通過查閱死者的電腦和手機(jī)熊痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聂宾,“玉大人果善,你說我怎么就攤上這事∠敌常” “怎么了巾陕?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纪他。 經(jīng)常有香客問我鄙煤,道長,這世上最難降的妖魔是什么茶袒? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任梯刚,我火速辦了婚禮,結(jié)果婚禮上薪寓,老公的妹妹穿的比我還像新娘亡资。我一直安慰自己,他們只是感情好向叉,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布锥腻。 她就那樣靜靜地躺著,像睡著了一般母谎。 火紅的嫁衣襯著肌膚如雪瘦黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天奇唤,我揣著相機(jī)與錄音供璧,去河邊找鬼。 笑死冻记,一個胖子當(dāng)著我的面吹牛睡毒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冗栗,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼演顾,長吁一口氣:“原來是場噩夢啊……” “哼供搀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钠至,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤葛虐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棉钧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屿脐,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年宪卿,在試婚紗的時候發(fā)現(xiàn)自己被綠了的诵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡佑钾,死狀恐怖西疤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情休溶,我是刑警寧澤代赁,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站兽掰,受9級特大地震影響芭碍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孽尽,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一窖壕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泻云,春花似錦、人聲如沸狐蜕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽层释。三九已至婆瓜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贡羔,已是汗流浹背廉白。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留乖寒,地道東北人猴蹂。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像楣嘁,于是被迫代替她去往敵國和親磅轻。 傳聞我的和親對象是個殘疾皇子珍逸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容