人臉檢測——Haar、LBP分類器模型訓練

一、樣本數據集

*這里需要注意的是正樣本的大小和尺寸一定要是統一的
這里提供博主找到的數據集鏈接:https://pan.baidu.com/s/1MQnFwvlR2aHJkah_vaX9rg 提取碼:yeop
里面的兩個.bat文件生成描述文件用到 。
二、 正負樣本數據描述文件生成:

如上圖所示我們需要對正樣本產生.dat文件、負樣本產生.txt文件。
具體產生方法請參看連接:https://www.cnblogs.com/Jack-Elvis/p/12822372.html
三、使用opencv_createsamples.exe生成正樣本.VEC文件
在OpenCV的安裝文件中有一個opencv_createsamples.exe路徑如圖所示:

接下來我們 "win+R" 、 cmd ,打開命令窗口 ;
1. 輸入: cd /d E:\opencv\build\x64\vc14\bin (切到opencv_createsamples.exe的文件路徑下)
2.輸入: opencv_createsamples -info H:\cascadetrain\positive\info.dat -vec H:\cascadetrain\mysamples_342.vec
-num 185 -bgcolor 0 -bgthresh 0 -w 24-h 24 (生成正樣本.VEC文件)
說明:
-info, 指樣本說明文件
-vec, 樣本描述文件的名字及路徑
-num, 訓練正樣本的總共數量
-w -h , 指明想讓樣本縮放到什么尺寸。

四、訓練樣本生成人臉檢測分類器
此時我們可以看到正樣本的VEC文件:

繼續在命令框輸入:
opencv_traincascade -data H:\cascadetrain -vec H:\cascadetrain\mysamples_342.vec -bg H:\cascadetrain\negative\img.txt -numPos 170 -numNeg 500 -numStages 12 -featureType LBP -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 (自行修改文件路徑,三個位置)

-numStages 訓練的層數
-featureType 訓練的方法 LBP/Haar
-w -h 指明想讓樣本縮放到什么尺寸
-minHitRate 最小命中率
-maxFalseAlarmRate 最大虛警率 (專業名詞百度一下就知道)
訓練結果如下:

共訓練10個stage達到訓練要求完成訓練。相應生成文件如下

其中生成的cascade.xml文件為我們需要的分類器。
五、調用分類器檢測人臉
代碼如下:
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; CascadeClassifier face_cascader; //定義一個分類器變量 String haarfile = "H:/cascadetrain/cascade.xml"; int main(int argc, char** argv) { if (!face_cascader.load(haarfile)) { //加載haar分類器xml文件 printf("could not load image...\n"); return -1; } namedWindow("demo-win", CV_WINDOW_AUTOSIZE); Mat src = imread("H:/123.jpg"); //讀取圖片 if (src.empty()) { printf("could not load image...\n"); return -1; } imshow("input image", src); Mat gray; vector<Rect> faces; cvtColor(src, gray, COLOR_BGR2GRAY); //轉化為灰度圖像 equalizeHist(gray, gray); //均值化 int st = getTickCount(); //st被賦值此時間 face_cascader.detectMultiScale(gray, faces, 1.3, 3, 0, Size(40, 40)); int et = (getTickCount() - st); // et=此時的時間-st (人臉檢測時間) printf("time consume : %d", et); for (size_t t = 0; t < faces.size(); t++) { //畫出檢測出的每個人臉 rectangle(src, faces[t], Scalar(255, 0, 0), 2, 8, 0); } imshow("demo-win", src); waitKey(0); return 0; }
代碼比較簡單,前面都有相關API使用,不詳細介紹。實驗結果如下:

