OpenCV 级联分类器之样本处理、训练、测试

目录

1、什么是级联分类器

2、分类器样本创建

2.1、正样本

2.1.1、什么是正样本

2.1.2、正样本收集

2.1.3、正样本处理

2.1.4、生成pos.txt文件

2.1.5、训练.vec文件

 2.2、负样本

3、分类器生成

4、分类器测试


1、什么是级联分类器

        此处不做详解,可以参考这个博客:https://www.cnblogs.com/wumh7/p/9403873.html

2、分类器样本创建

        样本创建是一个比较耗时耗资源的过程,但是前期做好一个优质的样本,对于后期的样本训练以及想获取到一个精度较高的分类器都是密切相关的。

        样本,又分为正样本和负样本。通常样本基数越大,生成的分类器精度越高。如果检测的目标是一个固定物体,没有变化(如特定商标,logo等),这样的物体只要提供一份样本就可以进行训练。 但绝大数时候我们想进行训练的目标是非绝对固定的物体,如对人的检测,包括人脸识别、汽车等等,因此,创建一个合适的样本就十分重要。

2.1、正样本

2.1.1、什么是正样本

        所谓正样本就是只包含检测目标的图片(最好背景一致),对于这我个人认为最好是检测目标的最小外接矩,这样可以减少训练的计算量,减少目标检测的干扰,提高检测质量。

2.1.2、正样本收集

        获取正样本,可以自己动手,也可以通过网络上的图像数据库,像人脸数据库就已经很全了,不必再自己制作。

2.1.3、正样本处理

         将正样本图片进行截取(自己收集的图片,主要是去掉训练时的不必要干扰)-----最小外接矩;

        将处理后的图片进行归一化,将所有图像调整成一致大小,我用的“美图看看”这款软件,批量处理的,注意无论原图多大最好都处理成25*25以下的图像,这样计算机训练速度快,而且不容易出现内存不够用;

        将归一化后的图像进行灰度处理,可以调用OpenCV中的接口,cv::cvtColor(Mat src, Mat outGray, COLOR_BGR2GRAY),自己c++写个批量处理小程序即可。如下处理后的灰度图片。

2.1.4、生成pos.txt文件

          cmd运行控制台,切换到存放样本图片的文件目录下:输入如下命令

         运行结果:

         在图像文件中多了个pos.txt文件,内容如下:

            

              在对文件进行处理,使其含有图片信息:通过程序读取存入

              

 格式为:图片路径     检测目标在图片中的个数     起始监测点坐标(x,y)   图片大小(w,h)

2.1.5、训练.vec文件

        cmd下运行一下命令(假设当前路径就是pos.txt所在的路径):

opencv_createsamples.exe -vec pos.vec -info pos.txt -num 100 -w 30 -h 30 

        得到pos.vec文件。

 2.2、负样本

        负样本,即不包含检测目标的任何图片。主要操作如下:

        1、负样本不要求样本尺寸,但要大于等于正样本的大小;且负样本不能重复,要增大负样本的差异性;

        2、负样本灰度化,同正样本操作相同。

     3、运行命令:

        

最后将pos.vec和neg.txt文件拷贝到同一文件夹下。

3、分类器生成

执行命令:

opencv_haartraining.exe -data xml -vec pos.vec -bg neg.txt -nstages 10 -nsplits 1 -npos 35 -nneg 100 -mem 1280 -mode all -w 30 -h 30

命令讲解:

        opencv_haartraining.exe   是一个opencv自带的可执行函数(但此函数已经过时,最新的采用opencv_traincascade),用于实现对分类器的训练。直接在doc下用命令执行即可,Windows的存放路径一般为:    ..\opencv\build\x86\vc11\bin。这里我为了找路径方便与样本文件放在同一目录下这样可以找到很容易调取 mlx文件夹,和pos.vec、neg.txt,也可以直接调用。

        -data xml        存储训练时的生成的文件。最终生成一个.xml文件,如下图:

                xml文件夹内容:

              -vec pos.vec    调用.vec文件,与neg.txt放在同一目录下。

              -bg neg.txt     负样本生成文件,可以理解成是负样本的索引。

              -nstages 10     训练级数

              -nsplits 1         2表示弱分类器二叉决策树的分裂数   1表示使用简单stump 分类(只有一个树桩)

              -npos 35          正样本数量

              -nneg 100        负样本数量

              -mem 1280      训练时内存预留的空间1280MB

              -mode all          级联器的类型,all代表所有类型

              -w 30               图片的宽30像素,必须与之前一致

              -h 30               图片的高30像素,必须与之前一致

执行结果如下:

训练结果:

4、分类器测试

        待测试。。

注:已以上图片来自于网络,如有侵权联系删除。

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个用于计算机视觉和机学习的开源库,其中包含了许多功能强大的算法和工具。级分类是其中的一个重要功能,它可以用于目标检测和识别。 在训练分类时,我们需要准备正样本。正样本是包含我们所关注目标的图像,比如人脸、车辆、文字等等。为了训练分类,我们需要大量的正样本图像,这样才能让分类具备更好的泛化能力。 训练分类的过程可以分为以下几个步骤: 1. 收集正样本图像:我们可以通过各种方式来收集正样本图像,比如在网上下载、自己标注、从已有的数据集中提取等等。收集的正样本图像应该尽可能多样化,包含不同的姿势、光照条件、背景等等,以提高分类的鲁棒性。 2. 创建样本描述文件:在训练分类时,我们需要提供一个样本描述文件,用于描述每个样本图像的位置和标签。这个描述文件可以是一个XML文件,其中包含了每个样本图像的文件路径、位置和标签信息。 3. 训练分类:在训练过程中,我们需要提供正样本图像和对应的样本描述文件,以及一些训练参数。通过迭代的方式,级分类会学习到目标的特征,并不断优化自身的分类能力。训练的过程通常需要较长的时间,特别是当样本数量较多时。 4. 评估和调优:在训练完成后,我们需要对训练得到的级分类进行评估。可以使用一部分已经标注好的测试图像来评估分类的性能,计算准确率、召回率等指标。如果分类的性能不理想,我们可以调整训练参数,或者增加更多的正样本进行训练,以提高分类的性能。 通过以上步骤,我们可以利用OpenCV训练分类,用于目标检测和识别任务。随着训练的迭代次数增加,分类会逐渐提高自身的准确性和鲁棒性,从而更好地适应各种实际场景中的目标检测需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值