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