在使用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...