【OpenCV-Python】教程:9-1 级联分类器训练

news2025/1/6 20:30:06

OpenCV Python 级联分类器训练

【介绍】

使用增强的弱分类器级联包括两个主要阶段: 训练和检测阶段。使用基于HAARLBP模型的检测,在object detection tutorial中进行了描述。本文档概述了训练您自己的增强弱分类器级联所需的功能。当前的手册将走过所有不同的阶段: 收集训练数据准备训练数据执行实际的模型训练

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

自OpenCV 4.0起,createsample和traincascade被禁用。考虑使用这些应用程序从3.4分支训练级联分类器。模型格式在3.4和4.x之间是相同的。

  • 如果你遇到任何教程提到旧的 opencv_haartraining工具(它已弃用,仍在使用OpenCV1.X 接口),然后请忽略该教程,并坚持使用 opencv_traincascade工具。该工具是一个较新的版本,根据 OpenCV 2.x OpenCV 3.x 的API。opencv_traincascade支持HAAR类小波特征和 LBP(局部二进制模式)特征。与 HAAR特征相比,LBP特征产生整数精度,产生浮点精度,因此使用 LBP的训练和检测都比使用 HAAR特征快几倍。对于 LBPHAAR的检测质量,主要取决于使用的训练数据和选择的训练参数。在一定百分比的训练时间内,训练一个基于 lbp的分类器可以提供几乎与基于 haar的分类器相同的质量。
  • OpenCV 2中更新的级联分类器检测接口。OpenCV 2.x 和 OpenCV 3.x (cv::CascadeClassifier)支持使用新旧模型格式。Opencv_traincascade甚至可以以旧格式保存(导出)训练好的级联,如果由于某种原因您无法使用旧的接口。至少训练模型可以在最稳定的接口中完成。
  • opencv_traincascade应用程序可以使用 TBB进行多线程。为了在多核模式下使用它,OpenCV必须在构建时启用 TBB支持。

【数据准备】

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

负样本

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

所描述的图像可能大小不同。然而,每个图像都应该等于或大于所需的训练窗口大小(对应于模型维度,大多数时候是对象的平均大小),因为这些图像用于将给定的负图像子抽样到具有此训练窗口大小的多个图像样本中。

一个这样的负样本描述文件的例子:

目录结构:

/img
    img1.jpg
    img2.jpg 
    ...
bg.txt

文件 bg.txt

img/img1.jpg
img/img2.jpg
...

这些负样本主要就是告诉机器,这些样本将不被接受,在检测时会忽略掉。

正样本

正样本是由 opencv_creatsamples应用程序创建的。它们被用于训练,告诉程序该识别哪些目标。该应用程序支持两种生成正样本数据集的方法。

    1. 你可以从单个正样本图像中生成一堆正样本图像。
    1. 你可以自己提供所有的正样本,只需要使用工具把它们剪下来,调整大小,然后把它们放在opencv需要的二进制格式中。

虽然第一种方法适用于固定物体,比如非常僵硬的logo,但它往往很快就会不适用于不那么僵硬的物体。在这种情况下,我们建议使用第二种方法。web上的许多教程甚至指出,通过使用 opencv_createssamples应用程序,100个真实物体图像可以产生比 1000个人工生成的阳性更好的模型。如果你决定采用第一种方法,请记住以下几点:

  • 请注意,在将其提供给上述应用程序之前,您需要多个正样本,因为它只应用透视图转换。
  • 如果您想要一个健壮的模型,那么就采取涵盖对象类中可能出现的各种类型的样本。例如,对于人脸,你应该考虑不同的种族和年龄群体,情绪,也许还有胡须风格。这也适用于使用第二种方法。

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

参数如下:

  • -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.dat

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

图像 img1.jpg 有一个目标,而图像 img2.jpg 有两个目标;

为了创建正样本, -info 代替 -img;

opencv 自带的标注工具

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

使用该工具也是很直接的,有如下几个参数:

  • --annotations (required) : 标注文件的路径 [example - /data/annotations.txt]
  • --images (required) : 包含图像的路径 [example - /data/testimages/]
  • --maxWindowHeight (optional) : 如果输入图像很大,可以进行调整高度
  • --resizeFactor (optional) : 调整图像缩放比例
opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/

按键

  • c: 确认标注和保存数据
  • d: 删除上一个标注信息
  • n: 下一张图片
  • ESC: 退出软件

【训练】

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

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

  • Common arguments:

    • -data <cascade_dir_name> : 训练的分类器存储的位置,
    • -vec <vec_file_name> : 正样本
    • -bg <background_file_name> : 负样本描述文件
    • -numPos <number_of_positive_samples> : 每个分类器训练阶段的正样本数
    • -numNeg <number_of_negative_samples> : 每个分类器训练阶段的负样本数
    • -numStages <number_of_stages> : 训练的 stages 数量
    • -precalcValBufSize <precalculated_vals_buffer_size_in_Mb> : 缓冲区的大小(单位 Mb),内存越大,训练越快
    • -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> : 预计算的特征索引缓冲区大小,单位Mb,越大,训练越快
    • -baseFormatSave : 该参数实际在haar类特性的情况下使用的。如果指定该参数,级联将以旧格式保存。这只适用于向后兼容的原因,并允许用户坚持使用旧的已弃用的接口,至少可以使用更新的接口来训练模型。
    • -numThreads <max_number_of_threads> : 训练期间使用的最大线程数。注意,实际使用的线程数可能更低,这取决于您的机器和编译选项。默认情况下,如果您构建了支持TBB的OpenCV,则会选择最大可用线程,这是优化所需要的。
    • -acceptanceRatioBreakValue <break_value> :此参数用于确定您的模型应该保持学习的精确程度以及何时停止学习。一个很好的指导方针是训练不超过10e-5,以确保模型不会过度训练你的训练数据。默认情况下,该值被设置为-1以禁用该特性。
  • Cascade parameters:

    • -stageType <BOOST(default)> : 阶段类型。目前只支持增强的分类器作为阶段类型。
    • -featureType<{HAAR(default), LBP}> : 特征类型:HAAR - HAAR样特征,LBP -局部二进制模式。
    • -w <sampleWidth> :训练样本的宽度(单位:像素)。必须与创建训练样本时使用的值完全相同(opencv_createsamples实用程序)。
    • -h <sampleHeight> :训练样本的高度(像素)。必须与创建训练样本时使用的值完全相同(opencv_createsamples实用程序)。
  • Boosted classifier parameters:

    • -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) [263] §4.1.
    • -maxFalseAlarmRate <max_false_alarm_rate> : 分类器每个阶段期望的最大误报率。总体误报率可估计为(max_false_alarm_rate ^ number_of_stages), [263] §4.1.
    • -weightTrimRate <weight_trim_rate> : 指定是否应该使用微调及其权重。一个不错的选择是0.95
    • -maxDepth <max_depth_of_weak_tree> : 弱树的最大深度。一个体面的选择是1,那是树桩的情况。
    • -maxWeakCount <max_weak_tree_count> : 每个级联阶段弱树的最大计数。增强的分类器(阶段)将有许多弱树(<=maxWeakCount),以实现给定的-maxFalseAlarmRate。
  • Haar-like feature parameters:

    • -mode <BASIC (default) | CORE | ALL> : 选择用于训练的Haar特征集的类型。 BASIC 使用直立特征, ALL 使用所有的特征,包括 45度旋转特征,See [149] for more details.
  • Local Binary Patterns parameters: 局部二进制模式没有参数。

opencv_traincascade应用程序完成其工作后,训练好的级联分类器模型将保存在-data文件夹中的cascade.xml文件中。该文件夹中的其他文件是为训练中断而创建的,请在训练结束后删除。

训练结束,你可以测试你的级联分类器!

【可视化】

在级联训练过程中,可视化总是有用的,可以看到哪些特征被选择了,以及每一个 stage 的复杂度,OpenCV 提供了一个 opencv_visualisation 软件,命令如下:

–image (required) : 目标模型测试用的图片
–model (required) : 训练的模型的路径
–data (optional) : 如果提供了一个数据文件夹(必须事先手动创建),则将存储每个阶段的输出,

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

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

  • 只处理用 opencv_traincascade工具训练的级联分类器模型,包含树桩作为决策树[默认设置]。
  • 所提供的图像需要是一个具有原始模型尺寸的示例窗口,并传递给——image参数。

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

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

在这里插入图片描述

每个阶段保存成一个图像用于将来特征的验证。

在这里插入图片描述

【参考】

  1. OpenCV: Cascade Classifier Training

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习-决策树算法原理及实现-附python代码

1.决策树-分类树 sklearn.tree.DecisionTreeClassifier官方地址&#xff1a; https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier 在机器学习中&#xff0c;决策树是最常用也是最强大的监督学…

用双因子认证2FA替换Google authenticator谷歌令牌,助力准上市公司实现等保安全审计

21世纪初&#xff0c;某人力资源科技公司试水HR SaaS赛道&#xff0c;以大客户为目标客群&#xff0c;持续深耕&#xff0c;稳扎稳打&#xff0c;如今已是一家专门为中大型企业提供一体化HR SaaS及人才管理产品/解决方案的头部企业。其产品覆盖了从员工招募、入职、管理到离职的…

Linux系统安装Mysql5.7(详解)

Linux系统上安装软件的3种方式&#xff1a; 本次使用二进制发布包安装方式安装Mysql5.7 &#xff08;一&#xff09;下载Mysql5.7的二进制包 这里可以选择去Mysql官网下载&#xff0c;但是由于服务在外国&#xff0c;下载速度实在是太慢了。这里我们可以选择去阿里云的镜像网…

数据通信基础 - 解调技术(PCM)

文章目录1 概述2 脉冲编码调制技术2.1 采样2.2 量化2.3 编码3 扩展3.1 网工软考真题1 概述 #mermaid-svg-K45XtgYRoAw04KU0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K45XtgYRoAw04KU0 .error-icon{fill:#5522…

医疗影像工具LEADTOOLS 入门教程: 使用文档编写器创建文档 - 控制台 C#

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

【数据结构】Leedcode消失的数字(面试题)

