最近使用OpenCV訓(xùn)練Haar like+Adaboost分類器,查閱了一些資料,這些資料對(duì)訓(xùn)練過(guò)程陳述的很詳細(xì),但是缺少一些細(xì)節(jié),偶然看到了一篇英文資料,覺得很好,簡(jiǎn)單翻譯了自己覺得有用的部分。 關(guān)于正樣本圖片1、I have positive images, how create vec file of positive samples?
有了正樣本圖片,如果生成對(duì)應(yīng)的vec文件?
OpenCV中有一個(gè)工具可以生成vec文件,在安裝目錄C:\Program Files\OpenCV\apps\HaarTraining\src createsamples.cpp。
使用方法:
createsamples -info positive_description.txt -vec samples.vec -w 20 -h 20 2、What’s positive description file?
正樣本描述文件是什么?
以人臉為例,在正樣本的圖片中,可能有數(shù)個(gè)人臉,每個(gè)人臉的位置可以用一個(gè)矩形框來(lái)表示:矩形左上角是x, y,寬、高是width,height。所以我們可以寫一個(gè)文件來(lái)表示每張圖片中的每個(gè)人臉如下:
positive_image_name num_of_objects x y width height x y width height … 像這樣,指定了正樣本中需要檢測(cè)目標(biāo)位置的文件就叫正樣本描述文件。在生成vec文件時(shí),添加到vec文件中的是需要檢測(cè)的目標(biāo),而不是整張圖片。本質(zhì)上來(lái)講,vec文件用來(lái)加速機(jī)器學(xué)習(xí)。
3、Do I always need description file, even if I have only one object on a image?
描述文件是不是必須的?如果正樣本圖片中只包含一個(gè)需要檢測(cè)的目標(biāo)時(shí)呢?
使用createsamples工具時(shí),描述文件是必須的。如果正樣本圖片中只有一個(gè)被檢測(cè)物,矩形框就是整幅圖片。你也可以自己編寫工具來(lái)生成vec文件。
4、Should lightning conditions and background be various on positive images?
正樣本圖片中的關(guān)照和背景的變化是否需要很大?
是的,而且這很重要。在正樣本圖片中,除了被檢測(cè)目標(biāo),剩下的就是背景。應(yīng)該嘗試用隨機(jī)噪聲來(lái)填充背景,避免沒有變化的背景。
5、How much background should be on positive image?
在正樣本圖片中,應(yīng)該有多少背景?
如果在正樣本圖片中,背景相對(duì)被檢測(cè)目標(biāo)來(lái)說(shuō),所占像素很多的話,會(huì)產(chǎn)生不好的效果,因?yàn)閔aartraining(haar訓(xùn)練程序)會(huì)把背景當(dāng)作被檢測(cè)物的特征記下來(lái)。如果在正樣本圖片中根本沒有背景像素,也會(huì)造成訓(xùn)練的結(jié)果不好。在正樣本圖片中有很少背景是比較理想的。
6、What’ s -w and -h should I put in createsamples? Should it be always square?
在使用createsamples工具時(shí),-w -h參數(shù)應(yīng)該設(shè)定為多少?是不是一定要設(shè)定成正方向?
-w -h參數(shù)的值應(yīng)該根據(jù)希望檢測(cè)目標(biāo)的比例來(lái)設(shè)定。但是,使用生成的分類器來(lái)進(jìn)行檢測(cè)時(shí),比-w -h所確定的形狀小的目標(biāo)不會(huì)被檢測(cè)到。在檢測(cè)臉時(shí),通常使用的值是24*24,20*20。你也可以使用24*20,20*24等等類似的值。
7、Errors during vec file generation: Incorrect size of input array, 0 kb vec file,
生成vec文件時(shí)報(bào)錯(cuò):輸入矩陣大小錯(cuò)誤,vec文件0kb
-首先,檢測(cè)描述文件:例如正樣本圖片的路徑是否正確
-描述文件末尾不能有空行
-正樣本圖片的分辨率不能小于設(shè)置的-w -h參數(shù)
-檢查正樣本圖片是否可用,是否被占用
-正樣本圖片格式是否正確。支持的格式有jpeg、bmp、ppm。
關(guān)于負(fù)樣本圖片1、What negative images should I take?
應(yīng)該使用什么樣的負(fù)樣本圖片?
可是使用任何OpenCV支持的圖片格式,而且其中不能包含被檢測(cè)目標(biāo)。負(fù)樣本圖片應(yīng)該變化很大,多種多樣。
2、Should negative images have the same size?
負(fù)樣本圖片是否需要縮放到同樣大?。?/div>
不需要,但是負(fù)樣本圖片不能小于使用createsamples工具生成vec文件時(shí)設(shè)定的-w -h參數(shù)。
3、What’s description file for negative image?
負(fù)樣本的描述文件是什么樣的?
負(fù)樣本的描述文件是一個(gè)簡(jiǎn)單的文本文件,通常命名為negative.dat。它指定了負(fù)樣本圖片,并且不能有空行(包括末尾)。例如:
image_name1.jpg
image_name2.jpg
4、How many negative/positive image should I take?
通常需要使用多少正/負(fù)樣本圖片?
這往往根據(jù)你的需求來(lái)確定。例如,對(duì)cascades來(lái)說(shuō),需要有1000個(gè)正樣本和2000個(gè)負(fù)樣本。
比較好的比例關(guān)系是 positive : negative = 1:2,但這并不是硬性規(guī)定。我推薦先使用少量的樣本來(lái)嘗試產(chǎn)生cascades,然后再擴(kuò)大樣本。
關(guān)于haartraining.exe的使用1、Example of launching
使用haartraining的示例
vec文件為samples.vec,負(fù)樣本描述文件為negative.dat。使用haartraining.exe的方法如下:
haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 1000 -nneg 2000 -w 20 -h 20 -nonsym -mem 1024 -data haarcascade -vec samples.vec
vec文件為samples.vec -bg negatives.dat
負(fù)樣本描述文件為negatives.dat -nstages 20
分類器的級(jí)聯(lián)層數(shù) -minhitrate 0.999 每一層的最低正確檢測(cè)率99.9%
-maxfalsealarm 0.5 最大錯(cuò)誤接受率50%
-npos 1000 -nneg 2000 正、負(fù)樣本數(shù)
-w 20 -h 20
-w -h參數(shù)與生成vec文件時(shí)設(shè)置的數(shù)值相同 2、What’ s falsealarm and hitrate of stage?
stage的 ”錯(cuò)誤接受率“ 和 ”正確檢測(cè)率“ 是什么?
要了解這兩個(gè)參數(shù),需要查閱adaboost算法中關(guān)于強(qiáng)分類器的理論。stage就是強(qiáng)分類器。簡(jiǎn)單來(lái)說(shuō):
如果有1000個(gè)正樣本,你希望檢測(cè)系統(tǒng)能檢測(cè)出其中的900個(gè),期望的”正確檢測(cè)率“就是900/1000 = 0.9。通常將minhitrate設(shè)置為0.999;
如果有1000個(gè)負(fù)樣本,如果檢測(cè)系統(tǒng)錯(cuò)誤的將其中490當(dāng)作了檢測(cè)目標(biāo),”錯(cuò)誤接受率“就是490/1000 = 0.49。通常false alram設(shè)置為0.5。
3、Are falsealarm and hitrate depend on each other?
錯(cuò)誤接受率和正確檢測(cè)率之間有關(guān)系嗎?
它們之間是有關(guān)系的,不能這樣設(shè)置:minhitrate = 1.0, maxfalsealarm
= 0.0。 首先,系統(tǒng)根據(jù)期望的hitrate創(chuàng)建分類器,然后計(jì)算分類器的falsealarm。如果falsealarm比設(shè)置的maxfalsealarm高,系統(tǒng)會(huì)拒絕這個(gè)分類器,開始創(chuàng)建新的分類器。所以在訓(xùn)練過(guò)程中,你可以看到類似下面的信息:
N |%SMP|F| ST.THR | HR | FA | EXP. ERR|
+—-+—-+-+———+———+———+———+
| 0 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272|
HR – hitrate
FA – falsealarm
4、What’s falsealarm and hitrate of whole cascade?
整個(gè)級(jí)聯(lián)分類器的falsealarm和hitrate是多少?
False alarm of cascade = false alarm of stage 1* false alarm of stage 2* …
Hit rate = hitrate of stage 1 * hitrate of stage 2* …
5、How many stages should be used?
級(jí)聯(lián)分類器應(yīng)該被設(shè)定為多少層?
通常,14-25層就足夠了。
如果層數(shù)過(guò)多,分類器的false alarm就更小,但是產(chǎn)生級(jí)聯(lián)分類器的時(shí)間更長(zhǎng)。
如果層數(shù)過(guò)多,分類器的hitrate就更小。(原因見4)
如果層數(shù)過(guò)多,檢測(cè)速度更慢。
如果正、負(fù)樣本較少,層數(shù)沒必要設(shè)置很多。
6、What’s weighttrimming, eqw, bt, nonsym options?
weighttrimming、eqw、bt、nonsym 選項(xiàng)表示什么?
nonsym —
如果檢測(cè)目標(biāo)不是x或者y軸對(duì)稱的,使用-nonsym選項(xiàng)。系統(tǒng)默認(rèn)使用-sym選項(xiàng) eqw
— 如果正負(fù)樣本數(shù)目不相等,不要使用此選項(xiàng) weighttrimming — 計(jì)算最優(yōu)化選項(xiàng)。能減一點(diǎn)計(jì)算事件,但是質(zhì)量也會(huì)降低
bt
— 使用哪種adaboost算法:Real AB,Gentle AB等 7、What’s minpos, nsplits, maxtreesplits options?
minpos、nsplits、nsplits、maxtreesplits選項(xiàng)是什么?
nsplits ——
樹節(jié)點(diǎn)數(shù)的最小值 maxtreesplits —— 樹節(jié)點(diǎn)數(shù)的最大值
minpos ——
訓(xùn)練過(guò)程中,節(jié)點(diǎn)可使用的正樣本數(shù)目。正樣本根據(jù)節(jié)點(diǎn)被分類,通常來(lái)說(shuō),minpos不小于npos / nsplits 8、 Errors and stranges during haartraining!
訓(xùn)練過(guò)程中的錯(cuò)誤!
①Error (valid only for Discrete and Real AdaBoost): misclass
這是警告而不是錯(cuò)誤。D and R Adaboost算法有一些特別的選項(xiàng)。
②控制臺(tái)上都是類似下面的提示 :| 1000 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272|
訓(xùn)練進(jìn)入了循環(huán),重新啟動(dòng)訓(xùn)練。正常情況下,第一列應(yīng)小于100
③cvAlloc fails. Out of memory
負(fù)樣本太多或者vec文件太大,所有的圖片都加載到內(nèi)存,導(dǎo)致內(nèi)存不足。
④注意-w -h參數(shù)的值與生成vec文件時(shí)的值相同
⑤注意正、負(fù)樣本數(shù)目與-npos 、-nneg參數(shù)設(shè)定值相同
⑥防止dat文件(描述文件)中的空行
⑦Required leaf false alarm rate achieved. Branch training terminated
負(fù)樣本圖片中可能包含了被檢測(cè)目標(biāo)。maxfalsealarm值應(yīng)該設(shè)定到0.4 - 0.5之間。
分類器xml文件1、During haartraining, there are txt file in haarcascade folder, how can we
get XML from them? 訓(xùn)練過(guò)程中會(huì)產(chǎn)生txt文件,如果根據(jù)這些文件生成xml文件?
使用convert_cascade工具:
convert_cascade –size=”20×20″ haarcascade haarcascade.xml 其中,haarcascade 是txt文件所在目錄
2、How can I test generated XML cascade?
如何測(cè)試生成的分類器?
使用performance工具來(lái)測(cè)試,其中正樣本是訓(xùn)練過(guò)程中未使用的圖片:
performance -data haarcascade -w 20 -h 20 -info positive_description.txt -ni performance -data haarcascade.xml -info positive_description.txt -ni
使用OpenCV和訓(xùn)練得到的分類器檢測(cè)物體1、Is it possible to detect rotated faces?
能不能檢測(cè)旋轉(zhuǎn)過(guò)的臉?
訓(xùn)練一個(gè)分類器來(lái)檢測(cè)旋轉(zhuǎn)不同角度的人臉是不可能的。但是,可是訓(xùn)練出分類器來(lái)檢測(cè)旋轉(zhuǎn)到對(duì)應(yīng)角度的人臉??梢允褂眠x擇到這一角度的人臉圖片來(lái)訓(xùn)練出分類器。在訓(xùn)練分類器時(shí),加上-mode all選項(xiàng)表示使用所有的特征,但是早期的OpenCV版本實(shí)現(xiàn)的比較差。你也可以增加自己的特征,這并不困難。
另一種方法是計(jì)算出頭部的選擇角度,然后根據(jù)選擇角度旋轉(zhuǎn)檢測(cè)圖片來(lái)得到正臉,這樣就可以使用OpenCV自帶的人臉檢測(cè)期來(lái)進(jìn)行檢測(cè)了。
2、Is it possible to recognize gender, attention, race with Haar features?
使用Haar特征能否分辨出性別、注意力、種族?
我們有過(guò)嘗試,但是使用OpenCV的haartraining沒有成功。我們使用性別、注意力分類器。當(dāng)然你可以使用Adaboost算法,但我們沒有得到很好的結(jié)果。
3、Is it possible to detect faces in real time?
能否做到實(shí)時(shí)檢測(cè)人臉?
在電腦上,OpenCV自帶的人臉檢測(cè)器檢測(cè)一幅分辨率為640*480的圖片需要200ms,也就是5fps,非實(shí)時(shí)。我們可以改進(jìn)檢測(cè)器,做到15fps,進(jìn)行實(shí)時(shí)檢測(cè)。
|
|
來(lái)自: ice:~:River > 《圖像處理》