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


    人脸检测——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:opencvuildx64vc14in                            (切到opencv_createsamples.exe的文件路径下)

         2.输入:  opencv_createsamples -info H:cascadetrainpositiveinfo.dat -vec H:cascadetrainmysamples_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:cascadetrainmysamples_342.vec -bg H:cascadetrain egativeimg.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...
    ");
            return -1;
        }
        namedWindow("demo-win", CV_WINDOW_AUTOSIZE);
        Mat src = imread("H:/123.jpg");   //读取图片
        if (src.empty()) {
            printf("could not load image...
    ");
            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使用,不详细介绍。实验结果如下:

          

  • 相关阅读:
    强弱类型 静态语言 动态语言 || 脚本语言
    mysql版本升级问题处理
    word
    IntelliJ IDEA 插件
    dubbo
    spring源码构建
    zookeeper 本地多线程模拟分布式事务控制及配置中心
    一次性关闭所有的Activity
    可能以后用得到得东西
    Thread.sleep还是TimeUnit.SECONDS.sleep
  • 原文地址:https://www.cnblogs.com/Jack-Elvis/p/12722468.html
Copyright © 2020-2023  润新知