層疊分類器訓(xùn)練

2018-10-17 10:26 更新

介紹

使用弱分類器的升級層疊包括兩個(gè)主要階段:培訓(xùn)和檢測階段。使用HAAR或LBP的模型的檢測階段在對象檢測教程中進(jìn)行了描述。本文檔概述了培訓(xùn)您自己的弱分類器層疊的功能。目前的指南將貫穿各個(gè)階段:收集培訓(xùn)數(shù)據(jù),準(zhǔn)備培訓(xùn)數(shù)據(jù)和執(zhí)行實(shí)際培訓(xùn)。

要支持本教程,將使用幾個(gè)官方OpenCV應(yīng)用程序:opencv_createsamples,opencv_annotation,opencv_traincascadeopencv_visualisation。

重要筆記

  • 如果您參考任何教程,提到舊的opencv_haartraining工具(已被棄用,仍然使用OpenCV1.x界面),請忽略該教程,并堅(jiān)持使用opencv_traincascade工具。該工具是根據(jù)OpenCV 2.x和OpenCV 3.x API以C ++編寫的較新版本。opencv_traincascade支持HAAR,如小波特征[181]和LBP(局部二進(jìn)制模式)[103]特征。與HAAR功能相比,LBP功能產(chǎn)生整數(shù)精度,產(chǎn)生浮點(diǎn)精度,因此使用LBP進(jìn)行訓(xùn)練和檢測比HAAR功能快幾倍。關(guān)于LBP和HAAR檢測質(zhì)量,它主要取決于所使用的訓(xùn)練數(shù)據(jù)和訓(xùn)練參數(shù)。可以培訓(xùn)一種基于LBP的分類器,它將在培訓(xùn)時(shí)間的百分比內(nèi)提供幾乎與基于HAAR的分類器相同的質(zhì)量。
  • 來自O(shè)penCV 2.x和OpenCV 3.x(cv :: CascadeClassifier)的較新層疊分類器檢測接口支持使用舊的和新的模型格式。opencv_traincascade甚至可以保存(導(dǎo)出)舊格式的訓(xùn)練層疊,如果由于某些原因您使用舊界面而被卡住。至少訓(xùn)練模型可以在最穩(wěn)定的界面中完成。
  • opencv_traincascade應(yīng)用程序可以使用TBB進(jìn)行多線程。要在多核模式下使用,OpenCV必須在啟用TBB支持的情況下構(gòu)建。

準(zhǔn)備培訓(xùn)資料

為了訓(xùn)練弱分類器的層疊,我們需要一組積極的樣本(包含要檢測的實(shí)際對象)和一組負(fù)圖像(包含您不想檢測的所有內(nèi)容)。必須手動(dòng)準(zhǔn)備一組負(fù)樣本,而使用opencv_createsamples應(yīng)用程序創(chuàng)建一組正樣本。

負(fù)樣本

負(fù)樣本取自任意圖像,不包含要檢測的對象。這些生成樣本的負(fù)圖像應(yīng)列在每行一個(gè)包含一個(gè)圖像路徑的特殊負(fù)圖像文件中(可以是絕對的或相對的)。請注意,負(fù)樣本和樣本圖像也稱為背景樣本或背景圖像,并可在本文檔中互換使用。

描述的圖像可以具有不同的尺寸。然而,每個(gè)圖像應(yīng)該等于或大于所需的訓(xùn)練窗口大?。ㄆ鋵?yīng)于模型尺寸,大多數(shù)時(shí)間是對象的平均大?。?yàn)檫@些圖像用于將給定的負(fù)圖像分割成多個(gè)圖像具有此訓(xùn)練窗口大小的樣本。

這樣一個(gè)負(fù)面描述文件的例子:

目錄結(jié)構(gòu):

/ IMG
  img1.jpg
  img2.jpg
bg.txt

文件bg.txt:

IMG / img1.jpg
IMG / img2.jpg

當(dāng)您嘗試找到您感興趣的對象時(shí),您將使用一組負(fù)窗口樣本來告訴機(jī)器學(xué)習(xí)步驟,在這種情況下,提升無法尋找的內(nèi)容。

陽性樣品

