opencv學習筆記 自己訓練人臉識別分類器

2021-08-18 19:35:00 字數 2154 閱讀 6942

在使用opencv自帶的分類器haarcascade_frontalface_alt.xml進行人臉識別的基礎認識後,決定自己訓練乙個分類器看一下效果。該過程大致可分為三個階段:樣本採集、分類器訓練和運用訓練好的分類器進行人臉檢測。

1、樣本的採集

在訓練前,我們需要進行正樣本及負樣本的採集。

負樣本採用的是weizmann團隊 **上的影象分割資料庫裡面的灰色影象,總共200幅,大小大約在300*200畫素,截圖如下所示:

影象採集完畢後,將其分別放在兩個資料夾pos_img(正樣本)和neg_img(負樣本)下。再新建乙個xml資料夾,xml資料夾存放後面訓練過程中產生的資料模型,最後opencv會將其轉換生成乙個xml檔案,也就是最終的分類器。

在命令列視窗輸入:

則在當前目錄下,產生乙個pos.vec檔案。

指令介紹:

-vec pos.vec:指定生成的檔案,最終生成的就是pos.vec; 

-info pos_img\pos.txt:目標描述檔案,在pos\pos.txt; 

-bg neg_img\neg.txt:背景描述檔案,在neg\neg.txt; 

-w 20:輸出樣本的寬度,20; 

-h 20:輸出樣本的高度,20; 

-num 63:要產生的正樣本數量,63;

3、訓練模型

windows控制台進入指定目錄下,我們之前已經在目錄下放了opencv_haartraining.exe檔案,在控制台下輸入opencv_haartraining.exe可以得到各引數資訊: 

然後輸入指令進行訓練:

指令介紹:

-vec pos.vec:正樣本檔名; 

-bg neg_img\neg.txt:背景描述檔案; 

-data xml:指定存放訓練好的分類器的路徑名,也就是前面建立的xml資料夾; 

-w 20:樣本寬度,20; 

-h 20:樣本高度,20; 

-mem 1024:提供的以mb為單位的記憶體,很明顯,這個值越大,提供的記憶體越多,運算也越快; 

-npos 45:取45個正樣本,小於總正樣本數; 

-neg 180:取180個負樣本,小於總負樣本數; 

-nstages 5:指定訓練層數,層數越高耗時越長; 

-nsplits 5:**子節點數目, 預設值 為2;(本來設定為5 ,但訓練時一直出差錯,改為預設值後可正常訓練)。

接下來要做的就是等待訓練結束:

訓練過程引數解釋:

n:層數  %

smp:樣本的使用率 

f : +表示通過翻轉,否則是-

st.thr : 分類器的閾值 

hr:當前分類器 對正樣本識別正確的概率

fa:當前分類器 對負樣本識別錯誤的概率

exp.err : 分類器的期望錯誤率

訓練結束後會在根目錄下生成xml.xml檔案,在xml資料夾下生成最終的分類器:

4、測試

用自己訓練的分類器替換opencv自帶的分類器進行人臉識別:

因為訓練的樣本過少,分類器的層數也不多,分類效果並不好,還有待提高。

如何用opencv訓練自己的分類器

最近要做乙個性別識別的專案,在人臉檢測與五官定位上我採用opencv的haartraining進行定位,這裡介紹下這兩天我學習的如何用opencv訓練自己的分類器。在這兩天的學習裡,我遇到了不少問題,不過我遇到了幾個好心的大俠幫我解決了不少問題,特別是無忌,在這裡我再次感謝他的幫助。一 簡介 目標檢...

opencv學習筆記

總的來說,我們學習影象處理的就是從vs和opencv開始的。而在之前的學習中,我們使用了前人的通過或攝像頭的人臉識別 並順利執行了程式。順理成章地,接下來的階段就是將這些 給 吃透 理解並吸收,掌握其中的知識。下面就是今天對於 中幾個重要組成部分的學習心得總結。一 命名空間 using namesp...

openCV學習筆記

1 imread函式 mat imread const string filename,intflags 1 mat image0 imread dota.jpg cv load image anydepth cv load image anycolor 載入最真實的影象 ge1 imread do...