使用級聯分類器工作
包括兩個階段:訓練和檢測。 檢測部分在opencvobjdetect
模組的文件中有介紹,在那個文件中給出了一些級聯分類器的基本介紹。當前的指南描述了如何訓練分類器:準備訓練資料和執行訓練程式。
opencv中有兩個程式可以訓練級聯分類器: opencv_haartraining
和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
和opencv_haartraining
所輸出的分類器檔案格式並不相同。注意,新的級聯檢測介面(參考objdetect
模組中的 cascadeclassifier
類)支援這兩種格式。opencv_traincascade
可以舊格式匯出選練好的級聯分類器。但是在訓練過程被中斷後再重啟訓練過程,opencv_traincascade
andopencv_haartraining
不能裝載與中斷前不同的檔案格式。
opencv_traincascade
程式使用tbb來處理多執行緒。如果希望使用多核並行運算加速,請使用tbb來編譯opencv。
還有一些與訓練相關的輔助程式。
既然 opencv_haartraining是乙個將被棄用的程式,下面將不再介紹,而會主要介紹opencv_traincascade
。opencv_createsamples
程式用來為opencv_traincascade
準備訓練樣本,因此也會介紹它。
訓練需要一些列樣本。樣本分兩類:負樣本和正樣本。負樣本是指不包括物體的影象。正樣本是待檢測的物體的影象。負樣本必須手工準備,正樣本使用opencv_createsamples
建立。負樣本可以是任意影象,但是這些影象中不能包含待檢測的物體。用於摳取負樣本的影象檔名被列在乙個檔案中。這個檔案是純文字檔案,每行是乙個檔名(包括相對目錄和檔名)。負樣本和樣本影象也叫做背景樣本,或者背景樣本影象,本文件中對之不予區分。這些影象可以是不同的尺寸,但是影象尺寸應該比訓練視窗的尺寸大,因為這些影象將被用於摳取負樣本,並將負樣本縮小到訓練視窗大小。
下面是乙個描述檔案的例子:
假如目錄結構如下:
則bg.txt檔案中的內容將如下所示:
正樣本由 opencv_createsamples
生成。正樣本可以由包含待檢測物體的一張生成,也可由一系列標記好的影象生成。
請注意你需要乙個很大的負樣本庫送給訓練程式進行訓練。如果是絕對剛性的物體,如opencv的標誌,你只有一張正樣本影象;如果是人臉,你需要幾百甚至幾千個正樣本。在待檢測物體是人臉的情況下,你需要考慮所有的人種、年齡、表情甚至鬍子的樣式。
如果只有一張包含物體的影象,如乙個公司的標誌,那麼可以通過對物體影象的隨機旋轉、改變標誌亮度以及將標誌放在任意的背景上而獲得大量的正樣本。生成的正樣本數目以及隨機的程度都可以通過opencv_createsamples
的命令列引數控制。
命令列引數:
建立樣本的流程如下: 輸入影象沿著三個軸隨機旋轉。旋轉的角度由 -max?angle
限定。然後畫素的亮度值位於 [bg_color-bg_color_threshold
;bg_color+bg_color_threshold
]範圍的畫素被設定為透明畫素。將白雜訊加到前景影象上。如果指定了-inv
,那麼前景影象的顏色將被翻轉。如果指定了-randinv
,程式將隨機選擇是否將顏色進行翻轉。任選背景影象,將獲得的前景影象放到背景影象上,並將影象調整到-w
和-h指定的大小。最後將影象存入vec檔案,vec檔名由命令列引數-vec
指定。正樣本也可從一系列事先標記好的影象中建立。標記資訊可以儲存於乙個文字檔案,與背景描述檔案類似。檔案中的每行對應乙個影象檔案。每行的第乙個元素為影象檔名,後面是物體的數目,最後是物體位置和大小的描述 (x, y, width, height)。
下面是描述檔案的例子:
假設目錄結構如下:
檔案info.dat裡的內容如下:
影象img_with_faces_1.jpg中包含乙個物體例項(如人臉),標示其在影象中的位置和大小的矩形為(140, 100, 45, 45)。影象img_with_faces_2.jpg包含兩個物體例項。
從這樣的一系列資料中建立正樣本,需要在命令列指定 -info
而非前面所用的 -img
引數:
此部分樣本建立過程如下:將物體例項從影象中摳取出,然後將之調整尺寸到目標尺寸,然後儲存到輸出的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_traincascade
和opencv_haartraining
都可用來訓練乙個級聯分類器,但是此處只介紹opencv_traincascade
。opencv_haartraining
的用法與opencv_traincascade
類似。下面是 opencv_traincascade
的命令列引數,以用途分組介紹:
通用引數:
級聯引數:
boosted分類器引數:
類haar特徵引數:
lbp特徵引數:
lbp特徵無引數。
當 opencv_traincascade
程式訓練結束以後,訓練好的級聯分類器將儲存於檔案cascade.xml中,這個檔案位於-data
指定的目錄中。這個目錄中的其他檔案是訓練的中間結果,當訓練程式被中斷後,再重新執行訓練程式將讀入之前的訓練結果,而不需從頭重新訓練。訓練結束後,你可以刪除這些中間檔案。
訓練結束後,你就可以測試你訓練好的級聯分類器了!
[viola2001]
paul viola, michael jones. rapid object detection using a boosted cascade of ****** 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.
級聯分類器訓練
一.準備正負樣本 正樣本 225張車牌 負樣本 將opencv traincascade.exe和opencv createsamples.exe複製到同一目錄 樣本存放路徑 二.檔案 dat vec 準備 得到pos.txt檔案,所有非資訊刪掉,最後一行空格刪掉,jpg替換為jpg 1 0 0 1...
級聯分類器訓練
adaboost分類器由級聯分類器構成,級聯 是指最終的分類器是由幾個簡單分類器級聯組成。在影象檢測中,被檢視窗依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。分類器訓練完以後,就可以應用於輸入影象中的感興趣區域的檢測。檢測到目標區...
OpenCV級聯分類器訓練
級聯分類器包括兩部分 訓練和檢測。檢測部分在opencv objdetect 模組的文件中有介紹,在那文件中給出了一些級聯分類器的基本介紹。這個指南是描述如何訓練分類器 準備訓練資料和執行訓練程式。opencv中有兩個程式可以訓練級聯分類器 opencv haartraining and openc...