1. 程式人生 > >目標檢測(從樣本處理到訓練檢測)訓練級聯分類器

目標檢測(從樣本處理到訓練檢測)訓練級聯分類器

一直在複習期末考試,沒能及時的將整個檢測過程寫來了。正好最近考完了,而且上個月做的檢測結果出現部分的漏檢,於是決定從頭再來一次,就當做是加深印象了。做的這個實驗是百香果的識別與檢測,類似行人和人臉檢測,下面簡單寫點自己對訓練級聯分類器整個流程淺薄的認識。下面就開始啦,整個訓練檢測過程主要是這樣的 :樣本處理—>訓練分類器—>目標檢測。

一:樣本的處理

1:正樣本的處理。正樣本,也就是我們包含需要檢測的目標的樣本集,如行人檢測當中的行人、人臉識別當中的人臉。這裡就需要我們自己準備樣本了,拍照或者是提取視訊幀。一般在正式使用正樣本之前需要對其進行歸一化處理,人工裁剪很難保證精度而且費時費力,可以用一段精簡的matlab程式就可以解決,作用是將尺寸不一的正樣本歸一化成大小統一的如30X30、50X50的訓練樣本。然後就是重新命名問題了,簡單來做就是按數字排序來命名,1.jpg、2.jpg。。n.jpg以此類推,接著就要運用批處理命令,獲取正樣本路徑列表,這其實就是為了之後生成正樣本的的VEC檔案做準備。

其中/s是取絕對路徑,/b只取當前路徑,我們用的是/b倆者都可,只是在獲得正樣本vec檔案是命令書寫差異而已。

生成的檔案格式如圖所示,其中要把非樣本路徑的刪掉,然後再將jpg替換成jpg 1 0 0 m m ,1代表個數,可以理解成正樣本為1,

後四位代表影象座標 left top width height。至此,正樣本準備已經結束,下面就是生成vec檔案了,vec檔案其實就是儲存的每一個samples圖,

並且已經統一了w和h的大小,因為cascade訓練要用的就是vec檔案。針對這個,也可以寫一個批處理命令

其中,opencv_createsamples.exe 是opencv封裝好的,直接拿來用就可以了。-info 是之前處理的正樣本的路徑文字,-vec是生成檔案的路徑已經檔名,

-num是正樣本數,-w、-h是歸一化的樣本大小。到這裡,正樣本的處理全部完成了。

2:負樣本的處理。負樣本的處理就沒正樣本那麼複雜了,直接用原圖不需要剪裁,只需要用處理正樣本的方法命名,然後批處理儲存樣本路徑在一個文字資料夾當中就行了,格式同正樣本。

總結一下:在正式訓練之前我們需要準備的一個資料夾裡包括:正樣本、正樣本vec檔案、負樣本,opencv庫裡自帶的動態檔案,opencv_traincascade.exe(級聯程式)

二:訓練分類器

訓練的程式也是可以用bat命令編寫的,其實在dos命令視窗也是同樣可以執行,不過編寫批處理較為簡單,易修改。先說一下訓練程式碼。


備註:-data 是儲存生成分類器的檔名

-vec是 處理的儲存正樣本samples

-bg 是負樣本的samples

-numPos和-numNeg是正負樣本數(後有註解)

-numStages 是訓練層數(一般14層以上)

-featureType 是提取的樣本特徵,比如HOG、LBP,還有用opencv_haartrainning訓練的haar特徵

-mem是訓練分配記憶體

-w和-h是正樣本尺寸

-minHitRate 和 -maxFalseAlarmRate分別設定最小檢測率和最大誤檢率,其餘預設。

Tips:-mem有的訓練當中這個引數沒設值,在我們的實驗中,這個值顯得非常重要,不僅要設值,而且特定樣本還需要分配更多的記憶體。

-data 這個引數有時需要我們自己先定義一個空的資料夾來儲存訓練好的分類器,實驗過程中遇到沒新建就報錯的。

-numPos其實並非實際正樣本數,實際引數值應設定比正樣本值稍小一點,每一層訓練完之後都會自增,所以這裡的設定是第一層的訓練數,之後每層逐漸累加,這裡還是經常報錯的地方。



上圖是一些較為常見的報錯,已經執行的截圖。下面說下經常報錯的解決辦法:

(1)如果出現 Parameters can not be written, because file haarcascade/params.xml can not be opened 錯誤,可以手動建立一個資料夾 haarcascade,這裡就是說的要新建一個data資料夾。

(2)如果出現 Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vex-file 錯誤,這裡就是剛說的這是numPos值的問題。

(3)還有常見的就是正樣本輸入問題,要保證vec檔案create檔案讀取完成。

等這個bat跑完成,那麼訓練過程也就結束了,生成的檔案如下所示


三:目標檢測

完成上面的訓練,得到xml檔案,基本上整個過程進行了90%了。檢測程式碼,opencv裡面有封裝好的程式,或者自己找也可以,網上有大把的。把分類器換成我們訓練好的cascade.xml 注意路徑問題就行了。

四:總結
因為訓練程式碼opencv裡面都封裝好,所以整個過程只要處理好樣本問題,就不是很難做了。這裡再說點,目標檢測自己的一些認知,先貼上一張圖。

整個檢測過程大概可以通過這幅圖來表述,我們首先要做的就是利用現有的樣本、程式碼訓練處分類器進行簡單的檢測。可想而知,檢測見過可能並不是很理想,這時就需要我們進入演算法部分,去改進程式碼。我把這種改進歸結為兩類,一是特徵提取部分比如hog提取特徵;另一個是檢測部分、比如輸入待檢樣本進行一些預處理啊,如何利用現有的演算法進行改進,提高精度和速度,這才是在之前的基礎上要完成的。所以下一步就是需要深入到每一個部分,進行優化再整合。