作者|OpenCV-Python Tutorials
編譯|Vincent
來源|OpenCV-Python Tutorials
簡介
使用弱分類器的增強級聯包括兩個主要階段:訓練階段和檢測階段。對象檢測教程中介紹了使用基於HAAR或LBP模型的檢測階段。本文檔概述了訓練自己的弱分類器的級聯所需的功能。當前指南將逐步完成所有不同階段:收集訓練數據,准備訓練數據並執行實際模型訓練。
為了支持本教程,將使用幾個官方的OpenCV應用程序:opencv_createsamples,opencv_annotation,opencv_traincascade和opencv_visualisation。
重要的事項
- 如果您遇到任何提及舊的opencv_haartraining工具(不推薦使用,仍在使用OpenCV1.x界面)的教程,請忽略該教程並堅持使用opencv_traincascade工具。此工具是較新的版本,根據OpenCV 2.x和OpenCV 3.x API用C ++編寫。opencv_traincascade支持類似HAAR的小波特征[227]和LBP(局部二進制模式)[127]特征。與HAAR特征相比,LBP特征產生整數精度,產生浮點精度,因此LBP的訓練和檢測速度都比HAAR特征快幾倍。關於LBP和HAAR的檢測質量,主要取決於所使用的訓練數據和選擇的訓練參數。可以訓練基於LBP的分類器,該分類器將在訓練時間的一定百分比內提供與基於HAAR的分類器幾乎相同的質量。
- 來自OpenCV 2.x和OpenCV 3.x(cv::CascadeClassifier)的較新的層疊分類器檢測接口支持使用新舊模型格式。如果由於某種原因而使用舊界面,則opencv_traincascade甚至可以舊格式保存(導出)經過訓練的級聯。然后至少可以在最穩定的界面中訓練模型。
- opencv_traincascade應用程序可以使用TBB進行多線程處理。
要在多核模式下使用它,必須在啟用TBB支持的情況下構建OpenCV。
准備訓練數據
為了訓練弱分類器的增強級聯,我們需要一組正樣本(包含您要檢測的實際對象)和一組負樣本(包含您不想檢測的所有內容)。負樣本集必須手動准備,而陽性樣本集是使用opencv_createsamples應用程序創建的。
負樣本
負樣本取自任意圖像,不包含要檢測的對象。這些生成樣本的負片圖像應列在一個特殊的負片圖像文件中,該文件每行包含一個圖像路徑(可以是絕對路徑,也可以是相對路徑)。注意,負樣本和樣本圖像也稱為背景樣本或背景圖像,在本文檔中可以互換使用。
所描述的圖像可能具有不同的尺寸。但是,每個圖像都應等於或大於所需的訓練窗口大小(與模型尺寸相對應,多數情況下是對象的平均大小),因為這些圖像用於將給定的負像子采樣為幾個圖像 具有此訓練窗口大小的樣本。
負樣本描述文件的示例:目錄結構:
/img
img1.jpg
img2.jpg
bg.txt
文件 bg.txt
img/img1.jpg
img/img2.jpg
您的一組負窗口樣本將用於模型訓練,在這種情況下,當嘗試查找您感興趣的對象時,可以增強不需要查找的內容。
正樣本
正樣本由opencv_createsamples應用程序創建。提升過程使用它們來定義在嘗試找到感興趣的對象時模型應實際尋找的內容。該應用程序支持兩種生成正樣本數據集的方式。
- 您可以從單個正對象圖像生成一堆正值。
- 您可以自己提供所有肯定的內容,僅使用該工具將其切出,調整大小並以opencv所需的二進制格式放置。
盡管第一種方法對固定對象(例如非常剛性的徽標)效果不錯,但對於剛性較差的對象,它往往很快就會失效。在這種情況下,我們建議使用第二種方法。網絡上的許多教程甚至都指出,通過使用opencv_createsamples應用程序,可以生成100個真實對象圖像,而不是1000個人工生成的正值。但是,如果您決定采用第一種方法,請記住以下幾點:
- 請注意,在將其提供給上述應用程序之前,您需要多個正樣本,因為它僅適用於透視變換。
- 如果您想要一個健壯的模型,請獲取涵蓋對象類中可能出現的各種變化的樣本。例如,對於面孔,您應考慮不同的種族和年齡段,情緒以及胡須風格。當使用第二種方法時,這也適用。
第一種方法采用帶有公司徽標的單個對象圖像,並通過隨機旋轉對象,更改圖像強度以及將圖像放置在任意背景上,從給定的對象圖像中創建大量正樣本。隨機性的數量和范圍可以通過opencv_createsamples應用程序的命令行參數來控制。
命令行參數:
-vec <vec_file_name>
:包含用於訓練的正樣本的輸出文件的名稱。-img <image_file_name>
:源對象圖像(例如,公司徽標)。-bg <background_file_name>
:背景描述文件; 包含圖像列表,這些圖像用作對象的隨機變形版本的背景。-num <number_of_samples>
:要生成的正樣本數。-bgcolor <background_color>
:背景色(當前假定為灰度圖像); 背景色表示透明色。由於可能存在壓縮偽影,因此可以通過-bgthresh指定顏色容忍度。bgcolor-bgthresh和bgcolor + 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>
:輸出樣本的高度(以像素為單位)。
當以此方式運行opencv_createsamples時,將使用以下過程創建示例對象實例:給定的源圖像圍繞所有三個軸隨機旋轉。
所選角度受-maxxangle
,-maxyangle
和-maxzangle
限制。
然后,像素在[bg_color-bg_color_threshold; bg_color + bg_color_threshold]范圍內被設置為透明。白噪聲被添加到前景的強度。如果指定了-inv鍵,則前景像素強度將反轉。如果指定了-randinv
鍵,則算法將隨機選擇是否應對該樣本應用反演。最后,將獲得的圖像從背景描述文件放置到任意背景上,將其大小調整為由-w
和-h
指定的所需大小,並存儲到由-vec
命令行選項指定的vec文件中。
也可以從以前標記的圖像的集合中獲取正樣本,這是構建魯棒對象模型時的理想方式。該集合由類似於背景描述文件的文本文件描述。該文件的每一行都對應一個圖像。該行的第一個元素是文件名,后跟對象注釋的數量,后跟描述包圍矩形(x,y,寬度,高度)的對象坐標的數字。
一個描述文件的示例:
目錄結構:
/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包含具有以下邊界矩形坐標的單個對象實例:(140,100,45,45)。圖像img2.jpg包含兩個對象實例。
為了從此類集合創建正樣本,應指定-info
參數而不是-img
:
-info <collection_file_name>
:標記圖像集合的描述文件。
請注意,在這種情況下,-bg,-bgcolor,-bgthreshold,-inv,-randinv,-maxxangle,-maxyangle
和-maxzangle
等參數將被簡單地忽略並且不再使用。在這種情況下,樣本創建的方案如下。通過從原始圖像中切出提供的邊界框,從給定圖像中獲取對象實例。然后將它們調整為目標樣本大小(由-w和-h定義),並存儲在由-vec
參數定義的輸出vec文件中。沒有應用任何失真,因此僅有的影響參數是-w
,-h
,-show
和-num
。
也可以使用opencv_annotation工具完成手動創建-info
文件的過程。這是一個開放源代碼工具,用於在任何給定圖像中直觀地選擇對象實例的關注區域。以下小節將詳細討論如何使用此應用程序。
額外事項
- opencv_createsamples實用程序可用於檢查存儲在任何給定正樣本文件中的樣本。為此,僅應指定
-vec
,-w
和-h
參數。 - 此處提供了vec文件的示例
opencv/data/vec_files/trainingfaces_24-24.vec
。它可以用於訓練具有以下窗口大小的面部檢測器:-w 24 -h 24
。
使用OpenCV中的集成標注工具
從OpenCV 3.x開始,社區一直在提供和維護開源注釋工具,該工具用於生成-info
文件。如果構建了OpenCV應用程序,則可以通過命令opencv_annotation訪問該工具。
使用該工具非常簡單。該工具接受幾個必需參數和一些可選參數:
--annotations
(必需):注釋txt文件的路徑,您要在其中存儲注釋,然后將其傳遞給-info
參數[example-/data/annotations.txt] ---images
(必需):包含帶有對象的圖像的文件夾的路徑[示例-/data/testimages/]--maxWindowHeight
(可選):如果輸入圖像的高度大於此處的給定分辨率,則調整圖像的大小以用於 使用--resizeFactor
可以簡化注釋。--resizeFactor
(可選):使用--maxWindowHeight
參數時用於調整輸入圖像大小的因子。
請注意,可選參數只能一起使用。可以使用的命令示例如下所示
opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/
此命令將啟動一個窗口,其中包含第一張圖像和您的鼠標光標,這些窗口將用於注釋。有關如何使用注釋工具的視頻,請參見此處。基本上,有幾個按鍵可以觸發一個動作。鼠標左鍵用於選擇對象的第一個角,然后繼續繪制直到您滿意為止,並在單擊鼠標第二次單擊時停止。每次選擇后,您有以下選擇:
- 按
c
:確認注釋,將注釋變為綠色並確認已存儲。 - 按
d
:從注釋列表中刪除最后一個注釋(易於刪除錯誤的注釋) - 按
n
:繼續進行操作下一張圖片 - 按
ESC
鍵:這將退出注釋軟件
最后,您將獲得一個可用的注釋文件,該文件可以傳遞給opencv_createsamples的-info
參數。
級聯訓練
下一步是根據預先准備的正負數據集對弱分類器的增強級聯進行實際訓練。
按用途分組的opencv_traincascade應用程序的命令行參數:
-
常用參數
-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>
:在每個分類器階段的訓練中使用的負樣本數。-numStages <number_of_stages>
:要訓練的級聯級數。-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
:用於預先計算的特征值的緩沖區大小(以Mb為單位)。分配的內存越多,訓練過程就越快,但是請記住,-precalcValBufSize
和-precalcIdxBufSize
的總和不應超過可用的系統內存。-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
:用於預先計算的特征索引的緩沖區大小(以Mb為單位)。分配的內存越多,訓練過程就越快,但是請記住,-precalcValBufSize
和-precalcIdxBufSize
的總和不應超過可用的系統內存。-baseFormatSave
:對於類似Haar的功能,此參數是實際的。如果指定,級聯將以舊格式保存。僅出於向后兼容的原因,並且允許用戶停留在舊的不贊成使用的界面上,至少可以使用較新的界面訓練模型,才可以使用此功能。-numThreads
<最大線程數>:訓練期間要使用的最大線程數。請注意,實際使用的線程數可能會更少,具體取決於您的計算機和編譯選項。默認情況下,如果您使用TBB支持構建了OpenCV,則會選擇最大可用線程,這是此優化所必需的。-acceptanceRatioBreakValue <break_value>
:此參數用於確定模型應保持學習的精確度以及何時停止。良好的指導原則是進行不超過10e-5的訓練,以確保模型不會對您的訓練數據過度訓練。默認情況下,此值設置為-1以禁用此功能。
-
級聯參數:
-stageType <BOOST(default)>
:階段的類型。目前僅支持提升分類器作為階段類型。-featureType <{{HAAR(default),LBP}>>
:功能類型:HAAR-類似Haar的功能,LBP-本地二進制模式。-w <sampleWidth>
:訓練樣本的寬度(以像素為單位)。必須具有與訓練樣本創建期間使用的值完全相同的值(opencv_createsamples實用程序)。-h <sampleHeight>
:訓練樣本的高度(以像素為單位)。必須具有與訓練樣本創建期間使用的值完全相同的值(opencv_createsamples實用程序)。
-
提升分類器參數:
-bt <{DAB,RAB,LB,GAB(default)}>
:增強分類器的類型:DAB-離散AdaBoost,RAB-真實AdaBoost,LB-LogitBoost,GAB-溫和AdaBoost。-minHitRate <min_hit_rate>
:分類器每個階段的最低期望命中率。總命中率可以估計為(min_hit_rate ^ number_of_stages),[228]§4.1。-maxFalseAlarmRate <max_false_alarm_rate>
:分類器每個階段的最大期望誤報率。總體誤報率可以估計為(max_false_alarm_rate ^ number_of_stages),[228]§4.1。- `-weightTrimRate <weight_trim_rate>·:指定是否應使用修剪及其權重。不錯的選擇是0.95。
-maxDepth <max_weak_tree>
:弱樹的最大深度。一個不錯的選擇是1,這是樹樁的情況。-maxWeakCount <max_weak_tree_count>
:每個級聯階段的弱樹的最大計數。提升分類器(階段)將具有如此多的弱樹(<= maxWeakCount),以實現給定的-maxFalseAlarmRate。
-
類似Haar的特征參數:
-mode <BASIC(default)|CORE| ALL>
:選擇訓練中使用的Haar功能集的類型。 BASIC僅使用直立功能,而ALL使用整套直立和45度旋轉功能集。有關更多詳細信息,請參見[129]。
-
本地二進制模式參數:本地二進制模式沒有參數。
opencv_traincascade應用程序完成工作后,經過訓練的級聯將保存在-data
文件夾中的cascade.xml
文件中。此文件夾中的其他文件是為中斷培訓而創建的,因此您可以在訓練完成后將其刪除。
訓練完成后,您可以測試級聯分類器!
可視化級聯分類器
有時,可視化經過訓練的級聯可能很有用,以查看其選擇的功能以及其階段的復雜程度。為此,OpenCV提供了一個opencv_visualisation應用程序。該應用程序具有以下命令:
--image
(必需):對象模型參考圖像的路徑。
這應該是標注,標注[-w,-h]
傳遞給opencv_createsamples和opencv_traincascade應用程序。--model
(必需):訓練模型的路徑,該路徑應該在opencv_traincascade應用程序的-data參數提供的文件夾中。--data
(可選):如果提供了一個數據文件夾,必須事先手動創建它,那么將存儲舞台輸出和功能的視頻。
下面是一個示例命令:
opencv_visualisation --image=/ data/object.png --model=/data/model.xml --data =/data/result/
當前可視化工具的某些限制
-
僅處理級聯分類器模型, 使用opencv_traincascade工具進行培訓,其中包含樹樁作為決策樹[默認設置]。
-
提供的圖像必須是帶有原始模型尺寸的樣本窗口,並傳遞給--image參數。
HAAR / LBP人臉模型的示例在安吉麗娜·朱莉(Angelina Jolie)的給定窗口上運行,該窗口具有與級聯分類器文件相同的預處理–> 24x24像素圖像,灰度轉換和直方圖均衡:每個階段都會制作一個視頻,每個特征都可視化:
每個階段都會制作一個視頻,以顯示每個功能:
每個階段都作為圖像存儲,以供將來對功能進行驗證:
這項工作是由StevenPuttemans為OpenCV 3 Blueprints創建的,但是Packt Publishing同意將其集成到OpenCV中。