目录 一、题目说明 二、题目解析 一、题目说明 题目链接: leetcode消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#x…

菜鸟也能懂的 - 音视频基础知识。

前言 说到视频&#xff0c;大家自己脑子里基本都会想起电影、电视剧、在线视频等等&#xff0c;也会想起一些视频格式 AVI、MP4、RMVB、MKV等等。 但是我们如果认真思考这些应该就有很多疑问&#xff0c;比如以下问题&#xff1a; mp4 和 mkv有什么区别 &#xff1f; 视频封装…

Lua基本数据类型

Lua官网文档入口 http://www.lua.org/ document --> manual 一、基本数据类型 lua 中有八种基本数据型&#xff0c;分别是&#xff1a; nil&#xff0c;boolean&#xff0c;number&#xff0c;string&#xff0c;function&#xff0c;userdata&#xff0c;thread 和 tab…

vue - - - - - vue-property-decorator的使用

哪有小孩天天哭&#xff0c;哪有赌徒天天输 。遇到不会的技术、知识点&#xff0c;看得多了&#xff0c;掉的坑多了&#xff0c;也就会了。 vue-property-decorator的使用1. 单文件组件写法 - Component的使用2. 组件内使用变量3. 使用计算属性 - get的使用4. 生命周期5. metho…

Nydus 镜像扫描加速

文&#xff5c;余硕上海交通大学22届毕业生阿里云开发工程师从事云原生底层系统的开发和探索工作。本文 6369 字 阅读 16 分钟GitLink 编程夏令营是在 CCF 中国计算机学会指导下&#xff0c;由 CCF 开源发展委员会&#xff08;CCF ODC&#xff09;举办的面向全国高校学生的暑期…

Java字符集编码解码详细介绍

文章目录字符集字符集的基本认识字符集编码和解码字符集 字符集的基本认识 字符集基础知识 计算机底层不可以直接存储字符的。计算机中底层只能存储二进制(0、1) 二进制是可以转换成十进制的 计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储&#xff0c;这套…

【进阶C语言】数据的存储形式

文章目录一.数据类型分类二.整形的存储形式1.源码&#xff0c;反码&#xff0c;补码的关系内存中数据的存储——二进制源码&#xff0c;反码&#xff0c;补码的关系正数负数三.大小端1.概念2.例题&#xff1a;判断当前编译器的存储形式四.浮点数的存储形式1.二进制的补充&#…

【k8s系列】kube-state-metrics中kube_endpoint_address指标

文章目录背景环境操作方法1&#xff1a;kube_endpoint_address_not_ready选择大于0的验证方式1验证方式2方法2&#xff1a;kube_endpoint_address_available选小于0的方法3&#xff1a;kube_endpoint_address{ready"false"}选大于0的解释参考author: ningan123date: …

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分+微序幕就此拉开之RocketM消息中间件~整起

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 RocketMQ一、RocketMQ概念~一览无余1.消息队列有啥用&#xff1f;能干啥&#xff1f;消息队列的应用场景&#xff1f;2.常见的消息队列有哪些&#xff1f;如何进行消息队列的…

2、MySQL支持的数据类型

目录 1、整数类型 &#xff08;1&#xff09;fillzero&#xff1a;根据整数类型的长度自动添加0 &#xff08;2&#xff09;unsigned&#xff1a;非负整数 &#xff08;3&#xff09;bin&#xff08;m&#xff09;&#xff1a;将十进制数转为m进制 2、日期时间类型 &#x…

【MySQL基础教程】函数的介绍与使用

前言 本文为 【MySQL基础教程】函数的介绍与使用 相关知识&#xff0c;下边具体将对字符串函数&#xff0c;数值函数&#xff0c;日期函数&#xff0c;流程函数等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&…

MAXHUB+腾讯会议:为未来办公造一部动力引擎

科技领域有个规律&#xff0c;我们经常高估一年的变化&#xff0c;而低估了十年或者更长时间所可能发生的变化。不信可以做个测试&#xff0c;你觉得未来线上办公会怎么发展&#xff1f;不少朋友会说&#xff0c;既然线上办公是疫情到来之后的PlanB&#xff0c;那么随着疫情结束…

【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高速,最大时钟周期约为4us左右 因此使用软件模拟时序的方式来与模块通信 只需要将模块的4根线…

Golang Context 的几种应用场景

Golang context主要用于定义超时取消&#xff0c;取消后续操作&#xff0c;在不同操作中传递值。本文通过简单易懂的示例进行说明。 超时取消 假设我们希望HTTP请求在给定时间内完成&#xff0c;超时自动取消。 首先定义超时上下文&#xff0c;设定时间返回取消函数&#xff…

Apache POI操作百万数据excel实战方案及JDK性能监控工具Jvisualvm实战

百万数据报表概述 文章目录**百万数据报表概述****1、** **概述****2、 JDK性能监控工具介绍****2.1、 Jvisualvm概述****2.2、 Jvisualvm的位置****2.3、 Jvisualvm的使用****3、** **解决方案分析****4**、**百万数据报表导出****4.1** **需求分析****4.2** **解决方案****4.…