文章目錄
- 介紹
- 重要提示
- 訓練資料準備
- 負樣本
- 正樣本
- **額外說明**
- 使用OpenCV的內建标注工具
- 級聯增強分類器訓練
- 可視化級聯分類器
介紹
級聯增強分類器包含兩個主要階段:訓練階段和檢測階段。檢測階段使用HAAR或在LBP基礎模型,在物體檢測引導中有說明。本文展示訓練自己的級聯增強分類器所需的功能概述。本篇文章通過以下幾個部分進行講解,分别是:收集訓練資料、訓練資料預處理和進行實際的模型訓練
以下教程将會使用到以下OpenCV程式,分别是:opencv_createsamples、opencv_annotation、opencv_traincascade和opencv_visualisation
重要提示
- 如果你看到任何關于老版本opencv_haartraining工具的使用說明,請将其忽略并堅持使用opencv_traincascade工具,因為它是不被推薦使用的但依然存在opencv1.x版本裡面。opencv_traincascade工具是更新的版本,存在與opencv2.x和opencv3.x版本裡面。它支援HAAR的小波特征和LBP特征(本地二進制模式)。與HAAR特征相比,LBP特征産生整數精度,進而産生浮點精度,是以LBP的訓練和檢測速度都比HAAR特征快幾倍。關于LBP和HAAR的檢測品質,它主要取決于使用的訓練資料和選擇的訓練參數。相比于訓練一個HAAR模型的級聯增強分類器,達到相同的效果訓練一個LBP模型的級聯增強分類器所使用的時間更少。
- 來自opencv2.x和opencv3.x的較新的級聯分類器檢測接口可以用于舊的或者新的模型格式。如果因為某種原因你隻能使用舊的接口, opencv_traincascade甚至可以儲存和支援一個已經訓練好的分類器以一種舊的格式。至少可以在最穩定的接口上面完成模型的訓練。
- 為了多線程opencv_traincascade應用程式可以使用TBB。為了在多核模式下使用它,opencv必須在TBB支援情況下進行安裝。
訓練資料準備
為了訓練級聯增強分類器,我們需要一組正樣本(包含你想要檢測的實際物體)和一組負樣本(包含你不想要檢測的一切物體)。負樣本需要手動提前準備,正樣本可以通過opencv_createsamples應用程式生成。
負樣本
負樣本從不包含檢測物體的任意圖檔中産生。負樣本的所有圖檔路徑應該包含在一個txt檔案裡面,每一行表示一個路徑(可以是絕對路徑和相對路徑)。注意,産生負樣本的任意圖檔和負樣本都可以稱之為背景樣本。
你找到的背景樣本可能尺寸大小不一,但是要求大于檢測物體圖檔的平均尺寸,因為這些圖檔會以這個平均尺寸進行二次采樣得到一些圖檔樣本。
下面展示一個負樣本描述檔案的例子
檔案夾結構
/img
img1.jpg
img2.jpg
bg.txt
檔案bg.txt内容為
img/img1.jpg
img/img2.jpg
這組負樣本資料在機器學習尋找感興趣物體的過程中指出哪些是不需要去尋找的。
正樣本
正樣本由opencv_createsamples應用程式生成。訓練過程使用它們來定義在嘗試找到感興趣的對象時模型應實際尋找的内容。這個程式支援兩種生成正樣本資料的方式。
第一種是
,你可以使用一個檢測物體圖像來生成一組正樣本資料;
第二種是
,你可以提供所有的正樣本資料而隻是使用工具将其進行裁剪、調整大小。
然而第一種方式适合固定的檢測物體,例如非常死闆的logo,對于比較靈活的檢測物體,效果較差。這種情況下,我們建議使用第二種方式。很多教程甚至指出100個真實物體正樣本圖檔比通過opencv_createsamples應用程式生成的1000個人工制作的正樣本圖檔可以帶來更好的模型效果。然而,如果你堅持使用第一種方法,請記住以下幾點:第一,請注意你不僅僅隻是需要一個正樣本圖檔在你提供給opencv_createsamples應用程式之前,因為它僅僅隻是适用于透視轉型。第二,如果你想要一個強大的模型,請采用你想要檢測物體的多種不同種類作為正樣本。例如,對于臉型而言,你應該考慮不同臉型和歲數的組合,表情或者胡須的風格。這個方法同樣适用于第二種方式。
第一種方式使用一個單獨的物體例如公司的logo,并依靠已有的物體圖檔通過随機旋轉、改變圖像強度和增加背景圖檔的方式來随機生成一批正樣本圖檔。随機的數量和種類可以被控制通過opencv_createsamples應用程式的指令行參數。
指令行參數如下:
-
:包含訓練正樣本圖檔路徑的輸出檔案的名字-vec<vec_file_name>
-
:檢測物體圖檔,例如公司logo-img<image_file_name>
-
:背景描述檔案,包含圖像清單,這些圖像用作檢測對象的随機變形之後的背景。-bg<backgrounp_file_name>
-
:生成的正樣本的數量-num<num_of_samples>
-
:背景顔色(假設目前的圖檔的灰階圖檔);這個背景顔色提供透明顔色。由于可能存在壓縮僞影,是以可以通過-bgcolor <background_color>
指定顔色容忍度。-bgthresh
-bgcolor
和bgthresh
+bgcolor
範圍内的所有像素均被解釋為透明的。bgthresh
-
:--bgthresh <background_color_threshold>
-
:如果指定,顔色将被反轉-inv
-
:如果指定,顔色将随機反轉-randinv
-
:前景樣本中像素的最大強度偏差。--maxidev <max_intensity_deviation>
-
:朝向x軸的最大旋轉角度,必須以弧度為機關。--maxxangle <max_x_rotation_angle>
-
:朝向y軸的最大旋轉角度,必須以弧度為機關。-maxyangle <max_y_rotation_angle>
-
:朝向z軸的最大旋轉角度,必須以弧度為機關。-maxzangle <max_z_rotation_angle>
-
:有用的調試選項。如果指定,将顯示每個樣本。按Esc将繼續示例建立過程,而不會顯示每個示例。-show
-
:輸出樣本的寬度(以像素為機關)。-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-file檔案裡面。
也可以從以前标記圖像的集合中擷取正樣本,這是生成健壯模型想要的方式。該集合由類似于背景描述檔案的文本檔案描述。該檔案的每一行都對應一個圖像。該行的第一個元素是檔案名,後跟對象注釋的數量,後跟描述包圍矩形(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_createsamples實用程式可用于檢查存儲在任何給定正樣本檔案中的樣本。為此,僅應指定
參數。-vec,-w和-h
- 此處提供了vec檔案的示例
。它可以用于訓練具有以下視窗大小的面部檢測器:-w 24 -h 24。opencv / data / vec_files / trainingfaces_24-24.vec
使用OpenCV的內建标注工具
從OpenCV 3.x開始,社群一直在提供和維護開源标注工具,該工具用于生成-info檔案。如果建構了OpenCV應用程式,則可以通過指令opencv_annotation通路該工具。
使用該工具非常簡單。該工具接受幾個必需參數和一些可選參數:
-
:注釋txt檔案的路徑,您要在其中存儲注釋,然後将其傳遞到-info參數[示例-/data/annotations.txt]--annotations(required)
-
:包含帶有對象的圖像的檔案夾的路徑[示例-/ data / testimages /]--images(required)
-
:如果輸入圖像的高度更大,則此處為給定的分辨率,請使用--maxWindowHeight (optional)
調整圖像的大小,以便于注釋。--resizeFactor
-
:使用--resizeFactor (required)
參數時用于調整輸入圖像大小的系數。--maxWindowHeight
請注意,可選參數隻能一起使用。可以使用的指令示例如下所示
opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/
此指令将啟動一個視窗,其中包含第一張圖像和您的滑鼠光标,這些視窗将用于注釋。有關如何使用注釋工具的視訊可在此處找到。基本上,有幾個按鍵可以觸發一個動作。滑鼠左鍵用于選擇對象的第一個角,然後一直畫到滿意的時候點選第二次滑鼠左鍵停止。在每一次選擇之後,你有下列選項可用:
- 按c:确認注釋,将注釋變為綠色并确認已存儲
- 按d:從注釋清單中删除最後一個注釋(易于删除錯誤的注釋)
- 按n:繼續下一張圖像
- 按ESC鍵:這将退出注釋軟體
最後,您将獲得一個可用的注釋檔案,該檔案可以傳遞給opencv_createsamples的-info參數。
級聯增強分類器訓練
下一步是基于預先準備的正樣本和負樣本資料集對弱分類器的增強級聯進行實際訓練。
opencv_traincascade應用程式的指令行參數按用途分組:
- 常用參數:
- 級聯參數:
- 提升分類器參數:
- Haar-like特征參數
opencv_traincascade應用程式完成其工作之後,經過訓練的模型将儲存在
-data
檔案夾中的
cascade.xml
檔案中。此檔案夾中的其他檔案是為中斷教育訓練而建立的,是以您可以在教育訓練完成後将其删除。
訓練已完成,你可以測試以下自己的分類器效果!
可視化級聯分類器
有時為了檢視哪些特征被選擇和該階段有多複雜,可視化已訓練好的分類器是有用的。為此,OpenCV提供了一個opencv_visualisation應用程式。該應用程式具有以下指令:
-
:輸入模型的示例圖檔路徑。這應該是标注,标注[-w,-h]傳遞給opencv_createsamples和opencv_traincascade應用程式。--image(required)
-
:訓練模型的路徑,該路徑應該位于opencv_traincascade應用程式的-data參數提供的檔案夾中。--model(required)
-
:如果提供了必須事先手動建立的資料檔案夾,階段輸出和特征視訊将被儲存。--data(optional)
下面是一個示例指令
opencv_visualisation --image=/data/object.png --model=/data/model.xml --data=/data/result/
目前可視化工具的一些限制
- 僅處理由opencv_traincascade工具訓練的級聯分類器模型,其中包含樹樁作為決策樹[預設設定]。
- 提供的圖像必須是帶有原始模型尺寸的樣本視窗,并傳遞給–image參數。
在給定的Angelina Jolie視窗上運作了HAAR / LBP人臉模型的示例,與級聯分類器檔案具有相同的預處理-> 24x24像素圖像,灰階轉換和直方圖均衡化: