【OpenCV】 级联分类器训练模型

目录

一:OpenCV级联分类器概念

二:OpenCV级联分类器操作步骤

三:样本采集工作原理分析一

四:样本采集工作原理分析二

五:创建自己的级联分类器

5.1 创建自己的级联分类器第一步

5.2 创建自己的级联分类器第二步

5.3 创建自己的级联分类器第三步

5.4 创建自己的级联分类器第四步

5.5 创建自己的级联分类器第五步


一:OpenCV级联分类器概念

目前常用的实用性目标检测与跟踪的方式方法有以下两种

帧差法:识别原理就是基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测,缺点是画面中所有运动中物体都能识别,例如需要是被的是车辆运动,但是画面中风吹动树叶飘动也会被计算在甄别范围内,这就导致甄别物出现错误

CascadeClassifier级联分类器:那么如果只是识别车辆,那就需要把车辆需要相关信息全部统计出来(颜色、形状、大小等信息),存储在一个文件中。这个文件就叫级联分类器。级联分类器也是机器视觉和机器学习中非常重要的一个环节

二:OpenCV级联分类器操作步骤

正样本数据采集(需要检测的物体图片)

负样本数据采集(非检测物的图片)

调用opencv程序opencv_createsamples.exe程序实现样本数据采集

调用opencv程序opencv_traincascade.exe样本训练程序进行训练

生成级联分类器文件

三:样本采集工作原理分析一

使用基于Haar特征的级联分类器的对象检测这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数;然后用于检测其他图像中的对象

在这里,我们将进行人脸检测举例说明

最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器。

然后,我们需要从中提取特征

为此,使用下图所示的Haar功能

它们就像我们的卷积核一样,每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值

四:样本采集工作原理分析二

现在,每个内核的所有可能大小和位置都用于计算许多功能。(试想一下它产生多少计算?即使是一个24x24的窗口也会产生超过160000个特征)。对于每个特征计算,我们需要找到白色和黑色矩形下的像素总和。为了解决这个问题,他们引入了整体图像。无论你的图像有多大,它都会将给定像素的计算减少到仅涉及四个像素的操作。很好,不是吗?它使事情变得更快

但是在我们计算的所有这些特征中,大多数都不相关。例如,考虑下图。第一行显示了两个良好的特征。选择的第一个特征似乎着眼于眼睛区域通常比鼻子和脸颊区域更暗的性质。选择的第二个特征依赖于眼睛比鼻梁更黑的属性。但是,将相同的窗口应用于脸颊或其他任何地方都是无关紧要的。那么,我们如何从16万多个功能中选择最佳特征?它是由Adaboost算法实现的

 

为此,我们将所有特征应用于所有训练图像。对于每个特征,它会找到最佳的阈值,该阈值会将人脸分为正面和负面。显然,会出现错误或分类错误。我们选择错误率最低的特征,这意味着它们是对人脸和非人脸图像进行最准确分类的特征。 (此过程并非如此简单。在开始时,每个图像的权重均相等。在每次分类后,错误分类的图像的权重都会增加。然后执行相同的过程。将计算新的错误率。还要计算新的权重。继续进行此过程,直到达到所需的精度或错误率或找到所需的功能数量为止

最终分类器是这些弱分类器的加权和

之所以称为弱分类,是因为仅凭它不能对图像进行分类,而是与其他分类一起形成强分类器该论文说,甚至200个功能都可以提供95%的准确度检测。他们的最终设置具有大约6000个功能。 (想象一下,从160000多个功能减少到6000个功能。这是很大的收获)

五:创建自己的级联分类器

5.1 创建自己的级联分类器第一步

准备好自己需要检测物的正样本图像

准备好自己需要检测物的负样本图像

如下图正样本为需要识别的车辆 

如下图,负样本是除了车辆以外的物体,如树木、行人、路牌等 ,排除识别

5.2 创建自己的级联分类器第二步

下载好OpenCV win10系统安装包

从安装包中的opencv\build\x64\vc15\bin 找到

opencv_createsamples.exe

opencv_traincascade.exe

opencv_world342.dll

将以上文件拷贝到正负样本文件路径下

5.3 创建自己的级联分类器第三步

创建正负样本的图像路径的txt文件

5.4 创建自己的级联分类器第四步

通过命令行执行命令进行样本采集生成car_samples.vec正样本矢量集文件

 opencv_createsamples.exe -info car_list.txt -vec car_samples.vec   -num 80 -w 33 -h 33
info字段填写正样本描述文件;
vec用于保存制作的正样本;
num制定正样本的数目;
w和-h分别指定正样本的宽和高

5.5 创建自己的级联分类器第五步

通过命令行执行命令进行训练生成

opencv_traincascade.exe -data data -vec car_samples.vec  -bg ng_data.txt  -numPos 80 -numNeg 240 numStages 7 -w 33 -h 33 -minHitRate 0.995 -maxFalseAlarmRate 0.45 -mode ALL
data:指定保存训练结果的文件夹;
vec:指定正样本集;
bg:指定负样本的描述文件夹;
numPos:指定每一级参与训练的正样本的数目(要小于正样本总数);
numNeg:指定每一级参与训练的负样本的数目(可以大于负样本图片的总数);
numStage:训练的级数;
w:正样本的宽;
h:正样本的高;
minHitRate:每一级需要达到的命中率(一般取值0.95-0.995);
maxFalseAlarmRate:每一级所允许的最大误检率;
mode:使用Haar-like特征时使用,可选BASIC、CORE或者ALL;
另外,还可指定以下字段:
featureType:可选HAAR或LBP,默认为HAAR;

创建自己的级联分类器第五步

效果展示如下:

最终得到的cascade.xml  即为级联分类器最终文件 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值