美文网首页
OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训

OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训

作者: 红模仿_红胖子 | 来源:发表于2020-10-19 21:33 被阅读0次

    若该文为原创文章,转载请注明原文出处

    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109096211

    各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

    OpenCV开发专栏(点击传送门)

    上一篇:《OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4

    下一篇:持续补充中…

    前言

    红胖子,来也!

    做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了。

    识别可以自己写模板匹配、特征点识别、级联分类器训练识别。

    本文章就是讲解级联分类器的训练与识别。

    级联分类器相关

    OpenCV的级联分类器分有两个,分别为Harr级联分类器和LBP级联分类器。具体级联分类器请查看:

    OpenCV开发笔记(五十四):红胖子8分钟带你深入了解Haar级联分类器进行人脸检测(图文并茂+浅显易懂+程序源码)

    OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)

    明确目标

    目标是识别视频中的歌手,我们先手动采集数据集合。

    视频为《绿色》,如下图:

    训练分类器前的准备工作

    采集正样本图片

    正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(因为训练过程中,会根据设置的宽高进行等比缩放,比如设置正版本图片是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\neg.txt \

    -numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 64 -h 64

    训练出错如下:

    更换LBP特征,继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.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\neg.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\negAb.txt \

    -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70

    训练出错,如下:

    手动创建data目录

    继续训练:

    opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.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\negAb.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级联分类器的测试

    级联分类器的测试请参考《OpenCV开发笔记(五十四):红胖子8分钟带你深入了解Haar级联分类器进行人脸检测(图文并茂+浅显易懂+程序源码)

    上一篇:《OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4

    下一篇:持续补充中…

    相关文章

      网友评论

          本文标题:OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训

          本文链接:https://www.haomeiwen.com/subject/rmblmktx.html