zoukankan      html  css  js  c++  java
  • OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训练

    前言

      红胖子,来也!
      做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了。
      识别可以自己写模板匹配、特征点识别、级联分类器训练识别。
      本文章就是讲解级联分类器的训练与识别。

    明确目标

      目标是识别视频中的歌手,我们先手动采集数据集合。
      视频为《绿色》,如下图:
    在这里插入图片描述

     

    训练分类器前的准备工作

    采集正样本图片

      正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(因为训练过程中,会根据设置的宽高进行等比缩放,比如设置正版本图片是128x128的,那么样本为256x256会缩放,假设杨文为256x128的那么比例就不同了,这个图怎么处理?待定);
      正样本图片应该尽可能包含少的干扰背景信息。在训练过程中多余的背景信息也会成为正样本的一个局部特征,此处与深度学习不同,深度学习现在主流无脑深度学习,图像基本的一些去噪都可能不做。
      数据来源尽可能做到多样化,比如样本为车,车的姿态场景应稍丰富些。同一正样本目标的图像太多会使局部特征过于明显,造成这个目标的训练过拟合,影响检测精度,不利于训练器泛化使用。
      我们采集视频的人脸,先把视频解码后保存成jpg图片。
      此处省略一万字…

     

    创建样本:opencv_createsamples.exe

      使用opencv自带的命令行工具opencv_createsamples.exe

    • [-info <collection_file_name>]
      样本说明文件,每一行的内容为
    xxx.jpg nums x y width height
    

      例如:图片中有两个目标

    xxx.jpg 2 0 0 100 100 200 200 100 100
    

      生成样本在windows上依托命令行

    dir /b > pos.data
    
    • [-img <image_file_name>]
        通过一张图片的扭曲形变成多张图片作为样本,就填写这个参数,参数的内容为要扭曲的图片的路径。填入后,-info参数不再有效。
    • [-vec <vec_file_name>]
        样本描述文件的名字及路径
    • [-bg <background_file_name>]
        负样本描述文件的名字及路径,如果省略,则使用bgcolor的值填充作为背景。就是跟存放负样本图片(背景图片)目录位置相同的描述文件的路径,可用txt,dat等格式保存,每一行的内容为:xxx.jpg。
    • [-inv]
        如果指定该标志,前景图像的颜色将翻转
    • [-randinv]
        如果指定该标志,颜色将随机地翻转
    • [-num <number_of_samples = 1000>]
        总共几个样本,可以省略,则按照输入的实际样本数量产生
    • [-bgcolor <background_color = 0>]
        背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由-bgthresh指定。所有处于bgcolor-bgthresh和bgcolor+bgthresh之间的像素都被设置为透明像素。
    • [-bgthresh <background_color_threshold = 80>]
        (参考-bgcolor)
    • [-maxidev <max_intensity_deviation = 40>]
        前景样本里像素的亮度梯度的最大值
    • [-maxxangle <max_x_rotation_angle = 1.100000>]
        x轴最大旋转角度,单位弧度
    • [-maxyangle <max_y_rotation_angle = 1.100000>]
        y轴最大旋转角度,单位弧度
    • [-maxzangle <max_z_rotation_angle = 0.500000>]
        z轴最大旋转角度,单位弧度
    • [-show [<scale = 4.000000>]]
        显示样本,作为创建样本时的调试
    • [-w <sample_width = 24>]
        样本缩放到的尺寸
    • [-h <sample_height = 24>]
        样本缩放到的尺寸
    • [-maxscale ]:
    • [-rngseed ]:

    创建正样本

    在这里插入图片描述
    在这里插入图片描述

    创建负样本

    在这里插入图片描述
    在这里插入图片描述

    创建样本文件vec

    opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -show -w 50 -h 70 
    -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28

    (注意:LBP特征50x70等都可以可以训练,实测HAAR则必须是24x24 or 20x20)
    在这里插入图片描述
    在这里插入图片描述

     

    训练样本opencv_traincascade.exe

      使用opencv自带的命令行工具opencv_traincascade.exe,可以训练三个特征目标:HAAR、HOG、LBP。

    • -data <cascade_dir_name>
        训练的分类器的存储目录。
    • -vec <vec_file_name>
        通过opencv_createsamples生成的vec文件,正样本的数据。
    • -bg <background_file_name>
        负样本说明文件,主要包含负样本文件所在的目录及负样本文件名。
    • [-numPos <number_of_positive_samples = 2000>]
        每级分类器训练时所用到的正样本数目,但是应当注意,这个数值一定要比准备正样本时的数目少。
    • [-numNeg <number_of_negative_samples = 1000>]
        每级分类器训练时所用到的负样本数目,可以大于-bg指 定的图片数目。
    • [-numStages <number_of_stages = 20>]
        训练分类器的级数,强分类器的个数
    • [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]
        缓存大小,用于存储预先计算的特征值,单位MB
    • [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]
        缓存大小,用于存储预先计算的特征索引,单位MB
    • [-baseFormatSave]
        仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储。
    • [-numThreads <max_number_of_threads = 1>]
        支持多线程并行训练
    • [-acceptanceRatioBreakValue = -1>]
        此参数用于确定模型应保持学习的精确程度以及何时停止。一个好的指导方针是训练不超过10e-5(等于10*10^(-5) ),以确保模型不会过度训练您的训练数据。默认情况下,此值设置为-1以禁用此功能。

    –cascadeParams–

    • [-stageType <BOOST(default)>]
        级联类型,目前只能取BOOST
    • [-featureType <{HAAR(default), LBP, HOG}>]
        训练使用的特征类型,目前支持的特征有Haar,LBP和HOG
    • [-w <sampleWidth = 24>]
        训练的正样本的宽度,Haar特征的w和h一般为20,LBP特征的w和h一般为24,HOG特征的w和h一般为64
    • [-h <sampleHeight = 24>]
        训练的正样本的高

    –boostParams–

    • [-bt <{DAB, RAB, LB, GAB(default)}>]
        增强分类器类型:DAB-Discrete AdaBoost,RAB-Real AdaBoost,LB-LogitBoost,GAB-Gentle AdaBoost。
    • [-minHitRate <min_hit_rate> = 0.995>]
        类器每个阶段的最小期望命中率。总体命中率估计为(最小命中率^阶段数)。
    • [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]
        分类器每个阶段的最大期望误报率。
    • [-weightTrimRate <weight_trim_rate = 0.95>]
        指定是否应使用修剪及其权重。一个不错的选择是0.95。
    • [-maxDepth <max_depth_of_weak_tree = 1>]
        弱树的最大深度。一个不错的选择是1,这是树桩的情况。
    • [-maxWeakCount <max_weak_tree_count = 100>]
        每个级联阶段的最大弱树数。提升分类器(stage)将具有许多弱树(<=maxWeakCount),以实现给定的-maxFalseAllRate。

    –haarFeatureParams–

    • [-mode <BASIC(default) | CORE | ALL>]
        选择训练中使用的Haar特征集的类型。基本只使用直立特征,而所有特征都使用全套直立和45度旋转特征集。

    训练级联分类器

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    eg.txt 
    -numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 64 -h 64
    

    训练出错如下:
    在这里插入图片描述

    更换LBP特征,继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    eg.txt 
    -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 64 -h 64
    

    训练出错如下:
    在这里插入图片描述
      根据错误宽高是要跟创建的样本一样,改为50x70,(创建的样本为50x70),继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    eg.txt  
    -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
    

      负样本再生成一次绝对路径:

    dir /b /s >negAb.txt
    

    在这里插入图片描述
      删掉非图片的行
      然后继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    egAb.txt 
    -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
    

    训练出错,如下:
    在这里插入图片描述
    手动创建data目录
    在这里插入图片描述
      继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    egAb.txt -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70
    

      然后,正常训练,训练完成:
    在这里插入图片描述

    如何训练Haar

      要训练haar特征级联分类器,最开始创建样本就必须为24x24 or 20x20的(经过多次尝试论证),最终设置24x24训练出来如下:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg
    egAb.txt 
    -numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 24 -h 24
    

      训练

    opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -
    show -w 24 -h 24 -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28
    

    在这里插入图片描述
    在这里插入图片描述
      使用该级联分类器,使用cascade.xml加载即可。

     

    Haar级联分类器的测试

     
  • 相关阅读:
    Best Time to Buy and Sell Stock
    Remove Nth Node From End of List
    Unique Paths
    Swap Nodes in Pairs
    Convert Sorted Array to Binary Search Tree
    Populating Next Right Pointers in Each Node
    Maximum Subarray
    Climbing Stairs
    Unique Binary Search Trees
    Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/qq21497936/p/13843265.html
Copyright © 2011-2022 走看看