天天看點

Cascade Opencv -- train new model

前言

Haar與Adaboost結合即經典的VJ人臉檢測,後續衍生很多特征如LBP、HOG、SURF同Cascade(即Adaboost)結合進行對象檢測;Adaboost和Cascade的算法流程圖如下兩圖描述:

Cascade Opencv -- train new model
Cascade Opencv -- train new model

opencv将參數存儲于xml檔案中,在檢測時直接load即可;因為需要檢測新的物體(電表中的某個螺絲),是以直接需要重新訓練。

編譯訓練環境

unbuntu 13.04 32bit

opencv2.4.11

1. 準備

建立工作目錄,./traincascade/

1.1 工具

編譯opencv後,生成可執行檔案,opencv_createsamples 和opencv_traincascade ,并複制到./traincascade/目錄下。

1.2 樣本

因正樣本最後完全包含待檢測對象,是以使用手動滑鼠劃取ROI。寬高約為sampSize=260*200;獲得550個尺寸在posSize附近的圖像,然後

标準化至sampSize;并存儲于./traincascade/pos檔案夾内。

反樣本使用random方式,随機生成一定的反例(不包含待檢測對象);寬高也為sampSize,并存儲于neg檔案夾内。

最後建立./traincascade/data檔案夾用于存儲訓練後生成的cascade.xml

1.3 資訊

正例資訊,需要包含正例的目錄檔案名以及對象在圖像中的位置,因為正例圖像中全部為待檢測對象,是以位置可以直接設定為0,0,width,height。

ls ./pos/*.jpg > metre.info
           

然後使用.jpg 1 0 0 260 200 替換.jpg

反例資訊,僅需要包含反例的目錄檔案名

ls ./neg/*.jpg > bg.txt
           

2. 訓練

2.1 生成 *.vec

opencv_createsamples -info metre.info -num 550 -w 65 -h 50 -vec metre.vec
           

-w,-h根據資料庫中的資料來确定,此處為260*200縮小4倍,-num後的參數550為pos檔案夾内正樣本的最大數量。

2.2 生成*.xml

opencv_traincascade -data data -vec metre.vec -bg bg.txt -numStages 10 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -numPos 500 -numNeg 500 -w 65 -h 50
           

-numStages為cascade訓練的層數,-numPos 500小于opencv_createsamples生成*.vec時的數目550,一般約定為0.9

最後生成的cascad.xml在data目錄下。

3. 測試

使用opencv提供的人臉檢測sample,載入xml,然後測試訓練後得到的xml檔案能否正常工作。

4. 總結

檢測結果并不理想,是以就不在這裡貼圖了,需要進行參數修正和樣本整理。另一種思路是繼續研究latent svm即cascade dmp

參考

【1】 TRAINCASCADE AND CAR DETECTION USING OPENCV

【2】 Coding Robin

【3】 OpenCV haartraining

【4】 How to train cascade properly

【5】 about traincascade paremeters, samples, and other...

【6】 haar training OpenCV assertion failed