1. 程式人生 > >OpenCV原始碼解析:目標檢測trainCascade演算法剖析之LBP基礎

OpenCV原始碼解析:目標檢測trainCascade演算法剖析之LBP基礎

目標檢測,也叫目標提取,是一種基於目標幾何和統計特徵的影象分割。用級聯分類器實現目標檢測在AI人工智慧識別中應用十分廣泛。

正樣本的選取原則

正樣本的尺寸不是必須一致的,從原始碼可以看到,這個是可以在輸入圖片檔案的尺寸時設定大小從而實現在CreateSamples中進行裁剪的(參考cvCreateTrainingSamplesFromInfo中resize調整圖片大小)。不過我建議你最好事先把尺寸統一處理好,除非你真的知道從圖片的那個畫素點開始裁剪。

資料來源儘可能做到多樣化,比如樣本為車,車的姿態場景應稍豐富些。同一正樣本目標的影象太多會使區域性特徵過於明顯,造成這個目標的訓練過擬合,影響檢測精度,不利於訓練器泛化使用。

內容是這樣的,其中0,0,100,40表示從(0,0)這個畫素點開始裁剪,寬為100,高為40個畫素, pos/pos-532.pgm 1 0 0 100 40 pos/pos-166.pgm 1 0 0 100 40 pos/pos-76.pgm 1 0 0 100 40 pos/pos-193.pgm 1 0 0 100 40 pos/pos-0.pgm 1 0 0 100 40

關於負樣本的準備

原則上負樣本圖片中不能包含正樣本目標;每個負樣本之間應儘量保證各不相同,即確保負樣本的多樣性; 負樣本的尺寸不是必須相同的,但負樣本的尺寸不能小於正樣本向量集影象的寬和高; 整體上來說,負樣本的準備是很簡單的。 這裡的負樣本檔名稱為neg.info。  

使用openCV_createSamples

選擇好樣本之後,就要生成OpenCV生vec向量檔案,然後再進行訓練以得到級聯模型(xml),最後進行目標識別。

這裡我們先講OpenCV生vec向量檔案的過程,理一下原始碼。

先說一下最後生成的那個vec檔案,其檔案結構是這樣的

圖片個數(4位元組) 圖片尺寸(4位元組,灰度圖的位元組數size=寬x高) 0(4位元組)0(1個位元組的圖片分隔符)Data(共計size個位元組)0(1個位元組的圖片分隔符)Data(共計size個位元組)0(1個位元組的圖片分隔符)Data(共計size個位元組) …

可見,vec是一個十分簡單的檔案,生成過程同樣很簡單,如果自己編譯,可以看到在OpenCV的工程目標下,有一個opencv_createSampels的專案,編譯後可以得到opencv_createsamples.exe這個檔案,我的目錄結構是這樣的

執行 opencv_createSamples -info ../dataCascade/cars.info -vec ../dataCascade/possamples.vec -num 550 -w 100 -h 40 pause 程式開始執行,main裡實質呼叫的函式就是cvCreateTrainingSamplesFromInfo 其中 icvWriteVecHeader負責寫入檔案頭, icvWriteVecSample負責寫入檔案分隔符

積分圖,也叫區域求和表,定義

在點 (x, y)處的面積和是該點左邊和上邊全部畫素的和(包括該點本身在內);即,每個畫素點對應的積分值,是該點左上角所有畫素值的和。 有了積分表之後,就可以快速地求得任意麵積的大小,如圖,

假設ABCD為4個點對應的積分,那麼ABCD這個區域內的畫素值的和就是 Sum = D – B – C + A

(更新中,未完待續)