人脸识别——检测模型的训练


人脸检测——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