精华内容
下载资源
问答
  • OpenCV-Python 级联分类器训练 | 六十三
    千次阅读
    2020-04-27 13:11:39

    作者|OpenCV-Python Tutorials 编译|Vincent 来源|OpenCV-Python Tutorials

    简介

    使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP模型的检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练数据并执行实际模型训练。

    为了支持本教程,将使用几个官方的OpenCV应用程序:opencv_createsamples,opencv_annotation,opencv_traincascade和opencv_visualisation。

    重要的事项

    • 如果您遇到任何提及旧的opencv_haartraining工具(不推荐使用,仍在使用OpenCV1.x界面)的教程,请忽略该教程并坚持使用opencv_traincascade工具。此工具是较新的版本,根据OpenCV 2.x和OpenCV 3.x API用C ++编写。opencv_traincascade支持类似HAAR的小波特征[227]和LBP(局部二进制模式)[127]特征。与HAAR特征相比,LBP特征产生整数精度,产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,主要取决于所使用的训练数据和选择的训练参数。可以训练基于LBP的分类器,该分类器将在训练时间的一定百分比内提供与基于HAAR的分类器几乎相同的质量。
    • 来自OpenCV 2.x和OpenCV 3.x(cv::CascadeClassifier)的较新的层叠分类器检测接口支持使用新旧模型格式。如果由于某种原因而使用旧界面,则opencv_traincascade甚至可以旧格式保存(导出)经过训练的级联。然后至少可以在最稳定的界面中训练模型。
    • opencv_traincascade应用程序可以使用TBB进行多线程处理。 要在多核模式下使用它,必须在启用TBB支持的情况下构建OpenCV。

    准备训练数据

    为了训练弱分类器的增强级联,我们需要一组正样本(包含您要检测的实际对象)和一组负样本(包含您不想检测的所有内容)。负样本集必须手动准备,而阳性样本集是使用opencv_createsamples应用程序创建的。

    负样本 负样本取自任意图像,不包含要检测的对象。这些生成样本的负片图像应列在一个特殊的负片图像文件中,该文件每行包含一个图像路径(可以是绝对路径,也可以是相对路径)。注意,负样本和样本图像也称为背景样本或背景图像,在本文档中可以互换使用。

    所描述的图像可能具有不同的尺寸。但是,每个图像都应等于或大于所需的训练窗口大小(与模型尺寸相对应,多数情况下是对象的平均大小),因为这些图像用于将给定的负像子采样为几个图像 具有此训练窗口大小的样本。

    负样本描述文件的示例:目录结构:

    /img
      img1.jpg
      img2.jpg
    bg.txt

    文件 bg.txt

    img/img1.jpg
    img/img2.jpg 

    您的一组负窗口样本将用于模型训练,在这种情况下,当尝试查找您感兴趣的对象时,可以增强不需要查找的内容。

    正样本

    正样本由opencv_createsamples应用程序创建。提升过程使用它们来定义在尝试找到感兴趣的对象时模型应实际寻找的内容。该应用程序支持两种生成正样本数据集的方式。

    1. 您可以从单个正对象图像生成一堆正值。
    2. 您可以自己提供所有肯定的内容,仅使用该工具将其切出,调整大小并以opencv所需的二进制格式放置。 尽管第一种方法对固定对象(例如非常刚性的徽标)效果不错,但对于刚性较差的对象,它往往很快就会失效。在这种情况下,我们建议使用第二种方法。网络上的许多教程甚至都指出,通过使用opencv_createsamples应用程序,可以生成100个真实对象图像,而不是1000个人工生成的正值。但是,如果您决定采用第一种方法,请记住以下几点:
    • 请注意,在将其提供给上述应用程序之前,您需要多个正样本,因为它仅适用于透视变换。
    • 如果您想要一个健壮的模型,请获取涵盖对象类中可能出现的各种变化的样本。例如,对于面孔,您应考虑不同的种族和年龄段,情绪以及胡须风格。当使用第二种方法时,这也适用。

    第一种方法采用带有公司徽标的单个对象图像,并通过随机旋转对象,更改图像强度以及将图像放置在任意背景上,从给定的对象图像中创建大量正样本。随机性的数量和范围可以通过opencv_createsamples应用程序的命令行参数来控制。

    命令行参数:

    • -vec <vec_file_name>:包含用于训练的正样本的输出文件的名称。
    • -img <image_file_name>:源对象图像(例如,公司徽标)。
    • -bg <background_file_name>:背景描述文件; 包含图像列表,这些图像用作对象的随机变形版本的背景。
    • -num <number_of_samples>:要生成的正​​样本数。
    • -bgcolor <background_color>:背景色(当前假定为灰度图像); 背景色表示透明色。由于可能存在压缩伪影,因此可以通过-bgthresh指定颜色容忍度。bgcolor-bgthresh和bgcolor + bgthresh范围内的所有像素均被解释为透明的。
    • -bgthresh <background_color_threshold>
    • -inv:如果指定,颜色将被反转。
    • randinv:如果指定,颜色将随机反转。
    • -maxidev <max_intensity_deviation>:前景样本中像素的最大强度偏差。
    • -maxxangle <max_x_rotation_angle>:朝向x轴的最大旋转角度,必须以弧度为单位。
    • -maxyangle <max_y_rotation_angle>:朝向y轴的最大旋转角度,必须以弧度为单位。
    • -maxzangle <max_z_rotation_angle>:朝向z轴的最大旋转角度,必须以弧度为单位。
    • -show:有用的调试选项。 如果指定,将显示每个样本。 按Esc将继续示例创建过程,而不会显示每个示例。
    • -w <sample_width>:输出样本的宽度(以像素为单位)。
    • -h <sample_height>:输出样本的高度(以像素为单位)。

    当以此方式运行opencv_createsamples时,将使用以下过程创建示例对象实例:给定的源图像围绕所有三个轴随机旋转。 所选角度受-maxxangle-maxyangle-maxzangle限制。 然后,像素在[bg_color-bg_color_threshold; bg_color + bg_c​​olor_threshold]范围内被设置为透明。白噪声被添加到前景的强度。如果指定了-inv键,则前景像素强度将反转。如果指定了-randinv键,则算法将随机选择是否应对该样本应用反演。最后,将获得的图像从背景描述文件放置到任意背景上,将其大小调整为由-w-h指定的所需大小,并存储到由-vec命令行选项指定的vec文件中。

    也可以从以前标记的图像的集合中获取正样本,这是构建鲁棒对象模型时的理想方式。该集合由类似于背景描述文件的文本文件描述。该文件的每一行都对应一个图像。该行的第一个元素是文件名,后跟对象注释的数量,后跟描述包围矩形(x,y,宽度,高度)的对象坐标的数字。

    一个描述文件的示例:

    目录结构:

    /img
        img1.jpg
        img2.jpg info.dat

    文件 info.dat

    img/img1.jpg  1  140 100 45 45
    img/img2.jpg  2  100 200 50 50   50 30 25 25 

    图像img1.jpg包含具有以下边界矩形坐标的单个对象实例:(140,100,45,45)。图像img2.jpg包含两个对象实例。

    为了从此类集合创建正样本,应指定-info参数而不是-img

    • -info <collection_file_name>:标记图像集合的描述文件。

    请注意,在这种情况下,-bg,-bgcolor,-bgthreshold,-inv,-randinv,-maxxangle,-maxyangle-maxzangle等参数将被简单地忽略并且不再使用。在这种情况下,样本创建的方案如下。通过从原始图像中切出提供的边界框,从给定图像中获取对象实例。然后将它们调整为目标样本大小(由-w和-h定义),并存储在由-vec参数定义的输出vec文件中。没有应用任何失真,因此仅有的影响参数是-w-h-show-num

    也可以使用opencv_annotation工具完成手动创建-info文件的过程。这是一个开放源代码工具,用于在任何给定图像中直观地选择对象实例的关注区域。以下小节将详细讨论如何使用此应用程序。

    额外事项

    • opencv_createsamples实用程序可用于检查存储在任何给定正样本文件中的样本。为此,仅应指定-vec-w-h参数。
    • 此处提供了vec文件的示例opencv/data/vec_files/trainingfaces_24-24.vec。它可以用于训练具有以下窗口大小的面部检测器:-w 24 -h 24

    使用OpenCV中的集成标注工具 从OpenCV 3.x开始,社区一直在提供和维护开源注释工具,该工具用于生成-info文件。如果构建了OpenCV应用程序,则可以通过命令opencv_annotation访问该工具。

    使用该工具非常简单。该工具接受几个必需参数和一些可选参数:

    • --annotations必需):注释txt文件的路径,您要在其中存储注释,然后将其传递给-info参数[example-/data/annotations.txt] - --images(必需):包含带有对象的图像的文件夹的路径[示例-/data/testimages/]
    • --maxWindowHeight可选):如果输入图像的高度大于此处的给定分辨率,则调整图像的大小以用于 使用--resizeFactor可以简化注释。
    • --resizeFactor可选):使用--maxWindowHeight参数时用于调整输入图像大小的因子。

    请注意,可选参数只能一起使用。可以使用的命令示例如下所示

    opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/ 

    此命令将启动一个窗口,其中包含第一张图像和您的鼠标光标,这些窗口将用于注释。有关如何使用注释工具的视频,请参见此处。基本上,有几个按键可以触发一个动作。鼠标左键用于选择对象的第一个角,然后继续绘制直到您满意为止,并在单击鼠标第二次单击时停止。每次选择后,您有以下选择:

    • c:确认注释,​​将注释变为绿色并确认已存储。
    • d:从注释列表中删除最后一个注释(易于删除错误的注释)
    • n:继续进行操作下一张图片
    • ESC键:这将退出注释软件

    最后,您将获得一个可用的注释文件,该文件可以传递给opencv_createsamples的-info参数。

    级联训练

    下一步是根据预先准备的正负数据集对弱分类器的增强级联进行实际训练。

    按用途分组的opencv_traincascade应用程序的命令行参数:

    • 常用参数

      • -data <cascade_dir_name>:应将经过训练的分类器存储在何处。此文件夹应事先手动创建。
      • -vec <vec_file_name>:带有正样本的vec文件(由opencv_createsamples实用程序创建)。
      • -bg <background_file_name>:背景描述文件。这是包含阴性样本图像的文件。
      • -numPos <number_of_positive_samples>:在每个分类器阶段的训练中使用的阳性样本数。
      • -numNeg <number_of_negative_samples>:在每个分类器阶段的训练中使用的负样本数。
      • -numStages <number_of_stages>:要训练的级联级数。
      • -precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:用于预先计算的特征值的缓冲区大小(以Mb为单位)。分配的内存越多,训练过程就越快,但是请记住,-precalcValBufSize-precalcIdxBufSize的总和不应超过可用的系统内存。
      • -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:用于预先计算的特征索引的缓冲区大小(以Mb为单位)。分配的内存越多,训练过程就越快,但是请记住,-precalcValBufSize-precalcIdxBufSize的总和不应超过可用的系统内存。
      • -baseFormatSave:对于类似Haar的功能,此参数是实际的。如果指定,级联将以旧格式保存。仅出于向后兼容的原因,并且允许用户停留在旧的不赞成使用的界面上,至少可以使用较新的界面训练模型,才可以使用此功能。
      • -numThreads <最大线程数>:训练期间要使用的最大线程数。请注意,实际使用的线程数可能会更少,具体取决于您的计算机和编译选项。默认情况下,如果您使用TBB支持构建了OpenCV,则会选择最大可用线程,这是此优化所必需的。
      • -acceptanceRatioBreakValue <break_value>:此参数用于确定模型应保持学习的精确度以及何时停止。良好的指导原则是进行不超过10e-5的训练,以确保模型不会对您的训练数据过度训练。默认情况下,此值设置为-1以禁用此功能。
    • 级联参数

      • -stageType <BOOST(default)>:阶段的类型。目前仅支持提升分类器作为阶段类型。
      • -featureType <{{HAAR(default),LBP}>>:功能类型:HAAR-类似Haar的功能,LBP-本地二进制模式。
      • -w <sampleWidth>:训练样本的宽度(以像素为单位)。必须具有与训练样本创建期间使用的值完全相同的值(opencv_createsamples实用程序)。
      • -h <sampleHeight>:训练样本的高度(以像素为单位)。必须具有与训练样本创建期间使用的值完全相同的值(opencv_createsamples实用程序)。
    • 提升分类器参数:

      • -bt <{DAB,RAB,LB,GAB(default)}>:增强分类器的类型:DAB-离散AdaBoost,RAB-真实AdaBoost,LB-LogitBoost,GAB-温和AdaBoost。
      • -minHitRate <min_hit_rate>:分类器每个阶段的最低期望命中率。总命中率可以估计为(min_hit_rate ^ number_of_stages),[228]§4.1。
      • -maxFalseAlarmRate <max_false_alarm_rate>:分类器每个阶段的最大期望误报率。总体误报率可以估计为(max_false_alarm_rate ^ number_of_stages),[228]§4.1。
      • `-weightTrimRate ·:指定是否应使用修剪及其权重。不错的选择是0.95。
      • -maxDepth <max_weak_tree>:弱树的最大深度。一个不错的选择是1,这是树桩的情况。
      • -maxWeakCount <max_weak_tree_count>:每个级联阶段的弱树的最大计数。提升分类器(阶段)将具有如此多的弱树(<= maxWeakCount),以实现给定的-maxFalseAlarmRate。
    • 类似Haar的特征参数:

      • -mode <BASIC(default)|CORE| ALL>:选择训练中使用的Haar功能集的类型。 BASIC仅使用直立功能,而ALL使用整套直立和45度旋转功能集。有关更多详细信息,请参见[129]。
    • 本地二进制模式参数:本地二进制模式没有参数。

    opencv_traincascade应用程序完成工作后,经过训练的级联将保存在-data文件夹中的cascade.xml文件中。此文件夹中的其他文件是为中断培训而创建的,因此您可以在训练完成后将其删除。

    训练完成后,您可以测试级联分类器!

    可视化级联分类器

    有时,可视化经过训练的级联可能很有用,以查看其选择的功能以及其阶段的复杂程度。为此,OpenCV提供了一个opencv_visualisation应用程序。该应用程序具有以下命令:

    • --image(必需):对象模型参考图像的路径。 这应该是标注,标注[-w,-h]传递给opencv_createsamples和opencv_traincascade应用程序。
    • --model必需):训练模型的路径,该路径应该在opencv_traincascade应用程序的-data参数提供的文件夹中。
    • --data可选):如果提供了一个数据文件夹,必须事先手动创建它,那么将存储舞台输出和功能的视频。 下面是一个示例命令: opencv_visualisation --image=/ data/object.png --model=/data/model.xml --data =/data/result/

    当前可视化工具的某些限制

    • 仅处理级联分类器模型, 使用opencv_traincascade工具进行培训,其中包含树桩作为决策树[默认设置]。

    • 提供的图像必须是带有原始模型尺寸的样本窗口,并传递给--image参数。

    HAAR / LBP人脸模型的示例在安吉丽娜·朱莉(Angelina Jolie)的给定窗口上运行,该窗口具有与级联分类器文件相同的预处理–> 24x24像素图像,灰度转换和直方图均衡:每个阶段都会制作一个视频,每个特征都可视化:

    每个阶段都会制作一个视频,以显示每个功能:

    每个阶段都作为图像存储,以供将来对功能进行验证:

    这项工作是由StevenPuttemans为OpenCV 3 Blueprints创建的,但是Packt Publishing同意将其集成到OpenCV中。

    欢迎关注磐创AI博客站: http://panchuang.net/

    OpenCV中文官方文档: http://woshicver.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    更多相关内容
  • 级联分类器原理AdaBoost Viola和Jones,2001在CVPR提出; 一种实时对象(人脸)检测框架; 训练速度非常慢,检测速度非常快; 5000个正向人脸样本与300万个非人脸负样本数据。 级联分类器:多个强分类器组合 弱分类器:weak...
  • 视频读取 #include #include using namespace std; using namespace cv; String Haar_fileName = haarcascade_frontalface_alt.xml;//Haar String LBP_fileName = lbpcascade_frontalface.xml;...
  • 基于OpenCV新版本3.1.0详细讲述了HAAR与LBP级联分类器的基本原理与使用技巧,通过视频中人脸实时检测与眼睛跟踪例子...通过OpenCV自带的训练工具实现样本数据训练生成自己的级联分类器文件,使用它实现自定义对象检测。
  • LBP训练需要的样本数量要比HAAR大 同样的样本空间,HAAR训练出来的数据检测结果要比LBP准确 扩大LBP的样本数据,训练结果可以跟HAAR一样 LBP的速度一般可以比HAAR快几倍 #include #include using namespace std; ...
  • OpenCV级联分类器训练与使用教程与代码11111111111111111111111
  • OpenCV中的HAAR与LBP数据 ...//opencv自带训练好的人脸识别级联器 String Eye_fileName = haarcascade_eye_tree_eyeglasses.xml;//opencv自带训练好的人眼识别级联器 CascadeClassifier face_cascade;//人脸
  • Haar猫脸检测 haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml ...//猫脸级联分类器 String Cat_fileName = haarcascade_frontalcatface.xml;//猫脸级联分类器 CascadeClassifier
  • 文章目录一、级联分类器训练简介 一、级联分类器训练简介 使用 Haar、LBP 特征训练级联分类器 关于 级联分类器(使用) 以及详情查看。 关于 OpenCV—Python CascadeClassifier(级联分类器) 点击查看。 操作步骤: ...

    一、级联分类器训练简介

    在深度学习成熟的年代,很少需要级联分类器了,在垂直领域一些简单检测的场景下,还是有点作用的,模型简单,检测速度快。

    xml文件精简:使用python脚本处理xml文件,将若分类器的数据float64->float32或float16进一步加快速度。

    使用 Haar、LBP、HOG 特征训练级联分类器
    关于 级联分类器(使用) 以及详情查看。
    关于 OpenCV—Python CascadeClassifier(级联分类器) 点击查看。

    操作步骤

    1. 收集样本数据 – 包括正负样本
    2. 数据规范化 – 大小、格式
    3. 生成vec文件与负样本列表文本文件
    4. 使用OpenCV自动的级联分类器训练工具,训练样本数据
    5. 得到最终的级联分类器数据(XML格式)

    (1)以人脸检测为例 –公开的数据库有

    • 正向样本数目
    • 负样本数目
    • 正向样本的大小 – 统一尺寸
    • 正向样本图片中的背景问题

    (2)样本集合与描述:正(负)样本集合与描述文件
    (3)使用 opencv_createsamples.exe 正样本VEC文件创建
    (4)使用 opencv_traincascade.exe 训练样本数据

    这两个文件:opencv_traincascaded.exe 和 opencv_createsamplesd.exe 在opencv3.4以上版本就需要编译。https://zhuanlan.zhihu.com/p/109364375
    为避免麻烦,我直接下载opencv3.4版本。
    在这里插入图片描述
    在这里插入图片描述

    创建样本

    创建 info.dat 文件 (负样本文件同理 bg.txt)
    所有正样本文件都在当前目录positive下面, 负样本文件在negative下面

    import os
    from PIL import Image
    
    
    def get_write_dat(input_path):
        f = open(input_path+"/info.dat", "w")
        for root, dirs, files in os.walk(input_path):
            for file in files:
                if file.endswith((".png", ".bmp", ".jpg")):
                    print("file: ", file)
                    try:
                        img = Image.open(os.path.join(root, file))
                        w, h = img.size
                        f.write(" ".join(["positive/"+file, str(1), str(0), str(0), str(w), str(h)])+"\n")
                    except Exception as e:
                        print(e)
        f.close()
    
    
    if __name__ == '__main__':
        input_path = r"D:\opencv-c++\cascade\positive"
        get_write_dat(input_path)
    

    文件info.dat里的内容说明如下:(负样本只需要路径即可)
    在这里插入图片描述
    创建训练样本vec:执行如下命令

    opencv_createsamples.exe \
    -info D:\opencv-c++\cascade\positive\info.dat \
    -vec D:\opencv-c++\cascade\positive\positive_samples.vec \
    -num 185 \
    -bgcolor 0 \
    -bgthresh 0 \
    -w 24 \
    -h 24
    

    在这里插入图片描述

    训练样本

    opencv_traincascade.exe \
    -data D:\opencv-c++\cascade \
    -vec D:\opencv-c++\cascade\positive_samples.vec \
    -bg bg.txt \
    -numPos 170 \
    -numNeg 500 \
    -numStages 12 \
    -featureType LBP \
    -w 24 \
    -h 24 \
    -minHitRate 0.996 \
    -maxFalseAlarmRate 0.5
    

    说明:
    -numPos 170正样本数小于185(所有正样本)
    -numNeg 500正样本数大于224(所有负样本)
    -featureType LBP 使用LBP训练快(测试一下)

    在这里插入图片描述
    很快,训练完如下:
    在这里插入图片描述

    其中上面cascade.xml文件即为训练的模型文件。

    关于更多详情:查看官方文档
    字段说明如下:

    • -data 指定生成的文件目录,
    • -vec vec文件名,
    • -bg 负样本描述文件名称,也就是负样本的说明文件(.dat)
    • -nstage 20 指定训练层数,推荐15~20,层数越高,耗时越长。
    • -nsplits 分裂子节点数目,选取默认值 2
    • -minhitrate 最小命中率,即训练目标准确度。
    • -maxfalsealarm 最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练,
    • -npos 在每个阶段用来训练的正样本数目,
    • -nneg 在每个阶段用来训练的负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的,一般设置为正样本数目的1~3倍
    • -mem 程序可使用的内存,这个设置为256即可,实际运行时根本就不怎么耗内存,以MB为单位
    • -mode ALL指定haar特征的种类,BASIC仅仅使用垂直特征,ALL表示使用垂直以及45度旋转特征
    • -w-h 表示样本的宽与高,必须跟vec中声明保持一致

    参考:
    训练报错解决方法:https://blog.csdn.net/qq_38441692/article/details/88780567
    【OpenCV3】级联分类器训练:https://blog.csdn.net/guduruyu/article/details/70183372

    展开全文
  • 级联分类器训练过程(步骤)

    万次阅读 2018-04-23 17:56:33
    本文借助百度翻译,翻译自:...正文详情如下:介绍使用改进的级联分类器包括两个主要阶段:训练阶段和检测阶段。检测阶段使用HAAR或基于LBP的模型,在对象检测教程(object detection tut...

    本文借助百度翻译,翻译自:https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html

    由于本人英语水平有限,翻译有不通顺的地方请参考OpenCV官网,请谅解。正文详情如下:


    介绍

    使用改进的级联弱分类器包括两个主要阶段:训练阶段和检测阶段。检测阶段使用HAAR或基于LBP的模型,在对象检测教程(object detection tutorial,地址:https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html)中描述。该文档概述了训练自己的弱分类器级联的功能。本指南将贯穿不同的阶段:收集培训数据,准备培训数据和执行实际模型培训。

    为了支持本教程,将使用几个官方OpenCV应用程序: opencv_createsamplesopencv_annotationopencv_traincascade 和opencv_visualisation.

    重要说明

    • 如果你遇到任何教程提到旧的openocv-haartraining工具(它被弃用并且仍然使用OpenCV1.x接口),那么请忽略该教程,并坚持opencv-tracecascade工具。这个工具是一个新的版本,根据OpenCV 2.x 和3.x的API用C++编写。opencv_traincascade支持Haar样小波特征[191 ]和LBP(局部二进制模式)[108 ]特征。LBP的特征产生整数精度与Haar特征相比,产生了浮点精度,因此LBP的训练和检测比HAAR特征要快几倍。对于LBP和Haar检测质量,主要取决于所使用的训练数据和训练参数的选择。在训练时间的百分比内训练一个基于LBP的分类器可以提供几乎与Haar基分类器相同的质量。
    • 较新的级联分类器检测接口从OpenCV 2.x和OpenCV 3.x(cv::CascadeClassifier)支持与旧的和新的模型格式一起工作。opencv_traincascade甚至可以保存(导出)一个经过训练的级联,如果由于某种原因,你使用旧接口卡住。至少训练模型可以在最稳定的接口中完成。
    • opencv_traincascade应用程序可以使用TBB进行多线程处理。要在多核模式下使用OpenCV,必须建立TBB支持。

    训练数据的准备

    为了训练一个增强的弱分类器级联,我们需要一组正样本(包含要检测的实际对象)和一组负面图像(包含所有你不想检测到的)。负样本的集合必须手动准备,而正样本集是使用opencv_createsamples应用程序创建的。

    负样本

    负样本取自任意图像,不包含要检测的对象。这些负的图像,从其中产生的样本,应该被列在一个特殊的负图像文件中,每行包含一个图像路径(可以是绝对的或相对的)。注意,负样本和样本图像也称为背景样本或背景图像,并且可在本文档中互换使用。

    所描述的图像可以具有不同的尺寸。然而,每个图像应该等于或大于所需的训练窗口大小(对应于模型维度,大多是目标的平均大小),因为这些图像用于将给定的负图像子采样成具有此训练窗口大小的多个图像样本。

    一个负样本文件示例:

    目录结构:

    /img
      img1.jpg
      img2.jpg
    bg.txt

    文件 bg.txt:

    img/img1.jpg
    img/img2.jpg

    当你试图找到你感兴趣的目标时,你的一组负面窗口样本将被用来告诉机器学习步骤,在这种情况下,不必寻找。

    正样本:

    正样本是由opencv_createsamples应用程序创建的。它们被升压(boosting。本人对此翻译持怀疑态度,故将英文贴在此处)过程使用来定义当试图找到感兴趣的目标时,模型应该实际寻找什么。该应用支持生成正样本数据集的两种方式。

    1. 你可以从单个正目标图像中生成一组正样本。
    2. 您可以自己提供所有的正样本图像,使用工具将它们裁剪,调整大小,并把它们放在OpenCV所需的二进制格式中。

    虽然第一种方法对于固定的物体(如不会变化的Logo)的工作很有意义,但是对于刚性较低的物体来说,它很快就会失败。在这种情况下,我们建议使用第二种方法。网上的许多教程甚至陈列了100个真实对象图像,通过使用opencv_createsamples应用程序,可以得到比1000个人工生成的更好的正模型。然而,如果你真的决定采取第一种方法,记住一些事情:

    • 请注意,在将它提交给所提到的应用程序之前,您需要多于一个正样本,因为它只应用透视变换。
    • 如果你想要一个健壮的模型,那么就要检查覆盖在你的对象类中的各种各样的品种。例如,在检测人脸的情况下,你应该考虑不同的种族和年龄组,情感,甚至胡须风格。这也适用于使用第二种方法。

    第一种方法采用单个对象图像,例如公司Logo,并通过随机旋转对象,改变图像强度以及将图像放置在任意背景上,从给定的目标图像创建一组大的正样本。随机性的数量和范围可以由opencv_createsamples应用程序的命令行参数来控制。

    命令行参数:

    • -vec <vec_file_name> : 输出文件的名称,包含用于训练的正样本。
    • -img <image_file_name> : 源对象图像(例如,公司徽标)。
    • -bg <background_file_name> : 背景描述文件;包含作为背景随机扭曲对象的背景的图像列表。
    • -num <number_of_samples> : 产生正样本的数目。
    • -bgcolor <background_color> : 背景颜色(当前假设灰度图像);背景颜色表示透明颜色。由于可能存在压缩伪影,颜色公差的量可以由 -bgthresh指定。bgcolor-bgthresh和bgcolor+bgthresh范围内的所有像素都被解释为透明的。
    • -bgthresh <background_color_threshold>
    • -inv : 如果指定,颜色将被反转。
    • -randinv : 如果指定,颜色将被随机反转。
    • -maxidev <max_intensity_deviation> : 前景样本中像素的最大强度偏差。
    • -maxxangle <max_x_rotation_angle> : X轴的最大旋转角,必须以弧度表示。
    • -maxyangle <max_y_rotation_angle> : 在y轴上的最大旋转角必须以弧度表示。
    • -maxzangle <max_z_rotation_angle> : 对于Z轴的最大旋转角,必须以弧度给出。
    • -show : 有用的调试选项。如果指定,每个样品将被显示。按“Esc”将退出显示图像继续样本生成步骤。
    • -w <sample_width> : 输出样本的宽度(以像素为单位)。
    • -h <sample_height> : 输出样本的高度(以像素为单位)。

    当以这种方式运行opencv_createsamples时,使用以下过程创建示例对象实例:给定源图像在所有三个轴上随机旋转。选择的角度是有限的-maxxangle-maxyangle-maxzangle。然后,从[bg_color-bg_color_threshold; bg_color+bg_color_threshold]范围的强度的像素被解释为透明的。白噪声被添加到前景的强度。如果指定了-inv密钥,则前景像素强度被反转。如果指定了-randinv密钥,则算法随机选择是否应该将反演应用于该样本。最后,将所获得的图像从背景描述文件放置到任意背景,将大小调整为由-w-h指定的所需大小,并存储到由-vec命令行选项指定的vec-文件中。

    正样本也可以从先前标记的图像的集合中获得,这是构建健壮对象模型时的理想方式。该集合由与背景描述文件类似的文本文件来描述。该文件的每一行对应于一个图像。行的第一个元素是文件名,其次是对象注释的数量,接着是描述对象包围矩形(x,y,width,height)的坐标的数字。

    描述文件示例:

    目录结构:

    /img
      img1.jpg
      img2.jpg
    info.dat

    文件 info.dat:

    img/img1.jpg  1  140 100 45 45
    img/img2.jpg  2  100 200 50 50   50 30 25 25

    图像img1.jpg包含单个对象实例,其中包含矩形的以下坐标:(140, 100, 45,45)。图像img2.jpg包含两个对象实例。为了从这些集合中创建正样本,应该指定-info参数,而不是-img

    额外备注:

    • opencv_createsamples实用程序可用于检查存储在任何给定的正样本文件中的样本。为了做到这一点,只需指定-vec-w-h参数。
    • 这里的示例可以参考opencv/data/vec_files/trainingfaces_24-24.vec。它可用于训练具有以下窗口大小的面部检测器:-w 24 -h 24

    使用OpenCV的集成注释工具

    自从OpenCV 3.x以来,社区一直在提供和维护一个开源的注释工具,用于生成-info文件。如果OpenCV应用程序在其中构建,则可以通过命令opencv_annotation来访问该工具。

    使用该工具是相当简单的。该工具接受几个需要的和一些可选参数:

    • --annotations (required) : 注释TXT文件的路径,在其中存储注释,然后将其传递给-info参数[example - /data/annotations.txt]
    • --images (required) : 文件夹中包含对象图像的路径 [example - /data/testimages/]
    • --maxWindowHeight (optional) : 如果输入图像的高度较大,那么这里给定的分辨率,为了便于注释,调整图像的大小,使用--resizeFactor
    • --resizeFactor (optional) : 用于在使用--maxWindowHeight参数时调整输入图像大小的因素

    请注意,可选参数只能一起使用。下面可以看到一个可以使用的命令的例子。

    opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/

    这个命令将触发包含第一个图像和鼠标光标的窗口,这将用于注释。一个关于如何使用注释工具的视频可以在 这里 找到。基本上有几个触发动作的击键。鼠标左键用于选择对象的第一个角落,然后继续绘制直到你觉得好了,然后在第二个鼠标左键点击注册时停止。每次选择后,您有以下选择:(本人对下面翻译持怀疑态度,其中的“注释”的英文为“annotation”,可能是指应用程序opencv_annotation

    • 按C:确认注释,把注释变成绿色并确保它已经保存
    • 按D:删除注释集中的最后一条注释(方便移除错误注释)
    • 按N:继续下一个图像
    • 按Esc:这将退出注释软件

    最后,您将得到一个可用的注释文件,该文件可以被传递到opencv_createsamples -info参数。

    梯度训练(Cascade Training)

    下一步是基于预先准备好的正、负数据集,对弱分类器的增强级联进行实际训练。

    按目的分组的opencv_traincascade应用程序的命令行参数:

    常见参数:

    • -data <cascade_dir_name> : 训练过的分类器应该存储在哪里。这个文件夹应该手动创建。
    • -vec <vec_file_name> : 具有正样本的vec-文件(由opencv_createsamples utility创建)。
    • -bg <background_file_name> : 背景描述文件。包含负样品图像的文件。
    • -numPos <number_of_positive_samples> : 每个分类器阶段训练中使用的正样本数。
    • -numNeg <number_of_negative_samples> : 每个分类器阶段训练中使用的负样本数。
    • -numStages <number_of_stages> : 要训练的梯度(cascsde stages)的数目。
    • -precalcValBufSize <precalculated_vals_buffer_size_in_Mb> : 预先计算的特征值的缓冲区大小(单位为MB)。您分配的内存越多,培训过程越快,但是请记住,-precalcValBufSize -precalcIdxBufSize组合不应超过可用的系统内存。
    • -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> : 预先计算的特征索引的缓冲区大小(在MB中)。您分配的内存越多,培训过程越快,但是请记住,-precalcValBufSize -precalcIdxBufSize组合不应超过可用的系统内存。
    • -baseFormatSave : 这个参数在Haar-like特征的情况下通用。如果它被指定,梯度将以旧格式保存。这仅适用于向后兼容性的原因,并且允许用户坚持旧的已弃用的接口,至少使用新的接口来训练模型。
    • -numThreads <max_number_of_threads> : 训练期间要使用的最大线程数。请注意,实际使用的线程数可能较低,这取决于您的计算机和编译选项。默认情况下,如果使用TBB支持构建OpenCV,则可以选择最大可用线程,这是优化的必要条件。
    • -acceptanceRatioBreakValue <break_value> : 这个参数被用来确定你的模型应该保持精确的学习和何时停止。一个好的准则是训练不要超过10e^-5,以确保模型不会对你的训练数据造成过度训练。默认情况下,此值设置为-1,以禁用此功能。

    梯度参数:

    • -stageType <BOOST(default)> : 阶段的类型。目前仅支持增强型分类器作为阶段类型。
    • -featureType<{HAAR(default), LBP}> : 特征类型:HAAR - Haar-like features, LBP - local binary patterns
    • -w <sampleWidth> : 训练样本的宽度(以像素为单位)。必须与训练样本创建时使用的值完全相同(opencv_createsamples utility
    • -h <sampleHeight> : 训练样本的高度(以像素为单位)。必须与训练样本创建时使用的值完全相同(opencv_createsamples utility

    增强分类器参数:

    • -bt <{DAB, RAB, LB, GAB(default)}> : 增强分类器类型:DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。
    • -minHitRate <min_hit_rate> : 分类器的每个阶段的最小期望命中率。总体命中率可估计为 (min_hit_rate ^ number_of_stages)[192] §4.1
    • -maxFalseAlarmRate <max_false_alarm_rate> : 分类器的每个阶段的最大期望虚警率(false alarm rate)。整体虚警率可估计为(max_false_alarm_rate ^ number_of_stages[192] §4.1
    • -weightTrimRate <weight_trim_rate> : 指定是否应该使用修整和它的重量。一个不错的选择是0.95。
    • -maxDepth <max_depth_of_weak_tree> : 弱树(weak tree)的最大深度。一个不错的选择是1,就是树桩(stumps)的例子。
    • -maxWeakCount <max_weak_tree_count> : 每个梯度的弱树的最大计数。增强分类器(阶段)将有许多弱树(<=maxWeakCount),根据需要实现给定的 -maxFalseAlarmRate

    Haar-like特征参数:

    • -mode <BASIC (default) | CORE | ALL> : 选择在训练中使用的Haar特征集的类型。基本使用只有直立功能,而全部使用全套直立和45度旋转特征集。详情请参阅[ 110 ]

    本地二进制格式(Local Binary Patterns)参数:无。

    opencv_traincascade应用程序完成工作后,将被训练的级联保存在-data文件夹中的cascade.xml文件中。此文件夹中的其他文件是针对中断训练的情况创建的,因此您可以在完成训练后删除它们。

    训练完成,你可以测试你的级联分类器!

    可视化级联分类器

    不时地,可视化的训练级联,看看它所选择的特征和它的阶段是多么复杂是有用的。为此OpenCV提供opencv_visualisation应用程序。此应用程序具有以下命令:

    • --image (required) : 对象模型的参考图像路径。这应该是一个注释,标注为[-w,-h],传递给opencv_createsamplesopencv_traincascade 应用程序。
    • --model (required) : 训练模型的路径,它应该在提供给opencv_traincascade应用程序的-data参数的文件夹中。
    • --data (optional) : 如果必须手动创建的data文件夹被提供,则将存储阶段输出和特征的视频。

    下面可以看到一个示例命令

    opencv_visualisation --image=/data/object.png --model=/data/model.xml --data=/data/result/

    当前可视化工具的一些局限性

    • 只处理级联分类器模型,用 opencv_traincascade工具进行训练,包含树桩(stumps)作为决策树[默认设置]。
    • 所提供的图像需要是具有原始模型维度的样本窗口,传递给 --image参数。

    HAAR/LBP人脸模型的例子在安吉莉娜·朱莉的给定窗口上运行,它具有与级联分类器文件相同的预处理-> 24x24像素图像、灰度转换和直方图均衡:

    为每个阶段制作视频,每个特征可视化:


    每个阶段被存储为图像,用于将来对特征的验证:


    这项工作是由StevenPuttemansOpenCV 3 Blueprints创建的,但Packt 出版社(Packt Publishing)同意将其集成到OpenCV中。

    展开全文
  • OpenCV57:级联分类器训练

    千次阅读 2022-01-24 16:01:44
    级联分类器训练过程 学习函数: opencv_createsamples opencv_annotation opencv_traincascade opencv_visualisation 原理 使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍...

    目的

    在本章中,将学习:

    原理

    使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP(中心点为阈值,大于它的设为1,小于它的设为0)模型的检测阶段。本文档概述了训练弱分类器的级联所需的函数。当前指南将逐步完成所有不同阶段:

    • 收集训练数据
    • 准备训练数据
    • 训练实际模型

    为了支持本教程,将使用几个官方的OpenCV应用程序:

    • opencv_createsamples
    • opencv_annotation
    • opencv_traincascade
    • opencv_visualisation

    注意

    自opencv 4.0版本以来,createsamplestraincascade被禁用。考虑使用这些应用程序为级联分类器的3.4分支训练,因此模型格式在3.4和4.x之间相同。

    重要提示

    • 如果遇到任何提及旧的opencv_haartraining工具的教程,请忽略该教程并坚持使用opencv_traincascade工具。该工具是较新的版本,根据OpenCV 2.x和OpenCV 3.x API用C ++编写。opencv_traincascade支持类似**HAAR小波特征LBP(局部二进制模式)特征**。与HAAR特征相比,LBP特征产生整数精度,HAAR产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,主要取决于所使用的训练数据和选择的训练参数。可以训练基于LBP的分类器,该分类器将在训练时间的一定百分比内提供与基于HAAR的分类器几乎相同的质量。
    • 来自OpenCV 2.x和OpenCV 3.x(cv::CascadeClassifier)的较新的级联分类器检测接口支持使用新旧模型格式。如果由于某种原因而使用旧界面,则opencv_traincascade可以旧格式保存(导出)经过训练的级联,然后可以在最稳定的界面中训练模型。
    • opencv_traincascade应用程序可以使用TBB进行多线程处理。 要在多核模式下使用它,必须在启用TBB支持的情况下构建OpenCV。

    准备训练数据

    为了训练弱分类器的增强级联,需要一组正样本(包含要检测的实际对象)和一组负样本(包含不想检测的所有内容)。负样本集必须手动准备,而正样本集是使用opencv_createsamples应用程序创建的。

    负样本|Negative Samples

    负样本来自任意图像,不包含要检测的对象。这些生成样本的负片图像应列在一个特殊的负片图像文件中,该文件每行包含一个图像路径(可以是绝对路径,也可以是相对路径)。注意,负样本和样本图像也称为背景样本或背景图像,在本文档中可以互换使用。

    所描述的图像可能具有不同的尺寸。但是,每个图像都应等于或大于所需的训练窗口大小(与模型尺寸相对应,多数情况下是对象的平均大小),因为这些图像用于将给定的负像子采样为几个图像,具有此训练窗口大小的样本。

    负样本描述文件的示例:

    目录结构:

    /img
      img1.jpg
      img2.jpg
    bg.txt
    

    bg.txt样式:

    img/img1.jpg
    img/img2.jpg
    

    这样的一组负窗口样本将用于机器学习步骤中,试图找到的感兴趣对象时不寻找什么。

    正样本|Positive Samples

    正样本由opencv_createsamples应用程序创建。正样本告诉机器学习算法来定义在尝试找到感兴趣的对象时模型应实际寻找的内容。该应用程序支持两种生成正样本数据集的方式。

    • 可以从单个正对象图像生成一堆正值
    • 可以自己提供所有肯定的内容,仅使用该工具将其裁剪调整大小并以opencv所需的二进制格式放置

    尽管第一种方法对固定对象(例如非常刚性的Logo)效果不错,但对于刚性较差的对象,它往往就会失效。在这种情况下,建议使用第二种方法。

    网络上的许多教程甚至都指出,通过使用opencv_createsamples应用程序可以生成100个真实对象图像,而不是1000个人工生成的正值。但是**,如果采用第一种方法,请记住以下几点**:

    • 需要在将其交给所提到的应用程序之前需要多个正示例,因为它只适用透视变换;
    • 如果想要一个健壮的模型,请获取涵盖对象类中可能出现的各种变化的样本。例如,对于人脸,应考虑不同的种族和年龄段,情绪以及胡须风格当使用第二种方法时,这一条也适用

    第一种方法采用带有公司徽标的单个对象图像,并通过随机旋转对象,更改图像强度以及将图像放置在任意背景上,从给定的对象图像中创建大量正样本。随机性的数量和范围可以通过opencv_createsamples应用程序的命令行参数来控制。

    命令行参数:

    • -vec <vec_file_name> :包含用于训练的正样本的输出文件的名称

    • -img <image_file_name> :源对象图像(例如,公司徽标)

    • -bg <background_file_name> :背景描述文件; 包含图像列表,这些图像用作对象的随机变形版本的背景

    • -num <number_of_samples> :要生成的正样本数

    • -bgcolor <background_color> :背景色(当前假定为灰度图像); 背景色表示透明色。由于可能存在压缩伪影,因此可以通过-bgthresh指定颜色容忍度-bgcolor-bgthresh和bgcolor + bgthresh范围内的所有像素均被解释为透明的

    • -bgthresh <background_color_threshold>

    • -inv:如果指定,颜色将被反转

    • -randinv :如果指定,颜色将随机反转

    • -maxidev <max_intensity_deviation> :前景样本中像素的最大强度偏差

    • -maxxangle <max_x_rotation_angle> :朝向x轴的最大旋转角度,必须以弧度为单位

    • -maxyangle <max_y_rotation_angle> :朝向y轴的最大旋转角度,必须以弧度为单位

    • -maxzangle <max_z_rotation_angle> :朝向z轴的最大旋转角度,必须以弧度为单位

    • -show :如果指定,将显示每个样本。 按Esc将继续示例创建过程,而不会显示每个示例

    • -w <sample_width> :输出样本的宽度(以像素为单位)

    • -h <sample_height> :输出样本的高度(以像素为单位)

    当以此方式运行opencv_createsamples时,将使用以下过程创建示例对象实例:给定的源图像围绕所有三个轴随机旋转。 所选角度受-maxxangle-maxyangle-maxzangle限制。 然后,像素在[bg_color-bg_color_threshold; bg_color + bg_color_threshold]范围内被设置为透明。白噪声被添加到前景的强度。如果指定-inv键,则前景像素强度将反转。如果指定-randinv 键,则算法将随机选择是否应对该样本应用反演。最后,将获得的图像从背景描述文件放置到任意背景上,将其大小调整为由 -w-h 指定的所需大小,并存储到由 -vec 命令行选项指定的vec文件中。

    正样本也可以从先前标记的图像的集合获得,这是在构建鲁棒目标模型时是所需的方式,该集合由类似于背景描述文件的文本文件描述。此文件的每一行对应于图像。该行的第一个元素是文件名,后跟对象注释的数量,后跟描述对象边界矩形的坐标(x,y,宽度,高度)的数字。

    正样本描述文件的示例:

    目录结构:

    /img
      img1.jpg
      img2.jpg
    info.dat
    

    info.data文件内容:

    img/img1.jpg  1  140 100 45 45
    img/img2.jpg  2  100 200 50 50   50 30 25 25
    

    图像img1.jpg包含具有以下边界矩形坐标的单个对象实例:(140,100,45,45)。图像img2.jpg包含了两个对象实例,分别为(100,200,50,50)以及(50,30,25,25)

    要从此系列中创建正示例,应指定-info参数而不是-img

    • -info <collection_file_name> :标记图像集合的描述文件

    请注意,在这种情况下, -bg,-bgcolor,-bgthreshold,-inv,-randinv,-maxxangle,-maxyangle-maxzangle等参数将被简单地忽略并且不再使用。在这种情况下,样本创建的方案如下。通过从原始图像中切出提供的边界框,从给定图像中获取对象实例,然后将它们调整为目标样本大小(由-w-h定义),并存储在由 -vec 参数定义的输出vec文件中。没有应用任何失真,因此仅有的影响参数是-w-h-show-num

    也可以使用opencv_annotation工具完成手动创建 -info 文件的过程。这是一个开放源代码工具,用于在任何给定图像中直观地选择对象实例的关注区域。

    额外事项

    • opencv_createsamples实用程序可用于检查存储在任何给定正样本文件中的样本。为此,仅应指定 -vec-w-h 参数
    • 此处提供了vec文件的示例 opencv/data/vec_files/trainingfaces_24-24.vec 。它可以用于训练具有以下窗口大小的面部检测器:-w 24 -h 24

    使用OpenCV集成的标注工具

    由于OpenCV 3.x社区一直在提供和维护一个用于生成-Info文件的开源注释工具。如果Command OpenCV_Annotation,则可以访问该工具,如果opencv应用程序在其中构建。

    使用该工具非常简单,该工具接受几种必需的和一些可选参数:

    • --annotations (必需):txt标注文件的路径,要在其中存储标注,然后将其传递给-info 参数[example-/data/annotations.txt]
    • --images (必需):包含带有对象的图像的文件夹的路径[example-/data/testimages/]
    • --maxWindowHeight (可选):如果输入图像的高度大于此处的给定分辨率,则调整图像的大小以用于 使用 --resizeFactor 可以简化注释。
    • --resizeFactor (可选):使用–maxWindowHeight` 参数时用于调整输入图像大小的因子

    请注意,可选参数只能一起使用。可以使用的命令示例如下所示

    opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/
    

    在这里插入图片描述

    此命令将启动一个窗口,其中包含第一张图像和鼠标光标,这些窗口将用于标注。有关如何使用标注工具的视频,请参见此处。基本上,有几个按键可以触发一个动作。鼠标左键用于选择对象的第一个角,然后继续绘制直到满意为止,并在单击鼠标第二次单击时停止。每次选择后,有以下选择:

    • c确认标注,将标注变为绿色并确认已存储
    • d从标注列表中删除最后一个注释(易于删除错误的注释)
    • n :继续进行操作下一张图片
    • ESC 键:退出注释软件

    标注完成后,将获得一个可用的标注文件,该文件可以传递给opencv_createsamples-info 参数。

    训练级联分类器

    下一步是根据预先准备的正负数据集对弱分类器的增强级联进行实际训练。

    opencv_traincascade应用程序的命令行参数按目的进行分组:

    • 常用参数

      • -data <cascade_dir_name> :应将经过训练的分类器存储在何处,该文件夹应事先手动创建
      • -vec <vec_file_name>· :带有正样本的vec文件(由opencv_createsamples·实用程序创建)
      • -bg <background_file_name> :背景描述文件,这是包含阴性样本图像的文件
      • -numPos <number_of_positive_samples> :在每个分类器阶段的训练中使用的阳性样本数
      • -numNeg <number_of_negative_samples> :在每个分类器阶段的训练中使用的负样本数
      • -numStages <number_of_stages>:要训练的级联级数
      • -precalcValBufSize <precalculated_vals_buffer_size_in_Mb> :用于预先计算的特征值的缓冲区大小(以Mb为单位)。分配的内存越多,训练过程就越快,但是请记住-precalcValBufSize-precalcIdxBufSize总和不应超过可用的系统内存
      • -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> :用于预先计算的特征索引的缓冲区大小(以Mb为单位)。分配的内存越多,训练过程就越快,但是请记住,-precalcValBufSize-precalcIdxBufSize的总和不应超过可用的系统内存。
      • -baseFormatSave :对于类似Haar的功能,此参数是实际的。如果指定,级联将以旧格式保存。仅出于向后兼容的原因,并且允许用户停留在旧的不赞成使用的界面上,至少可以使用较新的界面训练模型,才可以使用此功能
      • -numThreads <max_number_of_threads>:训练期间要使用的最大线程数。实际使用的线程数可能会更少,具体取决于计算机和编译选项。默认情况下,如果使用TBB支持构建了OpenCV,则会选择最大可用线程,这是此优化所必需的
      • -acceptanceRatioBreakValue <break_value>此参数用于确定模型应保持学习的精确度以及何时停止。良好的指导原则是进行不超过10e-5的训练,以确保模型不会对训练数据过度训练。默认情况下,此值设置为-1以禁用此特征
    • 级联参数

      • -stageType <BOOST(default)>:阶段的类型,目前仅支持提升分类器作为阶段类型。
      • -featureType <{HAAR(default),LBP}>:特征类型:HAAR-类似Haar的特征LBP-本地二进制模式
      • -w <sampleWidth> :训练样本的宽度(以像素为单位),必须具有与训练样本创建期间使用的值完全相同的值
      • -h <sampleHeight> :训练样本的高度(以像素为单位)。必须具有与训练样本创建期间使用的值完全相同的值
    • 提升分类器参数

      • -bt <{DAB,RAB,LB,GAB(default)}>:增强分类器的类型:DAB-Discrete AdaBoostRAB-Real AdaBoostLB-LogitBoostGAB-Gentle AdaBoost

      • -minHitRate <min_hit_rate> :分类器每个阶段的最低期望命中率。总命中率可以估计为(min_hit_rate ^ number_of_stages

      • -maxFalseAlarmRate <max_false_alarm_rate> :分类器每个阶段的最大期望误报率。总体误报率可以估计为(max_false_alarm_rate ^ number_of_stages

      • -weightTrimRate:指定是否应使用修剪及其权重,推荐设置为0.95

      • -maxDepth <max_weak_tree> :弱树的最大深度,推荐设置为1

      • -maxWeakCount <max_weak_tree_count>:每个级联阶段的弱树的最大计数。提升分类器(阶段)将具有如此多的弱树(<= maxWeakCount),以实现给定的-maxFalseAlarmRate

    • 类似Haar的特征参数:

      • -mode <BASIC(default)|CORE| ALL> :选择训练中使用的Haar特征集的类型。 BASIC仅使用竖着的特征,而ALL使用整套竖着和45度旋转特征集,更多信息参考该论文
      • 本地二进制模式参数:本地二进制模式没有参数

    opencv_traincascade应用程序完成工作后,经过训练的级联将保存在 -data 文件夹中cascade.xml 文件中。此文件夹中的其他文件是为中断训练而创建的,因此可以在训练完成后将其删除。训练完成后,可以测试级联分类器。

    级联分类器的可视化

    有时,可视化经过训练的级联可能很有用,以查看其选择的特征以及其阶段的复杂程度。为此,OpenCV提供了一个opencv_visualisation应用程序。该应用程序具有以下命令:

    • --image(必需):对象模型参考图像的路径。 这应该是标注,标注 [-w,-h]传递给opencv_createsamplesopencv_traincascade应用程序

    • --model (必需):训练模型的路径,该路径应该在opencv_traincascade应用程序的-data参数提供的文件夹中。

    • --data (可选):如果提供数据文件夹,应该事先手动创建它,那么将存储阶段输出和特征的视频。 下面是一个示例命令:

    opencv_visualisation --image=/data/object.png --model=/data/model.xml --data=/data/result/
    

    当前可视化工具的某些限制

    • 仅能处理级联分类器模型() 使用opencv_traincascade工具进行训练),其中包含树桩作为决策树[默认设置]。

    • 提供的图像必须是带有原始模型尺寸的样本窗口,并传递给–image参数

    例子

    在安吉丽娜·朱莉(Angelina Jolie)图像上使用HAAR /LBP人脸模型在给定窗口上运行**,该窗口具有与级联分类器文件相同的预处理**–>24x24像素图像灰度转换和直方图均衡

    每个阶段都会制作一个视频,每个特征都可视化:

    visualisation_video.png

    每个阶段都会制作一个视频,以显示每个特征:

    visualisation_single_stage.png

    附加资源

    展开全文
  • haartraining+objectmarker,opencv,Adaboost级联分类器训练工具包,里面包含所有用来训练opencv里基于haar特征的adaboost级联分类器的工具,可以用来训练人脸检测,车辆检测等对象检测的级联分类器
  • 级联分类器下载,训练模型 下载直接可用
  • VS2010+opencv2.4.3利用HOG特征训练级联分类器训练步骤网上有很多,这是训练代码,在属性-命令-命令参数中输入训练参数即可。
  • 级联分类器训练

    2019-10-05 22:06:39
    级联分类器训练 adaboost分类器由级联分类器构成,"级联"是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部...
  • OpenCV 级联分类器训练——训练步骤详解(一)

    万次阅读 多人点赞 2018-03-09 15:56:21
    一、正样本准备正样本的选取原则正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(训练过程中,会根据矢量文件中设置的宽高,自动对正样本进行缩放,比如我在用程序标注时,框选目标...
  • OpenCV3.1.0级联分类器训练与使用 2018-04-04阅读 6850 OpenCV3.1.0级联分类器训练与使用 级联分类器第一次出现是由Viola-Jones在2001时候提出,其主要用来实现实时人脸检测,通过加载已经训练好的级联分类器数据,...
  • 生成vec文件 LBP级联分类器训练 HAAR级联分类器训练 -featureType HAAR -mode ALL
  • Haar人眼级联特征数据 haarcascade_eye.xml haarcascade_lefteye_2splits.xml haarcascade_righteye_2splits.xml any custom cascade data?? 眼睛检测与跟踪 眼睛检测 简单跟踪(一直显示) (模板匹配) #include #...
  • opencv3/C++ 级联分类器训练样本数据

    千次阅读 2018-01-10 19:17:39
    需要准备的数据 具体的创建过程及程序见: ...训练数据包含两部分:包含人脸图片的样本数据和背景图片数据,如图所示; 其中,negitive文件夹下存放的是背景图片数据img和文件bg.txt: 如图,文件夹img下存
  • Opencv目标检测之级联分类器训练与测试

    万次阅读 多人点赞 2017-01-02 20:32:10
    OpenCV提供了两个程序可以训练自己的级opencv_haartraining 与opencv_traincascade。opencv_traincascade是一个新程序,使用OpenCV 2.x API 以C++ 编写。这二者主要的区别是opencv_traincascade支持 Haar和 LBP...
  • 上一篇(OpenCV3中的级联分类器目标检测——cv::CascadeClassifier简介)介绍了如何使用级联分类器进行目标检测。这里,我们介绍一下如何训练自己的级联分类器
  • opencv级联分类器训练和检测过程

    千次阅读 2017-05-06 20:35:07
    级联分类器整个过程主要包括:样本准备,数据生成,训练,交叉验证,检测。涉及的源代码主要包括: 1) 样本标注的工具:applications->opencv_annotation opencv_annotation.exe 注意:在标注的过程中,需要注意...
  • 使用OpenCV自动的级联分类器训练工具,训练样本数据 得到最终的级联分类器数据(XML格式) 步骤详解 1)收集样本数据 以人脸检测为例:公开的数据库有 正向样本数目(少) 负样本数目(多) 正向样本的大小:统一尺寸 正向...
  • 级联分类器训练及其参数的含义

    千次阅读 2015-10-30 17:51:18
    转载自:级联分类器训练 — OpenCV 2.3.2 documentation http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html 介绍 级联分类器包括两部分:训练和检测。 检测部分在OpenCV...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,681
精华内容 4,272
关键字:

级联分类器训练

友情链接: shadow-removal.rar