開篇-HOG提取訓練檢測+樣本制作


利用HOG特征訓練分類器說明文檔-By miracled

整體框架: 樣本制作+訓練+檢測 - (vs2008 + opencv2.3.1 + libsvm(可換用svmlight需改動部分源代碼))

1. 樣本制作:Make_Sample類

1.1功能大致如下(如需要詳細的介紹,請直接參看源碼)

  Make_Sample() : 加載摳選參數可以采用這種方式,構造實例。

  Make_Sample(Size winSize,Point tl = Point(),double ratios = 1.0,int numPerPic = 1);

     winsize:指定摳選區域的大小

      tl:指定摳選窗口的左上頂點,如果為(-1,-1)則隨機在輸入圖像有效區域內隨機選取。

      ratios:指定輸入圖像的縮放比例,如果 <0則隨機有效的比率。最大比率定義在make_sample.h中的MAXRATIOS中,可以自行修改。

      numPerPic:指定每張輸入圖片中輸出樣本的數量,為隨機摳選選項。

  int Make(string root,string type,string savePath,void (*Proccess)(Mat& ) = 0);

      root:輸入圖片的路徑。

      type:輸入圖片的格式。

      savePath:摳選樣本保存的路徑。

      void Process(Mat& image):圖像的預處理函數,這個函數可以自行編寫你的預處理過程。

     int Make(string parmFile, string savePath,void (*Proccess)(Mat& ) = 0);

      parmFile:摳選參數,形如

        G:/database/test/imagexx.jpg 0 0 128 64 1

        G:/database/test/366.jpg 0 0 128 64 1

        G:/database/test/1568.jpg 0 0 128 64 1

        G:/database/test/1939.jpg 0 0 128 64 1

        path (x,y) winSize ratios // 路徑 左上頂點 窗口大小 縮放比例

        savePath:樣本保存路徑。

        void Process(Mat& image):自定義預處理函數。

 

2. 訓練

2.1 HOG特征提取(使用前請參看后面的5個注意事項)

  bool initHogs(int num);

    功能:初始化訓練參數

    num:提取樣本的個數

  void DetectPacket(Mat& img,Mat& grad_ang);

    功能:計算輸入圖像img的角度和梯度,保存在grad_ang中

  void calculateHogs(Mat& grad_ang,Point tl);

    功能:計算一張大圖中以tl為左上頂點檢測窗口的HOG特征(為檢測和尋找困難樣本而設置)

    grad_ang:梯度和角度

    tl:檢測窗口的左上頂點

  void calculateHogs(Mat& grad_ang,int ipic);

    功能:計算樣本大小,第ipic個樣本的HOG特征(為訓練而設置)

    grad_ang:梯度和角度

    ipic:樣本的編號。

  void saveHog(char *hpath,int label,bool iscls = false) const;

    功能:保存訓練得到的hog特征

    hapth:保存的全路徑

    label:保存的標簽

    iscls:是否清除上次保存的結果,默認不清除,使用append寫入。

  Mat getHogs() const { return vfeature; }

    功能:獲取訓練得到的hog特征

  float *getHogs(int ipic) const

    功能:獲取索引為ipic的樣本hog特征

  int FeatureLength() const { return parm.len; }

    功能:獲取特征的維數

  int Height() const { return parm.height; }

    功能:獲取檢測窗口的高度

  int Width() const { return parm.width; }

    功能:獲取檢測窗口的寬度

2.2使用hog特征需要注意的幾點:

  1、只定義了9方向

  2、只定義L2歸一化

  3、需要使用請解開//#define _GAMMA_COMPRESS_的注釋

  4、高斯加權模板采用的16x16的如果block大小不是(16,16)則需要改動,請參看並修改static double* getGaussMask()函數

  5、提取前需要加載配置文件Hogcfg.ini

      width: 128  

      height: 64

      block: 2

      cell: 8

      normt: 0  //這個參數預留,需要自己添加block歸一化方法

3. 訓練分類器

3.1獲取訓練數據

  void getTrainData(char *root, char *type, int label, char *matlab_data)

    功能:獲取hog訓練數據。

    root:當前訓練樣本位置

    type:訓練樣本格式

    label:訓練樣本標簽

    matlab_data:訓練樣本保存名稱

  注意:樣本必須同檢測窗口大小,並且具有相同的標簽,例如

  getTrainData("G:/database/car_detect/pos4/",".jpg",1,"train.txt");

  getTrainData("G:/database/car_detect/neg4/",".jpg",-1,"train.txt"); 保存名稱需要相同,不然需要自己黏貼    到一個文件中參與訓練。

3.2 訓練

  step1:訓練一輪

    訓練方法主要有兩種

  第一種:

    需要下載libsvm,使用其中的svm-train.exe文件

    已經打包到一起了,在根目錄下找到training_bat.bat,將其中的train.txt修改成你的訓練數據名字,雙擊運行training_bat.bat就可以直接訓練一輪得到一個libsvm的model,想自己設定參數請參看svm-train-usage.txt,如何使用svm-train.exe文件。

  第二種:

    使用matlab訓練,不過需要修改hog特征提取中的

    void saveHog(char *hpath,int label,bool iscls = false) const方法。然后將訓練數據加載到matlab里訓練就可以了。

注:這里得到的libsvm-model都比較大,如果使用的是線性的model的話,使用void changeModel(char *modelname,char *newmodelname,int fealen)方法轉化一下就可以得到一個比較小的model,

    modelname:libsvm的model,

    newmodelname:自定義保存model的名字,

    fealen:特征的維數,使用第二種方式訓練的在matlab中轉化可以參看源碼(很簡單的)。

  step2:搜索困難樣本

    void findHardSample(char *modelname,char *hardroot,char *type,char *matlab_hard);

      功能:利用訓練好的線性模型搜索困難樣本集,將困難樣本數據保存在matlab_hard中

      modelname:一個已訓練好的線性mode

      hardroot:困難樣本集路徑

      type:樣本擴展名

      matlab_hard:保存困難樣本的文件名

step2完成以后,挑選需要再次訓練的困難樣本與第一輪訓練的數據合並,重復step1可以得到最終的分類器。

3. 檢測

  int detectCar(char *modelname,char *imfile);

    功能:檢測一張圖片中是否含有目標。

    modelname:分類器的路徑

    imfile:圖片的路徑

注意:

1、顯示結果請打開//#define _SHOW_DETECT_RESULT_前的注釋

2、關於多框的問題請調節,一下方法,具體如何調節請參看源碼或網絡

    //PostProcess(carRect,1);

                  PostProcess(carRect,2);

    //RemoveCoveredRectangles(carRect);

使用注意事項:code供學習使用,本人測試能用於檢測,但不保證沒有任何bug。

以上文檔下載包已包含

下載地址:http://pan.baidu.com/share/link?shareid=137019&uk=3104776594


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM