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 樣本建立
訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意圖片。
● 輸入cmd開啟Dos命令視窗,進入到negtive目錄
● 輸入 dir /b > negdata.dat,如圖:
● 開啟 negdata.dat檔案,將最後一行的negdata.dat刪除,儲存退出,如圖:
對於
● 製作一個正樣本描述檔案,用於描述正樣本檔名(包括絕對路徑或相對路徑),正樣本數目以及各正樣本在圖片中的位置和大小。典型的正樣本描述檔案如下:
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作為分類器來檢測人臉,此處省略檢測程式碼:
檢測效果圖省略!檢測效果不是很理想,需要調整訓練引數和樣本數目,這就需要慢慢琢磨!