排列五开分布图:級聯分類器訓練?

介紹?

河北快三遗漏分布图 www.ainysi.com.cn 級聯分類器包括兩部分:訓練和檢測。 檢測部分在OpenCV objdetect ??櫚奈牡抵杏薪檣?,在那文檔中給出了一些級聯分類器的基本介紹。這個指南是描述如何訓練分類器:準備訓練數據和運行訓練程序。

重點注意事項?

OpenCV中有兩個程序可以訓練級聯分類器: opencv_haartraining and opencv_traincascade``。 ``opencv_traincascade 是一個新程序,使用OpenCV 2.x API 以C++ 編寫。這二者主要的區別是 opencv_traincascade 支持 Haar [Viola2001] 和 LBP [Liao2007] (Local Binary Patterns) 兩種特征,并易于增加其他的特征。與Haar特征相比,LBP特征是整數特征,因此訓練和檢測過程都會比Haar特征快幾倍。LBP和Haar特征用于檢測的準確率,是依賴訓練過程中的訓練數據的質量和訓練參數。訓練一個與基于Haar特征同樣準確度的LBP的分類器是可能的。

opencv_traincascade and opencv_haartraining 所輸出的分類器文件格式并不相同。注意,新的級聯檢測接口(參考 objdetect ??櫓械?CascadeClassifier 類)支持這兩種格式。 opencv_traincascade 可以舊格式導出選練好的級聯分類器。但是在訓練過程被中斷后再重啟訓練過程, opencv_traincascade and opencv_haartraining 不能裝載與中斷前不同的文件格式。

opencv_traincascade 程序使用TBB來處理多線程。如果希望使用多核并行運算加速,請使用TBB來編譯OpenCV。

還有一些與訓練相關的輔助程序。

  • opencv_createsamples 用來準備訓練用的正樣本數據和測試數據。 opencv_createsamples 能夠生成能被 opencv_haartrainingopencv_traincascade 程序支持的正樣本數據。它的輸出為以 *.vec 為擴展名的文件,該文件以二進制方式存儲圖像。
  • opencv_performance 可以用來評估分類器的質量,但只能評估 opencv_haartraining 輸出的分類器。它讀入一組標注好的圖像,運行分類器并報告性能,如檢測到物體的數目,漏檢的數目,誤檢的數目,以及其他信息。

既然 opencv_haartraining 是一個將被棄用的程序,下面將不再介紹,而會主要介紹 opencv_traincascade 。 opencv_createsamples 程序用來為 opencv_traincascade 準備訓練樣本,因此也會介紹它。

準備訓練數據?

訓練需要一些列樣本。樣本分兩類:負樣本和正樣本。負樣本是指不包括物體的圖像。正樣本是待檢測的物體的圖像。負樣本必須手工準備,正樣本使用 opencv_createsamples 創建。

負樣本?

負樣本可以是任意圖像,但是這些圖像中不能包含待檢測的物體。用于摳取負樣本的圖像文件名被列在一個文件中。這個文件是純文本文件,每行是一個文件名(包括相對目錄和文件名)。負樣本和樣本圖像也叫做背景樣本,或者背景樣本圖像,本文檔中對之不予區分。這些圖像可以是不同的尺寸,但是圖像尺寸應該比訓練窗口的尺寸大,因為這些圖像將被用于摳取負樣本,并將負樣本縮小到訓練窗口大小。

下面是一個描述文件的例子:

假如目錄結構如下:

/img
  img1.jpg
  img2.jpg
bg.txt

則bg.txt文件中的內容將如下所示:

img/img1.jpg
img/img2.jpg

正樣本?

正樣本由 opencv_createsamples 生成。正樣本可以由包含待檢測物體的一張圖片生成,也可由一系列標記好的圖像生成。

請注意你需要一個很大的負樣本庫送給訓練程序進行訓練。如果是絕對剛性的物體,如OpenCV的標志,你只有一張正樣本圖像;如果是人臉,你需要幾百甚至幾千個正樣本。在待檢測物體是人臉的情況下,你需要考慮所有的人種、年齡、表情甚至胡子的樣式。

如果只有一張包含物體的圖像,如一個公司的標志,那么可以通過對物體圖像的隨機旋轉、改變標志亮度以及將標志放在任意的背景上而獲得大量的正樣本。生成的正樣本數目以及隨機的程度都可以通過 opencv_createsamples 的命令行參數控制。

命令行參數:

  • -vec <vec_file_name>

    輸出文件,內含用于訓練的正樣本。

  • -img <image_file_name>

    輸入圖像文件名(例如一個公司的標志)。

  • -bg <background_file_name>

    背景圖像的描述文件,文件中包含一系列的圖像文件名,這些圖像將被隨機選作物體的背景。

  • -num <number_of_samples>

    生成的正樣本的數目。

  • -bgcolor <background_color>

    背景顏色(目前為灰度圖);背景顏色表示透明顏色。因為圖像壓縮可造成顏色偏差,顏色的容差可以由 -bgthresh 指定。所有處于 bgcolor-bgthreshbgcolor+bgthresh 之間的像素都被設置為透明像素。

  • -bgthresh <background_color_threshold>

  • -inv

    如果指定該標志,前景圖像的顏色將翻轉。

  • -randinv

    如果指定該標志,顏色將隨機地翻轉。

  • -maxidev <max_intensity_deviation>

    前景樣本里像素的亮度梯度的最大值。

  • -maxxangle <max_x_rotation_angle>

    X軸最大旋轉角度,必須以弧度為單位。

  • -maxyangle <max_y_rotation_angle>

    Y軸最大旋轉角度,必須以弧度為單位。

  • -maxzangle <max_z_rotation_angle>

    Z軸最大旋轉角度,必須以弧度為單位。

  • -show

    很有用的調試選項。如果指定該選項,每個樣本都將被顯示。如果按下 Esc 鍵,程序將繼續創建樣本但不再顯示。

  • -w <sample_width>

    輸出樣本的寬度(以像素為單位)。

  • -h <sample_height>

    輸出樣本的高度(以像素為單位)。

創建樣本的流程如下: 輸入圖像沿著三個軸隨機旋轉。旋轉的角度由 -max?angle 限定。然后像素的亮度值位于 [bg_color-bg_color_threshold; bg_color+bg_color_threshold]范圍的像素被設置為透明像素。將白噪聲加到前景圖像上。如果指定了 -inv ,那么前景圖像的顏色將被翻轉。如果指定了 -randinv ,程序將隨機選擇是否將顏色進行翻轉。任選背景圖像,將獲得的前景圖像放到背景圖像上,并將圖像調整到 -w-h 指定的大小。最后將圖像存入vec文件,vec文件名由命令行參數 -vec 指定。

正樣本也可從一系列事先標記好的圖像中創建。標記信息可以存儲于一個文本文件,與背景描述文件類似。文件中的每行對應一個圖像文件。每行的第一個元素為圖像文件名,后面是物體的數目,最后是物體位置和大小的描述 (x, y, width, height)。

下面是描述文件的例子:

假設目錄結構如下:

/img
  img_with_faces_1.jpg
  img_with_faces_2.jpg
info.dat

文件info.dat里的內容如下:

img/img_with_faces_1.jpg  1  140 100 45 45
img/img_with_faces_2.jpg  2  100 200 50 50   50 30 25 25

圖像img_with_faces_1.jpg中包含一個物體實例(如人臉),標示其在圖像中的位置和大小的矩形為(140, 100, 45, 45)。圖像img_with_faces_2.jpg包含兩個物體實例。

從這樣的一系列數據中創建正樣本,需要在命令行指定 -info 而非前面所用的 -img 參數:

  • -info <collection_file_name>

    描述物體所在圖像以及大小位置的描述文件。

此部分樣本創建過程如下:將物體實例從圖像中摳取出,然后將之調整尺寸到目標尺寸,然后保存到輸出的vec文件。在此過程中不會對圖像進行變形,所以有效的命令行參數僅有 -w, -h, -show-num 。

opencv_createsamples 也可以用來查看和檢查保存于vec正樣本文件中的正樣本。這時只需指定 -vec , -w-h 三個參數則可。 opencv_createsamples 將逐一顯示正樣本圖像。

在訓練中,訓練程序并不關心包含正樣本的vec文件如何生成的,你可以自己寫程序來生成vec文件。但是OpenCV提供的工具中,只有 opencv_createsamples 程序能夠創建包含正樣本的vec文件。

一個vec文件的例子位于 opencv/data/vec_files/trainingfaces_24-24.vec 。它可用來訓練人臉分類器,窗口大小為: -w 24 -h 24 。

訓練級聯分類器?

下一步是訓練分類器。如前面所述, opencv_traincascadeopencv_haartraining 都可用來訓練一個級聯分類器,但是此處只介紹 opencv_traincascade 。 opencv_haartraining 的用法與 opencv_traincascade 類似。

下面是 opencv_traincascade 的命令行參數,以用途分組介紹:

  1. 通用參數:

    • -data <cascade_dir_name>

      目錄名,如不存在訓練程序會創建它,用于存放訓練好的分類器。

    • -vec <vec_file_name>

      包含正樣本的vec文件名(由 opencv_createsamples 程序生成)。

    • -bg <background_file_name>

      背景描述文件,也就是包含負樣本文件名的那個描述文件。

    • -numPos <number_of_positive_samples>

      每級分類器訓練時所用的正樣本數目。

    • -numNeg <number_of_negative_samples>

      每級分類器訓練時所用的負樣本數目,可以大于 -bg 指定的圖片數目。

    • -numStages <number_of_stages>

      訓練的分類器的級數。

    • -precalcValBufSize <precalculated_vals_buffer_size_in_Mb>

      緩存大小,用于存儲預先計算的特征值(feature values),單位為MB。

    • -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>

      緩存大小,用于存儲預先計算的特征索引(feature indices),單位為MB。內存越大,訓練時間越短。

    • -baseFormatSave

      這個參數僅在使用Haar特征時有效。如果指定這個參數,那么級聯分類器將以老的格式存儲。

  2. 級聯參數:

    • -stageType <BOOST(default)>

      級別(stage)參數。目前只支持將BOOST分類器作為級別的類型。

    • -featureType<{HAAR(default), LBP}>

      特征的類型: HAAR - 類Haar特征; LBP - 局部紋理模式特征。

    • -w <sampleWidth>

    • -h <sampleHeight>

      訓練樣本的尺寸(單位為像素)。必須跟訓練樣本創建(使用 opencv_createsamples 程序創建)時的尺寸保持一致。

  3. Boosted分類器參數:

    • -bt <{DAB, RAB, LB, GAB(default)}>

      Boosted分類器的類型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。

    • -minHitRate <min_hit_rate>

      分類器的每一級希望得到的最小檢測率。總的檢測率大約為 min_hit_rate^number_of_stages。

    • -maxFalseAlarmRate <max_false_alarm_rate>

      分類器的每一級希望得到的最大誤檢率。總的誤檢率大約為 max_false_alarm_rate^number_of_stages.

    • -weightTrimRate <weight_trim_rate>

      Specifies whether trimming should be used and its weight. 一個還不錯的數值是0.95。

    • -maxDepth <max_depth_of_weak_tree>

      弱分類器樹最大的深度。一個還不錯的數值是1,是二叉樹(stumps)。

    • -maxWeakCount <max_weak_tree_count>

      每一級中的弱分類器的最大數目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.

  4. 類Haar特征參數:

    • -mode <BASIC (default) | CORE | ALL>

      選擇訓練過程中使用的Haar特征的類型。 BASIC 只使用右上特征, ALL 使用所有右上特征和45度旋轉特征。更多細節請參考 [Rainer2002] 。

  5. LBP特征參數:

    LBP特征無參數。

opencv_traincascade 程序訓練結束以后,訓練好的級聯分類器將存儲于文件cascade.xml中,這個文件位于 -data 指定的目錄中。這個目錄中的其他文件是訓練的中間結果,當訓練程序被中斷后,再重新運行訓練程序將讀入之前的訓練結果,而不需從頭重新訓練。訓練結束后,你可以刪除這些中間文件。

訓練結束后,你就可以測試你訓練好的級聯分類器了!

[Viola2001]Paul Viola, Michael Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. Conference on Computer Vision and Pattern Recognition (CVPR), 2001, pp. 511-518.
[Rainer2002]Rainer Lienhart and Jochen Maydt. An Extended Set of Haar-like Features for Rapid Object Detection. Submitted to ICIP2002.
[Liao2007]Shengcai Liao, Xiangxin Zhu, Zhen Lei, Lun Zhang and Stan Z. Li. Learning Multi-scale Block Local Binary Patterns for Face Recognition. International Conference on Biometrics (ICB), 2007, pp. 828-837.

翻譯?

于仕琪 //www.ainysi.com.cn

Table Of Contents

Previous topic

HighGUI

Next topic

OpenCV 教程

This Page