1. 程式人生 > >AdaBoost 人臉檢測介紹(6) : 使用OpenCV自帶的 AdaBoost程式訓練並檢測目標

AdaBoost 人臉檢測介紹(6) : 使用OpenCV自帶的 AdaBoost程式訓練並檢測目標

6. 使用OpenCV自帶的 AdaBoost程式訓練並檢測目標 

  OpenCV自帶的AdaBoost程式能夠根據使用者輸入的正樣本集與負樣本集訓練分類器,常用於人臉檢測,行人檢測等。它的預設特徵採用了Haar,不支援其它特徵。人臉目標檢測分為三個步驟:樣本建立、訓練分類器、利用訓練好的分類器進行目標檢測。

6.1 準備工作

  ● OpenCV(版本2.4.10)
  ● OpenCV內建的兩個可執行程式:opencv_createsamples.exe 和 opencv_haartraining.exe
  ● N張人臉照片:N當然越大越好,目前從CC主播截圖裁剪了100多張人臉影象。
  ● N張非人臉照片:為了讓程式分辨何為人臉、何為非人臉,這一步也是非常重要的。
  準備好以上的內容之後在D盤下建立了一個face目錄來放置這些內容,如下圖:

這裡寫圖片描述

  其中bin目錄存放了OpenCV的庫和可執行程式,如圖:

這裡寫圖片描述 

  positive目錄存放了108張人臉影象,大小為20 x 20;
  negative 目錄存放了336張非人臉影象,大小為140 x 140;
  data目錄用於存放訓練過程中生成的各種分類器,目前暫時為空。

6.2 樣本建立

  訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意圖片。可以來自於任意的圖片,但這些圖片不能包含目標特徵。在用OpenCV自帶的AdaBoost程式訓練負樣本時,負樣本的大小不一定要與正樣本相同。負樣本由背景描述檔案來描述。背景描述檔案是一個文字檔案,每一行包含了一個負樣本圖片的檔名(基於描述檔案的相對路徑)。該檔案建立方法如下:
  ● 輸入cmd開啟Dos命令視窗,進入到negtive目錄
  ● 輸入 dir /b > negdata.dat,如圖:

這裡寫圖片描述

  ● 開啟 negdata.dat檔案,將最後一行的negdata.dat刪除,儲存退出,如圖:

這裡寫圖片描述

  對於,通常的做法是先把所有正樣本裁切好,並對尺寸做規整(即縮放至指定大小)。由於HaarTraining訓練時輸入的正樣本是vec檔案,所以需要使用OpenCV自帶的CreateSamples程式將準備好的正樣本轉換為vec檔案。轉換的步驟如下:
  ● 製作一個正樣本描述檔案,用於描述正樣本檔名(包括絕對路徑或相對路徑),正樣本數目以及各正樣本在圖片中的位置和大小。典型的正樣本描述檔案如下:
    positive/1.bmp 1 0 0 20 20
    positive/2.bmp 1 0 0 20 20
    positive/3.bmp 1 0 0 20 20
  不過你可以把描述檔案放在你的positive目錄(即正樣本目錄)下,這樣你就不需要加前面的相對路徑了。同樣它的生成方式可以用負樣本描述檔案的生成方法,最後用txt的替換工具將“bmp”全部替換成“bmp 1 0 0 20 20”就可以了,bmp後面那五個數字分別表示圖片個數,目標的起始位置及寬高。這樣就生成了正樣本描述檔案posdata.dat,如下圖:

這裡寫圖片描述 

  將最後一行的posdata.dat刪除,接下來是將“bmp”全部替換成“bmp 1 0 0 20 20”:

這裡寫圖片描述

  完成之後的posdata.dat檔案如下圖所示:

這裡寫圖片描述

  ● 執行CreateSample程式,如下圖所示:

這裡寫圖片描述

  執行完之後在D:\face\data下生成 pos.vec檔案,該檔案包含正樣本數目、寬高及所有樣本影象資料。 Createsamples程式的一些常用命令列引數:
  -vec      訓練好的正樣本的輸出檔名。
  -img    源目標圖片(例如:一個公司圖示)
  -bg   背景描述檔案。
  -num   要產生的正樣本的數量,和正樣本圖片數目相同。
  -w       輸出樣本的寬度(以畫素為單位)
  -h      輸出樣本的高度,以畫素為單位
 
 ### 6.3 訓練分類器
  樣本建立之後,接下來就要訓練分類器,這個過程是由haartraining程式來實現。該程式原始碼由OpenCV自帶,且可執行程式在OpenCV安裝目錄的bin目錄下。Haartraining的一些常用命令列引數如下:
  -data 存放訓練好的分類器的路徑名。
  -vec 正樣本檔名
  -bg 背景描述檔案。
  -npos 用來訓練每一個分類器階段的正樣本。
  -nneg 用來訓練每一個分類器階段的負樣本。
  -nstages 訓練的階段數。
  -mem 預計的以MB為單位的可用記憶體,記憶體越大則訓練速度越快。
  -minhitrate 每個階段分類器需要的最小的命中率,總的命中率為min_hit_rate的number_of_stages次方。
  -maxfalsealarm 沒有階段分類器的最大錯誤報警率,總的錯誤警告率為max_false_alarm_rate的number_of_stages次方。
  -w  訓練樣本的寬(以畫素為單位),必須和訓練樣本建立的尺寸相同。
  -h 訓練樣本的高(以畫素為單位),必須和訓練樣本建立的尺寸相同。
  
  一個訓練分類器的例子如下圖:

這裡寫圖片描述

  按下Enter鍵之後就開始訓練,如圖:

這裡寫圖片描述
  。。。 。。。
  這裡寫圖片描述
  。。。 。。。
  這裡寫圖片描述

  每一級的強訓練器達到你預設的比例以後就跑去訓練下一級了,那個HR比例不要設定太高,不然會需要好多樣本,然後nstages不要設定太小,不然到時候拿去檢測速度會很慢。訓練結束之後在data目錄下生成了9個目錄,每個目錄下存放了訓練好的分類器,如圖:

這裡寫圖片描述

還會在D:\face目錄下生成 data.xml,下一次就可以拿著這個xml檔案去做檢測了!

這裡寫圖片描述

6.4 開始檢測

採用前面訓練得到的data.xml作為分類器來檢測人臉,此處省略檢測程式碼:

這裡寫圖片描述

檢測效果圖省略!檢測效果不是很理想,需要調整訓練引數和樣本數目,這就需要慢慢琢磨!