陽性樣本由opencv_createsamples應(yīng)用程序創(chuàng)建。增強(qiáng)過程使用它們來定義當(dāng)試圖找到您感興趣的對象時(shí)實(shí)際尋找的模型。該應(yīng)用程序支持生成正樣本數(shù)據(jù)集的兩種方式。

  1. 您可以從單個(gè)陽性對象圖像生成一堆積極的。
  2. 您可以自己提供所有的積極因素,只能使用該工具剪切出來,調(diào)整它們的大小并將它們放在opencv所需的二進(jìn)制格式中。

雖然第一種方法適用于固定對象,如非常剛性的標(biāo)志,但是對于較不剛性的對象,它往往會失敗。在這種情況下,我們建議使用第二種方法。通過使用opencv_createsamples應(yīng)用程序,Web上的許多教程甚至可以指出100個(gè)真實(shí)對象圖像可以導(dǎo)致比1000個(gè)人為生成的正面更好的模型。如果你決定采取第一種方法,請記住一些事情:

  • 請注意,在將其提交給所提到的應(yīng)用程序之前,您需要多于一個(gè)積極的樣本,因?yàn)樗鼉H適用于透視變換。
  • 如果您想要一個(gè)健壯的模型,請采集樣本,涵蓋可能發(fā)生在對象類中的廣泛種類。例如,在面孔的情況下,您應(yīng)該考慮不同的種族和年齡組,情緒和胡須風(fēng)格。這也適用于使用第二種方法。

第一種方法采用單個(gè)對象圖像,例如公司徽標(biāo),并通過隨機(jī)旋轉(zhuǎn)對象,改變圖像強(qiáng)度以及將圖像放置在任意背景上,從給定對象圖像創(chuàng)建大量正樣本。隨機(jī)性的數(shù)量和范圍可以通過opencv_createsamples應(yīng)用程序的命令行參數(shù)來控制。

命令行參數(shù):

  • -vec <vec_file_name> :包含訓(xùn)練樣本的輸出文件的名稱。
  • -img <image_file_name> :源對象圖像(如公司標(biāo)識)。
  • -bg <background_file_name>:背景描述文件; 包含用作對象的隨機(jī)變形版本的背景的圖像列表。
  • -num <number_of_samples> :生成的陽性樣本數(shù)。
  • -bgcolor <background_color>:背景顏色(目前為灰度圖像)背景顏色表示透明顏色。由于可能會出現(xiàn)壓縮偽影,所以可以通過-bgthresh指定顏色容差的數(shù)量。具有bgcolor-bgthresh和bgcolor + bgthresh范圍的所有像素被解釋為透明的。
  • -bgthresh <background_color_threshold>
  • -inv :如果指定,顏色將被反轉(zhuǎn)。
  • -randinv :如果指定,顏色將隨機(jī)反轉(zhuǎn)。
  • -maxidev <max_intensity_deviation> :前景樣本中像素的最大強(qiáng)度偏差。
  • -maxxangle <max_x_rotation_angle> :朝向x軸的最大旋轉(zhuǎn)角度必須以弧度表示。
  • -maxyangle <max_y_rotation_angle> :向y軸的最大旋轉(zhuǎn)角度必須以弧度表示。
  • -maxzangle <max_z_rotation_angle> :朝向z軸的最大旋轉(zhuǎn)角度必須以弧度表示。
  • -show:有用的調(diào)試選項(xiàng)。如果指定,將顯示每個(gè)樣品。按Esc將繼續(xù)樣品創(chuàng)建過程,而不顯示每個(gè)樣品。
  • -w <sample_width> :輸出樣本的寬度(以像素為單位)。
  • -h <sample_height> :輸出樣本的高度(以像素為單位)。

以這種方式運(yùn)行opencv_createsamples時(shí),使用以下過程來創(chuàng)建一個(gè)示例對象實(shí)例:給定的源圖像圍繞所有三個(gè)軸隨機(jī)旋轉(zhuǎn)。所選擇的角由限制-maxxangle,-maxyangle和-maxzangle。那么具有來自[bg_color-bg_color_threshold; bg_color + bg_c??olor_threshold]范圍被解釋為透明。將白噪聲添加到前景的強(qiáng)度。如果-inv指定了鍵,則前景像素強(qiáng)度被反轉(zhuǎn)。如果-randinv指定了密鑰,則算法隨機(jī)選擇是否應(yīng)該對該樣本應(yīng)用反演。最后,所獲得的圖像被放置在從背景描述文件的任意的背景下,調(diào)整為所指定的所需的大小-w和-h并存儲到由-vec命令行選項(xiàng)指定的vec文件中。

