OpenCV之级联分类器训练与使用(五) HAAR_LBP级联分类器训练

OpenCV自带的训练工具:E:/opencv/opencv-3.1.0/build/x64/vc14/bin/opencv_createsamples.exe 创建正样本的工具
                      E:/opencv/opencv-3.1.0/build/x64/vc14/bin/opencv_traincascade.exe  训练级联分类器的工具,训练出来的级联数据文件也是一个xml的文件
                            (E:/opencv/project/workspace_vs/OpenCV310Sources_contrib/install/x64/vc14/bin下的工具的名称后都多带了一个 d )
                      负样本的数量不要小于正样本的数量(5倍正样本数),如果训练的是人脸,那么负样本的图片不要带人脸就行

基本流程:

1. 收集样本数据 – 包括正负样本

    以人脸检测为例 –公开的数据库有    (可以去下载,但是不精确)
    正向样本数目  (可以在视频中采集人脸)
    负样本数目   (也可以在不出现人脸的视频中采集,负样本最好包罗万象)
    正向样本的大小 – 统一尺寸  (图片宽高可以不一样,但是宽高比必须是1:1)
    正向样本图片中的背景问题    (背景没处理好,会影响训练的效果)

2. 数据规范化 – 大小、格式

这里写图片描述

3. 生成vec文件与负样本列表文本文件

        .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_createsamplesd.exe
        Usage: opencv_createsamplesd.exe
          [-info <collection_file_name>]                                        // 收集的文件的路径
          [-img <image_file_name>]
          [-vec <vec_file_name>]                                                // 在vec_file_name目录下生成vec文件
          [-bg <background_file_name>]                                          // 上面提到的背景问题,可以通过这个解决
          [-num <number_of_samples = 1000>]                                     // 样本数
          [-bgcolor <background_color = 0>]                                     // 背景颜色
          [-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
          [-maxidev <max_intensity_deviation = 40>]                             // 最大的灰度方差,默认40
          [-maxxangle <max_x_rotation_angle = 1.100000>]                        // 如果样本图像有旋转,可以使用这三个参数来旋转,有默认值
          [-maxyangle <max_y_rotation_angle = 1.100000>]
          [-maxzangle <max_z_rotation_angle = 0.500000>]
          [-show [<scale = 4.000000>]]
          [-w <sample_width = 24>]                                              // 输出的样本图像的宽高
          [-h <sample_height = 24>]

        .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_createsamplesd.exe -info E:\opencv\trainSample\positive\info.dat 
            -vec E:\opencv\trainSample\positiveFaces.vec -num 185 -bgcolor 0 -bgthresh 0 -w 24 -h 24
        Info file name: E:\opencv\trainSample\positive\info.dat
        Img file name: (NULL)
        Vec file name: E:\opencv\trainSample\positiveFaces.vec
        BG  file name: (NULL)
        Num: 185
        BG color: 0
        BG threshold: 0
        Invert: FALSE
        Max intensity deviation: 40
        Max x angle: 1.1
        Max y angle: 1.1
        Max z angle: 0.5
        Show samples: FALSE
        Width: 24
        Height: 24
        Create training samples from images collection...
        Done. Created 185 samples

        .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe
        Usage: opencv_traincascaded.exe
          -data <cascade_dir_name>                                              // 在cascade_dir_name目录下生成级联数据文件
          -vec <vec_file_name>                                                  // 传入上面创建好的vec文件
          -bg <background_file_name>                                            // 负样本文件(bg.txt与img文件夹),需要放到与 opencv_traincascaded.exe 命令同目录,绝对路径不可以?
          [-numPos <number_of_positive_samples = 2000>]                         // 每个训练(stage)时的正样本数,不要大于等于总正样本数
          [-numNeg <number_of_negative_samples = 1000>]                         // 负样本数,可以大于总负样本数,大于的时候opencv会自动从负样本图像中切一部分区域出来,所以负样本图像尺寸最好找大一点的
          [-numStages <number_of_stages = 20>]                                  // stage数
          [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]
          [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]
          [-baseFormatSave]
          [-numThreads <max_number_of_threads = 5>]
          [-acceptanceRatioBreakValue <value> = -1>]
        --cascadeParams--
          [-stageType <BOOST(default)>]                                         // 对应级联数据文件中的stageType标签,只有 BOOST ?
          [-featureType <{HAAR(default), LBP, HOG}>]                            // 特征类型 HAAR(default), LBP, HOG 三个选择
          [-w <sampleWidth = 24>]                                               // 与上面的 opencv_createsamplesd.exe 命令的 -w -h 要一致
          [-h <sampleHeight = 24>]
        --boostParams--
          [-bt <{DAB, RAB, LB, GAB(default)}>]                                  // Boost算法
          [-minHitRate <min_hit_rate> = 0.995>]                                 // 最小命中率,比如有1000个正样本,如果此值为0.995,那么会有5个正样本不会被训练
          [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]                     // 虚警率,度量检测器对负样本的通过能力,显然越接近0越好。每一个stage的minHitRate必须非常高(>=0.995)!而maxFalseAlarmRate则可以“温和”一些
          [-weightTrimRate <weight_trim_rate = 0.95>]
          [-maxDepth <max_depth_of_weak_tree = 1>]
          [-maxWeakCount <max_weak_tree_count = 100>]                           // 弱分类器数,如果用100个还训练不出来就不要训练了。。
        --haarFeatureParams--
          [-mode <BASIC(default) | CORE | ALL                                   // 上面的 featureType 选用Haar时会用到, BASIC仅仅使用垂直特征, ALL表示使用垂直以及45度旋转特征
        --lbpFeatureParams--
        --HOGFeatureParams--

        .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe -data E:\opencv\trainSample 
            -vec E:\opencv\trainSample\positiveFaces.vec -bg bg.txt -numPos 170 -numNeg 500 -numStages 12 -featureType LBP -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5
        如果训练stage数超过了numStages 还没有结束的话,表示训练失败,训练也就结束了。 numStages minHitRate maxFalseAlarmRate 这三个参数可以影响训练的进程。
            会生成 cascade.xml(除了这个其他都是中间产物,可以删除) params.xml stage0到8.xml  文件  

        .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe -data E:\opencv\trainSample\haar 
            -vec E:\opencv\trainSample\positiveFaces.vec -bg bg.txt -numPos 170 -numNeg 500 -numStages 12 -featureType HAAR -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 -mode ALL
        也会生成 cascade.xml params.xml stage0到8.xml 文件         // HAAR的训练比LBP要慢很多很多

    出现 Required leaf false alarm rate achieved. Branch training terminated. 表示训练成功

4. 使用OpenCV自动的级联分类器训练工具,训练样本数据

5. 得到最终的级联分类器数据(XML格式)

代码

    #include "../common/common.hpp"

    static String facefile = "trainSample/haar/cascade.xml"; // LBP 与 HAAR 训练数据
    static CascadeClassifier face_detector;

    void main(int argc, char** argv) 
    {
        face_detector.load(getCVImagesPath(facefile));
        Mat src = imread(getCVImagesPath("images/facedetection.png"), IMREAD_COLOR);
        imshow("src4-11", src);
        Mat gray;
        cvtColor(src, gray, COLOR_BGR2GRAY);
        equalizeHist(gray, gray);
        vector<Rect> faces;
        face_detector.detectMultiScale(gray, faces, 1.1, 6, 0, Size(80, 80));
        for (size_t t = 0; t < faces.size(); t++) 
        {
            rectangle(src, faces[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
        }
        imshow("detect faces", src);

        waitKey(0);
    }

效果图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81416246