使用OpenCV訓練Haar like+Adaboost分類器的常見問題


《FAQ:OpenCV Haartraining》——使用OpenCV訓練Haar like+Adaboost分類器的常見問題

最近使用OpenCV訓練Haar like+Adaboost分類器,查閱了一些資料,這些資料對訓練過程陳述的很詳細,但是缺少一些細節,偶然看到了一篇英文資料,覺得很好,簡單翻譯了自己覺得有用的部分。

原文鏈接:FAQ:OpenCV Haartraining

關於正樣本圖片

1、I have  positive images, how create vec file of positive samples?
     有了正樣本圖片,如果生成對應的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?
    正樣本描述文件是什么?
以人臉為例,在正樣本的圖片中,可能有數個人臉,每個人臉的位置可以用一個矩形框來表示:矩形左上角是x, y,寬、高是width,height。所以我們可以寫一個文件來表示每張圖片中的每個人臉如下:
positive_image_name  num_of_objects x y width height x y width height …
像這樣,指定了正樣本中需要檢測目標位置的文件就叫正樣本描述文件。在生成vec文件時,添加到vec文件中的是需要檢測的目標,而不是整張圖片。本質上來講,vec文件用來加速機器學習。
 
3、Do I always need description file, even if I have only one object on a image?
    描述文件是不是必須的?如果正樣本圖片中只包含一個需要檢測的目標時呢?
    使用createsamples工具時,描述文件是必須的。如果正樣本圖片中只有一個被檢測物,矩形框就是整幅圖片。你也可以自己編寫工具來生成vec文件。
 
4、Should lightning conditions and background be various on positive images?
    正樣本圖片中的關照和背景的變化是否需要很大?
是的,而且這很重要。在正樣本圖片中,除了被檢測目標,剩下的就是背景。應該嘗試用隨機噪聲來填充背景,避免沒有變化的背景。
 
5、How much background should be on positive image?
    在正樣本圖片中,應該有多少背景?
如果在正樣本圖片中,背景相對被檢測目標來說,所占像素很多的話,會產生不好的效果,因為haartraining(haar訓練 程序)會把背景當作被檢測物的特征記下來。如果在正樣本圖片中根本沒有背景像素,也會造成訓練的結果不好。在正樣本圖片中有很少背景是比較理想的。
 
6、What’ s  -w and -h should I put in createsamples? Should it be always square?
    在使用createsamples工具時,-w -h參數應該設定為多少?是不是一定要設定成正方向?
-w -h參數的值應該根據希望檢測目標的比例來設定。但是,使用生成的分類器來進行檢測時,比-w -h所確定的形狀小的目標不會被檢測到。在檢測臉時,通常使用的值是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
-首先,檢測描述文件:例如正樣本圖片的路徑是否正確
-描述文件末尾不能有空行
-正樣本圖片的分辨率不能小於設置的-w -h參數
-檢查正樣本圖片是否可用,是否被占用
-正樣本圖片格式是否正確。支持的格式有jpeg、bmp、ppm。
 

關於負樣本圖片

1、What negative images should I take?
    應該使用什么樣的負樣本圖片?
可是使用任何OpenCV支持的圖片格式,而且其中不能包含被檢測目標。負樣本圖片應該變化很大,多種多樣。
 
2、Should negative images have the same size?
    負樣本圖片是否需要縮放到同樣大小?
不需要,但是負樣本圖片不能小於使用createsamples工具生成vec文件時設定的-w -h參數。
 
3、What’s description file for negative image?
    負樣本的描述文件是什么樣的?
負樣本的描述文件是一個簡單的文本文件,通常命名為negative.dat。它指定了負樣本圖片,並且不能有空行(包括末尾)。例如:
    image_name1.jpg
    image_name2.jpg
 
4、How many negative/positive image should I take?
    通常需要使用多少正/負樣本圖片?
這往往根據你的需求來確定。例如,對cascades來說,需要有1000個正樣本和2000個負樣本。
比較好的比例關系是 positive : negative = 1:2,但這並不是硬性規定。我推薦先使用少量的樣本來嘗試產生cascades,然后再擴大樣本。
 

關於haartraining.exe的使用

1、Example of launching
    使用haartraining的示例
vec文件為samples.vec,負樣本描述文件為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  
        生成的xml文件目錄為haarcascade 

-vec  samples.vec       
    vec文件為samples.vec
-bg  negatives.dat       
    負樣本描述文件為negatives.dat
-nstages 20         
           分類器的級聯層數
 -minhitrate 0.999             每一層的最低正確檢測率99.9%
-maxfalsealarm 0.5           最大錯誤接受率50%
-npos 1000 -nneg 2000    正、負樣本數
-w  20 -h 20         
             -w -h參數與生成vec文件時設置的數值相同
 
2、What’ s falsealarm and hitrate of stage?
  stage的 ”錯誤接受率“ 和 ”正確檢測率“ 是什么?
要了解這兩個參數,需要查閱adaboost 算法中關於強分類器的理論。stage就是強分類器。簡單來說:
 
