目標檢測的程序如人臉檢測,但其中需要一個培訓文件 haarcascade_frontalface_default.xml。對於不同的檢測目標,這個文件不同,怎麼得到這個文件呢?這就是本文要介紹的。
最開始在網上查找,有很多介紹,其中需要幾個培訓用的執行文件。在我的新版本4.x opencv 裏找不到,後來聽說只有3.x 的版本里有。我下載了一個opencv 3.4.7,找到了介紹中的執行文件。我想opencv 裏應該也有介紹,opencv 3.4.7 版本里只有markdown 類文件,可以用Typora 閱讀。後來在我的opencv 3.0beta版本里找到了html,其目錄路徑是:
file:///E:/opencv/sources/doc/haartraining.htm
本文就以他們的內容爲藍本吧。
兩個階段:訓練階段和檢測階段。 對象檢測中介紹了使用基於HAAR或LBP模型的檢測階段。 本文概述了訓練自己的分類級聯所需的功能。 其包括不同階段:收集訓練數據,準備訓練數據並執行實際模型訓練。
爲了支持本教程,將使用幾個官方的OpenCV應用程序:opencv_createsamples ,opencv_annotation,opencv_traincascade和 opencv_visualisation。
這些文件可以在我的網站下載:www.liwensoft.com/downloads/train.zip 我測試了一下下載,因爲有好些都是執行文件,容易提示危險。
比較安全的方法是下載opencv3.x 的版本,我的這些文件在這個目錄下:C:\opencv347\opencv\build\x64\vc15\bin 。據說4以後的版本就不會有這些文件了。
提示:
opencv_traincascade支持HAAR 和LBP(局部二進制模式)。與HAAR產生浮點精度特徵相比,LBP特徵產生整數精度,因此LBP的訓練和檢測速度都比HAAR特徵快幾倍。關於LBP和HAAR的檢測質量,主要取決於所使用的訓練數據和選擇的訓練參數。可以訓練基於LBP的分類器,該分類器將在訓練時間的一定百分比內提供與基於HAAR的分類器幾乎相同的質量。
opencv_traincascade應用程序可以使用TBB進行多線程處理。要在多核模式下使用它,必須在啓用TBB支持的情況下構建OpenCV。
準備訓練數據
爲了訓練分類增強級聯,我們需要一組正樣本(包含要檢測的實際對象)和一組負圖像(包含不想檢測的所有內容)。 負樣本集必須手動準備,而正性樣本集是使用opencv_createsamples應用程序創建的。
負樣本
從任意圖像中獲取負樣本。 這些圖像不得包含檢測對象。 負樣品通過背景描述文件傳遞, 它是一個文本文件,其中每個文本行都包含負樣本圖像的文件名(相對於描述文件的目錄)。 該文件必須手動創建。 注意,負樣本和樣本圖像也稱爲背景樣本或背景樣本圖像,在本文檔中可互換使用
負樣本描述文件示例:
假如文件目錄如下:
/img
img1.jpg
img2.jpg
bg.txt
那麼文件 bg.txt 內容:
img/img1.jpg
img/img2.jpg
正樣本
正樣本由opencv_createsamples應用程序創建。增強過程使用它們來定義在嘗試找到感興趣的對象時模型應實際尋找的內容。該應用程序支持兩種生成正樣本數據集的方式。
1.可以從單個正對象圖像生成一堆正值。
2.可以自己提供所有正樣本的內容,僅使用該工具將其切出,調整大小並以opencv所需的二進制格式放置。
雖然第一種方法對固定對象(例如非常剛性的徽標)效果不錯,但對於剛性較差的對象,它往往很快就會失效。在這種情況下,我們建議使用第二種方法。網絡上的許多教程甚至都指出,通過使用opencv_createsamples應用程序,可以生成100個真實對象圖像,而不是1000個人工生成的正值。但是,如果您決定採用第一種方法,請記住以下幾點:
在將其提供給上述應用程序之前,您需要多個正樣本,因爲它僅應用透視變換。
如果您想要一個健壯的模型,請獲取涵蓋對象類中可能出現的各種變化的樣本。例如,對於面孔,您應該考慮不同的種族和年齡段,情緒以及鬍鬚風格。當使用第二種方法時,這也適用。
第一種方法採用帶有公司徽標的單個對象圖像,並通過隨機旋轉對象,更改圖像強度以及將圖像放置在任意背景上,從給定的對象圖像中創建大量正樣本。隨機性的數量和範圍可以由opencv_createsamples應用程序的命令行參數控制。
命令行參數:
-vec <vec文件名> 包含用於訓練的陽性樣本的輸出文件的名稱
-img <圖像文件名> 源對象圖像(例如公司徽標)
-bg <background_file_name> 背景描述文件;包含一張圖像列表,其中粘貼了對象的隨機變形版本以生成正樣本
-num <樣本數> 產生的正樣本數
-bgcolor <background_color> 背景顏色,和下面組合
-bgthresh <background_color_threshold> 背景顏色容忍度,和上面組合
假設當前爲灰度圖像, bgcolor-bgthresh和bgcolor + bgthresh之間的所有像素均視爲透明。
-inv 如果指定,顏色將被反轉
-randinv 如果指定,顏色將隨機反轉
-maxidev <最大強度偏差> 前景樣本像素的最大強度偏差
-maxxangle <max_x_rotation_angle>,
-maxyangle <max_y_rotation_angle>,
-maxzangle <max_z_rotation_angle> 最大旋轉弧度角
-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文件中選項。
也可以從以前標記的圖像的集合中獲取正樣本,這是構建魯棒對象模型時的理想方式。該集合由類似於背景描述文件的文本文件描述。該文件的每一行都對應一個圖像。該行的第一個元素是文件名,第2是對象數量,後跟描述包圍矩形(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:
使用OpenCV的集成註釋工具
從OpenCV 3.x開始,社區一直在提供和維護開源註釋工具,該工具用於生成`-info`文件。如果構建了OpenCV應用程序,則可以通過命令opencv_annotation訪問該工具。
使用該工具非常簡單。該工具接受幾個必需參數和一些可選參數:
`--annotations` <b>(必需)</ b>:註釋txt文件的路徑,您要在其中存儲註釋,然後將其傳遞給`-info`參數[示例-/ data / annotations。文本]
`--images` <b>(必填)</ b>:包含帶有對象圖像的文件夾的路徑[示例-/ data / testimages /]
`--maxWindowHeight` <i>(可選)</ i>:如果輸入圖像的高度大於此處的給定分辨率,請使用--resizeFactor調整圖像的大小以便於註釋。
-`--resizeFactor` <i>(可選)</ i>:使用`--maxWindowHeight`參數時用於調整輸入圖像大小的因素。
請注意,可選參數只能一起使用。可以使用的命令示例如下所示
訓練
樣本創建後的下一步是訓練分類器。 它由haartraining實用程序執行。
命令行參數:
-data <dir_name> 存儲受過訓練的分類器的目錄名稱
-vec <vec文件名> 正樣本文件的文件名(通過trainingsamples實用程序或通過任何其他方式創建)
-bg <background_file_name> 背景描述文件
-npos <正樣本數>,
-nneg <負樣本數> 每個分類器階段的訓練中使用的正/負樣本數。合理的值是npos = 7000和nneg = 3000。
-nstages <階段數> 訓練階段數
-nsplits <拆分數> 確定階段分類器中使用的弱分類器。如果爲1,則使用簡單的樹樁分類器;如果爲2或更多,則使用具有number_of_splits內部(拆分)節點的CART分類器
-mem <memory_in_MB> 可用內存,以MB爲單位進行預先計算。您擁有的內存越多,訓練過程就越快
-sym(默認),
-nonsym 指定受訓練的對象類是否具有垂直對稱性。垂直對稱加快了訓練過程。例如,正面顯示出垂直對稱
-minhitrate <min_hit_rate> 每個階段分類器的最小期望命中率。總體命中率可以估計爲(min_hit_rate ^ 階段數)
-maxfalsealarm <max_false_alarm_rate> 每個階段分類器的最大期望誤報率。總體誤報率可以估計爲(max_false_alarm_rate ^ number_of_stages)
-weighttrimming <weight_trimming> 指定是否以及應該使用多少修剪重量。不錯的選擇是0.90。
-eqw
-mode <BASIC (default) | CORE | ALL> 選擇訓練中使用的haar功能集的類型。 BASIC僅使用直立功能,而ALL使用整套直立和45度旋轉功能集。有關更多詳細信息,請參見[1]。
-w <sample_width>,樣本寬
-h <sample_height> 樣本高
提升分類器參數:
`-bt <{DAB,RAB,LB,GAB(默認)} >>:增強分類器的類型:DAB-離散AdaBoost,RAB-真實AdaBoost,LB-LogitBoost,GAB-溫和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>`:指定是否應使用修剪及其權重。不錯的選擇是0.95。
`-maxDepth <max_depth_of_weak_tree>`:一棵弱樹的最大深度。一個不錯的選擇是1,這是樹樁的情況。
`-maxWeakCount <max_weak_tree_count>`:每個級聯階段的弱樹的最大數量。提升分類器(階段)將具有如此多的弱樹(<= maxWeakCount),以實現給定的“ -maxFalseAlarmRate”。
-Haar的特徵參數:
`-mode <BASIC(默認)|CORE | ALL>`:選擇訓練中使用的Haar功能集的類型。 BASIC僅使用直立功能,而ALL使用整套直立和45度旋轉功能集。
-本地二進制模式參數:本地二進制模式沒有參數。
訓練樣本的大小(以像素爲單位)。 必須具有與訓練樣本創建過程中使用的值(實用訓練樣本)完全相同的值
opencv_traincascade應用程序完成工作後,經過訓練的級聯將保存在`-data`文件夾的`cascade.xml`文件中。 此文件夾中的其他文件是爲中間培訓而創建的,因此可以在培訓完成後將其刪除。
培訓已完成,可以測試級聯分類器!
也可參考博客
https://blog.csdn.net/carson2005/article/details/8171571
https://blog.csdn.net/qq_32502511/article/details/79010509