也可以從先前標(biāo)記的圖像的集合中獲得正樣本,這是構(gòu)建魯棒對象模型時(shí)的期望方式。該集合由與背景描述文件類似的文本文件描述。該文件的每行對應(yīng)一個(gè)圖像。該行的第一個(gè)元素是文件名,后跟對象注釋的數(shù)量,后跟數(shù)字描述邊界矩形(x,y,width,height)的對象的坐標(biāo)。

描述文件的一個(gè)例子:

目錄結(jié)構(gòu):

/ IMG
  img1.jpg
  img2.jpg
info.dat

文件info.dat:

img / img1.jpg 1 140 100 45 45
img / img2.jpg 2 100 200 50 50 50 30 25 25

像img1.jpg包含具有以下邊界矩形坐標(biāo)的單個(gè)對象實(shí)例:(140,100,45,45)。圖像img2.jpg包含兩個(gè)對象實(shí)例。

為了從這樣的集合中創(chuàng)建積極的樣本,-info應(yīng)該指定參數(shù),而不是-img:

  • -info <collection_file_name> :標(biāo)記圖像集合的描述文件。

請注意,在這種情況下,類似-bg, -bgcolor, -bgthreshold, -inv, -randinv, -maxxangle, -maxyangle, -maxzangle的參數(shù)被簡單地忽略,不再使用。在這種情況下,樣本創(chuàng)建的方案如下。通過從原始圖像中切出提供的邊界框,從給定圖像中取出對象實(shí)例。然后它們被調(diào)整到目標(biāo)樣本大小(通過定義-w和-h),并存儲在輸出VEC-文件,由定義的-vec參數(shù)。無失真應(yīng)用,所以只能影響參數(shù)是-w,-h,-show和-num。

創(chuàng)建-info文件的手動(dòng)過程也可以通過使用opencv_annotation工具完成。這是一個(gè)開源工具,用于在任何給定的圖像中可視化地選擇對象實(shí)例的感興趣區(qū)域。以下小節(jié)將更詳細(xì)地討論如何使用此應(yīng)用程序。

額外的言論

  • opencv_createsamples實(shí)用程序可用于檢查存儲在任何給定的正樣本文件中的樣本。為了做到這一點(diǎn)只-vec,-w并-h應(yīng)指定的參數(shù)。
  • vec文件的示例在這里可用opencv/data/vec_files/trainingfaces_24-24.vec。它可以用于訓(xùn)練具有以下窗口大小的面部檢測器:-w 24 -h 24。

使用OpenCV的集成注釋工具

由于OpenCV 3.x社區(qū)一直在提供和維護(hù)用于生成-info文件的開放源代碼注釋工具。如果OpenCV應(yīng)用程序在其中生成,則可以通過命令opencv_annotation訪問該工具。

使用該工具非常簡單。該工具接受幾個(gè)必需的和一些可選的參數(shù):

  • --annotations (必需):注釋文件的路徑,您要存儲注釋的位置,然后傳遞給-info參數(shù)[example - /data/annotations.txt]
  • --images (必需):包含圖像與文件夾的文件夾的路徑[example - / data / testimages /]
  • --maxWindowHeight (可選):如果輸入圖像的高度較大,則此處給定的分辨率可以調(diào)整圖像大小以便更容易的注釋,使用--resizeFactor。
  • --resizeFactor (可選):使用--maxWindowHeight參數(shù)時(shí)用于調(diào)整輸入圖像大小的因子。

請注意,可選參數(shù)只能一起使用。可以使用可以使用的命令的示例如下所示

opencv_annotation --annotations = / path / to / annotations / file.txt --images = / path / to / image / folder /

該命令將啟動(dòng)一個(gè)包含第一個(gè)圖像和鼠標(biāo)光標(biāo)的窗口,該光標(biāo)將用于注釋。有關(guān)如何使用注釋工具的視頻可以在這里找到?;旧嫌袔讉€(gè)觸發(fā)動(dòng)作的按鍵。鼠標(biāo)左鍵用于選擇對象的第一個(gè)角,然后繼續(xù)繪制,直到您正常,并注冊了第二個(gè)鼠標(biāo)左鍵。每次選擇后,您都有以下選擇:

  • 按c:確認(rèn)注釋,??將注釋變?yōu)榫G色并確認(rèn)其存儲
  • 按d:從注釋列表中刪除最后一個(gè)注釋(易于刪除錯(cuò)誤的注釋)
  • 按n:繼續(xù)下一張圖片
  • 按ESC:這將退出注釋軟件

最后,您將得到一個(gè)可以傳遞給-infoopencv_createsamples參數(shù)的可用注釋文件。

層疊訓(xùn)練

下一步是基于預(yù)先準(zhǔn)備的正數(shù)和負(fù)數(shù)據(jù)集,對弱分類器進(jìn)行升壓層疊的實(shí)際訓(xùn)練。

opencv_traincascade應(yīng)用程序的命令行參數(shù)按目的分組:

  • 共同點(diǎn):
    1. -data <cascade_dir_name>:訓(xùn)練有素的分類器應(yīng)存放在何處。預(yù)先手動(dòng)創(chuàng)建該文件夾。
    2. -vec <vec_file_name> :具有正樣本的vec文件(由opencv_createsamples實(shí)用程序創(chuàng)建)。
    3. -bg <background_file_name>:背景描述文件。這是包含負(fù)樣本圖像的文件。
    4. -numPos <number_of_positive_samples> :每個(gè)分類階段培訓(xùn)使用的陽性樣本數(shù)。
    5. -numNeg <number_of_negative_samples> :每個(gè)分類階段訓(xùn)練中使用的陰性樣本數(shù)。
    6. -numStages <number_of_stages> :要訓(xùn)練的層疊級數(shù)。
    7. -precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:預(yù)先計(jì)算的特征值的緩沖區(qū)大?。ㄒ訫b為單位)。您指定的快訓(xùn)練過程中更多的內(nèi)存,但是請記住,-precalcValBufSize并-precalcIdxBufSize結(jié)合不應(yīng)超過您可用的系統(tǒng)內(nèi)存。
    8. -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:預(yù)先計(jì)算的特征索引的緩沖區(qū)大小(以Mb為單位)。您指定的快訓(xùn)練過程中更多的內(nèi)存,但是請記住,-precalcValBufSize并-precalcIdxBufSize結(jié)合不應(yīng)超過您可用的系統(tǒng)內(nèi)存。
    9. -baseFormatSave:這個(gè)說法在哈爾式的特征的情況下是實(shí)際的。如果指定,層疊將以舊格式保存。這僅適用于向后兼容性原因,并允許用戶堅(jiān)持舊的棄用接口,至少使用較新界面對模型進(jìn)行訓(xùn)練。
    10. -numThreads <max_number_of_threads>:訓(xùn)練期間使用的最大線程數(shù)。請注意,根據(jù)您的機(jī)器和編譯選項(xiàng),使用的線程的實(shí)際數(shù)量可能會較低。默認(rèn)情況下,如果您使用TBB支持構(gòu)建OpenCV,則可以選擇最大可用線程,這是該優(yōu)化所需的。
    11. -acceptanceRatioBreakValue <break_value>:此參數(shù)用于確定您的模型應(yīng)該如何精確地保持學(xué)習(xí)和何時(shí)停止。一個(gè)好的指導(dǎo)方針是訓(xùn)練不超過10e-5,以確保該模型不會超出您的訓(xùn)練數(shù)據(jù)。默認(rèn)情況下,該值設(shè)置為-1以禁用此功能。
  • 層疊參數(shù):-
    1. -stageType <BOOST(default)>:階段類型 目前僅支持升級分類器作為舞臺類型。
    2. -featureType<{HAAR(default), LBP}> :特征類型:HAAR - 類似Haar的功能,LBP - 本地二進(jìn)制模式。
    3. -w <sampleWidth>:訓(xùn)練樣本的寬度(以像素為單位)。必須具有與訓(xùn)練樣本創(chuàng)建期間使用的完全相同的值(opencv_createsamples實(shí)用程序)。
    4. -h <sampleHeight>:訓(xùn)練樣本的高度(以像素為單位)。必須具有與訓(xùn)練樣本創(chuàng)建期間使用的完全相同的值(opencv_createsamples實(shí)用程序)。
  • 增強(qiáng)的分類參數(shù):
    1. -bt <{DAB, RAB, LB, GAB(default)}> :提升分類器的類型:DAB - Discrete AdaBoost,RAB - Real AdaBoost,LB - LogitBoost,GAB - Gentle AdaBoost。
    2. -minHitRate <min_hit_rate>:分類器的每個(gè)階段的最小期望命中率??偯新士梢怨烙?jì)為(min_hit_rate ^ number_of_stages),[182] §4.1。
    3. -maxFalseAlarmRate <max_false_alarm_rate>:分類器每個(gè)階段的最大期望誤報(bào)率??傉`報(bào)率可以估計(jì)為(max_false_alarm_rate ^ number_of_stages),[182] §4.1。
    4. -weightTrimRate <weight_trim_rate>:指定是否使用修剪及其重量。一個(gè)體面的選擇是0.95。
    5. -maxDepth <max_depth_of_weak_tree>:弱樹的最大深度。一個(gè)體面的選擇是1,就是樹樁的情況。
    6. -maxWeakCount <max_weak_tree_count>:每個(gè)層疊階段弱樹的最大數(shù)量。提升的分類器(階段)將具有如此多的弱樹(<= maxWeakCount),以實(shí)現(xiàn)給定的需要-maxFalseAlarmRate。
  • 哈爾式功能參數(shù):
    1. -mode <BASIC (default) | CORE | ALL>:選擇訓(xùn)練中使用的Haar功能集的類型。BASIC僅使用直立功能,而ALL使用全套垂直和45度旋轉(zhuǎn)功能集。詳見[104]
  • 局部二進(jìn)制模式參數(shù):局部二進(jìn)制模式?jīng)]有參數(shù)。

opencv_traincascade應(yīng)用程序完成工作后,訓(xùn)練好的層疊將被保存在cascade.xml文件-data夾中。此文件夾中的其他文件是針對中斷訓(xùn)練的情況而創(chuàng)建的,因此您可以在完成培訓(xùn)后將其刪除。

訓(xùn)練完畢,你可以測試你的層疊分類器!

可視化層疊分類器

有時(shí)可以可視化已訓(xùn)練的層疊,看看它選擇了哪些功能以及它的階段是多么復(fù)雜。為此OpenCV提供了一個(gè)opencv_visualisation應(yīng)用程序。此應(yīng)用程序具有以下命令:

  • --image (必需):對象模型的引用圖像的路徑。這應(yīng)該是一個(gè)注釋,其尺寸[ -w,-h]傳遞給opencv_createsamples和opencv_traincascade應(yīng)用程序。
  • --model (必需):訓(xùn)練模型的路徑,它應(yīng)該在提供給-dataopencv_traincascade應(yīng)用程序參數(shù)的文件夾中。
  • --data (可選):如果提供了必須事先手動(dòng)創(chuàng)建的數(shù)據(jù)文件夾,則會存儲舞臺輸出和功能的視頻。

下面可以看到一個(gè)示例命令

opencv_visualisation --image = / data / object.png --model = / data / model.xml --data = / data / result /

當(dāng)前可視化工具的一些限制

  • 只處理使用opencv_traincascade工具訓(xùn)練的層疊分類器模型,其中包含樹樁作為決策樹[默認(rèn)設(shè)置]。
  • 提供的圖像需要是具有原始模型尺寸的示例窗口,并傳遞給--image參數(shù)。

HAAR / LBP面部模型的示例在Angelina Jolie的給定窗口上運(yùn)行,該窗口具有與層疊分類器文件相同的預(yù)處理 - > 24x24像素圖像,灰度轉(zhuǎn)換和直方圖均衡:

為每個(gè)階段制作一個(gè)視頻,每個(gè)功能可視化:

層疊分類器訓(xùn)練

每個(gè)階段都存儲為圖像,以便將來驗(yàn)證功能:

層疊分類器訓(xùn)練

這項(xiàng)工作是由StevenPuttemans 為OpenCV 3 Blueprints創(chuàng)建的,但Packt Publishing同意將OpenCV整合。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號