如果有1000個正樣本,你希望檢測系統能檢測出其中的900個,期望的”正確檢測率“就是900/1000 = 0.9。通常將minhitrate設置為0.999;
如果有1000個負樣本,如果檢測系統錯誤的將其中490當作了檢測目標,”錯誤接受率“就是490/1000 = 0.49。通常false alram設置為0.5。
 
3、Are falsealarm and hitrate depend on each other?
    錯誤接受率和正確檢測率之間有關系嗎?
它們之間是有關系的,不能這樣設置:minhitrate = 1.0,  maxfalsealarm 
= 0.0。
首先,系統根據期望的hitrate創建分類器,然后計算分類器的falsealarm。如果falsealarm比設置的maxfalsealarm高,系統會拒絕這個分類器,開始創建新的分類器。所以在訓練過程中,你可以看到類似下面的信息:
 

 

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?
    整個級聯分類器的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?
    級聯分類器應該被設定為多少層?
通常,14-25層就足夠了。
如果層數過多,分類器的false alarm就更小,但是產生級聯分類器的時間更長。
如果層數過多,分類器的hitrate就更小。(原因見4)
如果層數過多,檢測速度更慢。
如果正、負樣本較少,層數沒必要設置很多。
 
6、What’s weighttrimming, eqw, bt, nonsym options?
    weighttrimming、eqw、bt、nonsym 選項表示什么?
nonsym            —
如果檢測目標不是x或者y軸對稱的,使用-nonsym選項。系統默認使用-sym選項
eqw          
       — 如果正負樣本數目不相等,不要使用此選項
weighttrimming — 計算最優化選項。能減一點計算事件,但是質量也會降低
bt                  
  — 使用哪種adaboost算法:Real AB,Gentle AB等
 
7、What’s  minpos, nsplits, maxtreesplits options?
    minpos、nsplits、nsplits、maxtreesplits選項是什么?
nsplits              —— 
  樹節點數的最小值
maxtreesplits    ——    樹節點數的最大值
minpos             —— 
 訓練過程中,節點可使用的正樣本數目。正樣本根據節點被分類,通常來說,minpos不小於npos / nsplits
 
8、   Errors and stranges during haartraining!
    訓練過程中的錯誤!
①Error (valid only for Discrete and Real AdaBoost): misclass
這是警告而不是錯誤。D and R Adaboost算法有一些特別的選項。
 
②控制台上都是類似下面的提示 :| 1000 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272| 
訓練進入了循環,重新啟動訓練。正常情況下,第一列應小於100
 
③cvAlloc fails. Out of memory
負樣本太多或者vec文件太大,所有的圖片都加載到內存,導致內存不足。
 
④注意-w -h參數的值與生成vec文件時的值相同
 
⑤注意正、負樣本數目與-npos 、-nneg參數設定值相同
 
⑥防止dat文件(描述文件)中的空行
 
⑦Required leaf false alarm rate achieved. Branch training terminated
負樣本圖片中可能包含了被檢測目標。maxfalsealarm值應該設定到0.4 - 0.5之間。
 

分類器xml文件

1、During haartraining, there are txt file in haarcascade folder, how can we
get XML  from them?
    訓練過程中會產生txt文件,如果根據這些文件生成xml文件?
使用convert_cascade工具:
 convert_cascade –size=”20×20″ haarcascade haarcascade.xml
其中,haarcascade 是txt文件所在目錄
 
2、How can I test generated XML cascade?
      如何測試生成的分類器?
使用performance工具來測試,其中正樣本是訓練過程中未使用的圖片:

 

performance -data haarcascade -w 20 -h 20 -info positive_description.txt -ni
performance -data haarcascade.xml -info positive_description.txt -ni

 

使用OpenCV和訓練得到的分類器檢測物體

1、Is it possible to detect rotated faces?
    能不能檢測旋轉過的臉?
訓練一個分類器來檢測旋轉不同角度的人臉是不可能的。但是,可是訓練出分類器來檢測旋轉到對應角度的人臉。可以使用選擇到這一角度的人臉圖片來訓練出分類器。在訓練分類器時,加上-mode all選項表示使用所有的特征,但是早期的OpenCV版本實現的比較差。你也可以增加自己的特征,這並不困難。
另一種方法是計算出頭部的選擇角度,然后根據選擇角度旋轉檢測圖片來得到正臉,這樣就可以使用OpenCV自帶的人臉檢測期來進行檢測了。
 
2、Is it possible to recognize gender, attention, race with  Haar features?

 

    使用Haar特征能否分辨出性別、注意力、種族?
我們有過嘗試,但是使用OpenCV的haartraining沒有成功。我們使用性別、注意力分類器。當然你可以使用Adaboost算法,但我們沒有得到很好的結果。
 
3、Is it possible to detect faces in real time?
    能否做到實時檢測人臉?
在電腦上,OpenCV自帶的人臉檢測器檢測一幅分辨率為640*480的圖片需要200ms,也就是5fps,非實時。我們可以改進檢測器,做到15fps,進行實時檢測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM