• 【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 创建自己的级联分类器第五步

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

    1. opencv_traincascade.exe -data data -vec car_samples.vec  -bg ng_data.txt  -numPos 80 -numNeg 240
    2. -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即为级联分类器最终文件 

  • 相关阅读:
    vue封装一个查询URL参数方法
    数据持久化第七课-URL重写与Ajax
    Git系列之Git入门级(带你走进Git的世界)
    调试笔记--STM32连不上仿真器
    【linux】初识进程
    SQLAlchemy & Oracle Database 23c Free 集成之旅
    Spring之事务实现原理及其注解@Transactional底层和传播机制原理
    ComfyUI中实现反推提示词的多种方案
    FFmpeg二次开发
    如何判断要不要用振动技术来进行设备预测性维护
  • 原文地址:https://blog.csdn.net/m0_56051805/article/details/126132913