人臉識別——檢測模型的訓練


人臉檢測——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使用,不詳細介紹。實驗結果如下:

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM