深度学习篇---Opencv中Haar级联分类器的自定义


文章目录

  • 1. 准备工作
    • 1.1安装 OpenCV
    • 1.2准备数据集
      • 1.2.1正样本
      • 1.2.2负样本
  • 2. 数据准备
    • 2.1 正样本的准备
      • 2.1.1步骤
      • 2.1.2生成正样本描述文件
      • 2.1.3示例命令
      • 2.1.4正样本描述文件格式
    • 2.2 负样本的准备
      • 2.2.1步骤
      • 2.2.2负样本描述文件格式
  • 3. 训练分类器
    • 3.1命令格式
    • 3.2参数说明
  • 4. 训练过程
    • 4.1训练输出
  • 5. 测试分类器
    • 5.1示例代码
  • 6. 优化分类器
  • 总结


训练自定义的 Haar 级联分类器是一个复杂但非常有用的过程,允许你检测特定的目标对象。以下是详细的步骤流程,包括数据准备、工具使用和训练过程


1. 准备工作

在开始训练之前,确保你已经安装了 OpenCV,并且可以使用 OpenCV 提供的工具(如 opencv_createsamplesopencv_traincascade)。

1.1安装 OpenCV

如果你还没有安装 OpenCV,可以通过以下命令安装:
pip install opencv-python opencv-python-headless
确保 OpenCV 的二进制工具(如 **opencv_createsamples** 和 **opencv_traincascade**)可用。

1.2准备数据集

训练 Haar 级联分类器需要两类数据:

1.2.1正样本

    正样本(Positive Samples):包含**目标对象的图像**。

1.2.2负样本

    负样本(Negative Samples):不包含目标对象的图像。

2. 数据准备

2.1 正样本的准备

正样本是包含目标对象的图像。为了训练分类器,正样本需要满足以下要求:

1.图像中只包含目标对象。2.目标对象在图像中的位置和大小应尽量一致。3.图像背景应尽量简单。

2.1.1步骤

1.收集包含目标对象的图像。2.使用图像编辑工具(如 GIMP 或 Photoshop)裁剪图像,确保目标对象位于图像中心,并且背景干净。3.将所有正样本图像调整为相同的尺寸(例如 24x24 像素)。4.将正样本图像保存到一个文件夹中,例如 positive_images/。

2.1.2生成正样本描述文件

使用 opencv_createsamples 工具生成正样本的描述文件。描述文件是一个文本文件每一行描述一个正样本图像及其目标对象的位置

2.1.3示例命令

opencv_createsamples -info positive_images.txt -vec samples.vec -num 1000 -w 24 -h 24
  1. -info positive_images.txt:指定正样本描述文件的路径。
  2. -vec samples.vec:生成的正样本向量文件
  3. -num 1000:正样本的数量。
  4. -w 24 -h 24:样本图像的宽度和高度。

2.1.4正样本描述文件格式

positive_images.txt 文件的每一行格式如下:

image_path num_objects x y width height
positive_images/img1.jpg 1 0 0 24 24
positive_images/img2.jpg 1 0 0 24 24

2.2 负样本的准备

负样本是不包含目标对象的图像。负样本用于训练分类器区分目标和非目标区域

2.2.1步骤

1.收集大量不包含目标对象的图像。2.将这些图像保存到一个文件夹中,例如 negative_images/。3.创建一个负样本描述文件 negatives.txt,每一行包含一个负样本图像的路径。

2.2.2负样本描述文件格式

negatives.txt 文件的每一行格式如下:

image_path
negative_images/bg1.jpg
negative_images/bg2.jpg

3. 训练分类器

使用 opencv_traincascade 工具训练 Haar 级联分类器。

3.1命令格式

opencv_traincascade -data output_dir -vec samples.vec -bg negatives.txt \
-numStages 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -numPos 1000 \
-numNeg 500 -w 24 -h 24 -mode ALL -precalcValBufSize 2048 \
-precalcIdxBufSize 2048

3.2参数说明

1.-data output_dir:指定输出目录,训练结果将保存在此目录中。2.-vec samples.vec:正样本向量文件。3.-bg negatives.txt:负样本描述文件。4.-numStages 20:训练的级联阶段数(通常为 10-20)。5.-minHitRate 0.995:每个阶段的最小命中率(通常为 0.995)。6.-maxFalseAlarmRate 0.5:每个阶段的最大误检率(通常为 0.5)。7.-numPos 1000:每个阶段使用的正样本数量。8.-numNeg 500:每个阶段使用的负样本数量。9.-w 24 -h 24:样本图像的宽度和高度。10.-mode ALL:使用所有 Haar 特征类型。11.-precalcValBufSize 2048:预计算值缓冲区大小(以 MB 为单位)。12.-precalcIdxBufSize 2048:预计算索引缓冲区大小(以 MB 为单位)。

4. 训练过程

训练过程可能需要数小时甚至数天,具体时间取决于数据集的大小和计算机的性能。训练过程中会显示每个阶段的进度和性能指标

4.1训练输出

每个阶段会生成一个 XML 文件(如 stage1.xml、stage2.xml 等)。
最终生成的分类器文件为 cascade.xml,保存在 output_dir 中。

5. 测试分类器

训练完成后,可以使用生成的 cascade.xml 文件进行目标检测。

5.1示例代码

import cv2#加载自定义 Haar 级联分类器
custom_cascade = cv2.CascadeClassifier('output_dir/cascade.xml')#读取图像
img = cv2.imread('test.jpg')#转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#检测目标
objects = custom_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))#绘制检测结果
for (x, y, w, h) in objects:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)#显示结果
cv2.imshow('Detected Objects', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 优化分类器

如果分类器的性能不理想,可以尝试以下优化方法:

1.增加正样本和负样本的数量。
2.调整训练参数(如 -numStages、-minHitRate、-maxFalseAlarmRate)。
3.使用更高质量的样本图像。

总结

训练自定义 Haar 级联分类器的流程包括数据准备、生成样本描述文件、训练分类器和测试分类器。虽然训练过程可能耗时,但通过合理的参数调整和数据优化,可以获得高性能的分类器,用于检测特定的目标对象。


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

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

相关文章

Smart Time Plus smarttimeplus-MySQLConnection SQL注入漏洞(CVE-2024-53544)

免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…

58.Harmonyos NEXT 图片预览组件架构设计与实现原理

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT 图片预览组件架构设计与实现原理 文章目录 Harmonyos NEXT 图片预览组件架构设计与实现原理效果预览一、组件架构概述1. 核心组件层…

虚拟机下ubuntu进不了图形界面

6.844618] piix4_smbus 0000:07.3: SMBus Host ContrFoller not enabled! 7.859836] sd 2:0:0:0:0: [sda] Assuming drive cache: wirite through /dev/sda1: clean, 200424/1966080 files, 4053235/7864064 blocks ubuntu启动时,卡在上面输出位置 当前遇到的原因…

Appium高级操作--从源码角度解析--模拟复杂手势操作

书接上回,Android自动化--Appium基本操作-CSDN博客文章浏览阅读600次,点赞10次,收藏5次。书接上回,上一篇文章已经介绍了appium在Android端的元素定位方法和识别工具Inspector,本次要介绍使用如何利用Appium对找到的元…

SpringBoot学生宿舍管理系统的设计与开发

项目概述 幽络源分享的《SpringBoot学生宿舍管理系统的设计与开发》是一款专为校园宿舍管理设计的智能化系统,基于SpringBoot框架开发,功能全面,操作便捷。该系统涵盖管理员、宿管员和学生三大角色,分别提供宿舍管理、学生信息管…

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下,众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器(TCXO)。该器件通过内置温度补偿电路,有效抑制环境温度变化对频率稳定性的影响&#x…

【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]

起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向代理&#…

Bash和Zsh的主要差异是?

Bash(GNU Bourne-Again Shell) 和 Zsh(Z Shell) 都是功能强大的Unix/Linux Shell,广泛用于交互式使用和脚本编写。 尽管它们有很多相似之处,但在功能、语法、配置选项等方面也存在一些显著的区别。 是Bas…

芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选

具有扩大的内存和超低功耗特性的超小型BG29是互联健康设备的理想之选 低功耗无线领域内的领导性创新厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日宣布:推出全新的第二代无线开发平台产品BG29系列无线片上系统…

【数据挖掘】知识蒸馏(Knowledge Distillation, KD)

1. 概念 知识蒸馏(Knowledge Distillation, KD)是一种模型压缩和知识迁移技术,旨在将大型复杂模型(称为教师模型)中的知识传递给一个较小的模型(称为学生模型),以减少计算成本&…

选型消息队列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka对比

选型消息队列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka对比 选型消息队列(MQ)1. 引言2. 消息队列核心指标3. MQ 技术对比分析4. 详细分析及案例4.1 ActiveMQ:传统企业级 MQ 方案4.2 RabbitMQ:高…

AWK 入门教程:强大的文本处理工具

AWK 是一种强大的文本处理工具,广泛用于 Linux/Unix 系统中对文本文件或数据流进行操作。它能够基于条件筛选、统计字段、重新排列数据等。主要特点包括: 2. AWK 的基本语法 2.1 AWK 程序的结构 AWK 程序的结构: awk pattern { action } file 2.2 常…

mysql select distinct 和 group by 哪个效率高

在有索引的情况下,SELECT DISTINCT和GROUP BY的效率相同;在没有索引的情况下,SELECT DISTINCT的效率高于GROUP BY‌。这是因为SELECT DISTINCT和GROUP BY都会进行分组操作,但GROUP BY可能会进行排序,触发filesort&…

使用conda将python环境打包,移植到另一个linux服务器项目中

问题:因为新的服务器A不能联网,导致离线pip install包耗时耗力,旧的服务器B中的Anaconda和A中是同一个版本,有现成的python环境,并且服务器B可以联网,现想将B中的环境,直接移植到A中使用。 解决…

晶晨S905M/晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包

晶晨S905M/晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包 线刷方法:(新手参考借鉴一下) 1、准备好一根双公头USB线刷刷机线,长度30-50CM长度最佳,同时准备一台电脑; 2、电脑上安装好…

KICK第四讲Linux 系统下安装 GCC 编译器全指南

Linux 系统下安装 GCC 编译器全指南 GCC(GNU Compiler Collection)是 Linux 系统下最常用的编译器之一,支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法,帮助开发者快速配置开发环境。 一、使用包管理…

Django系列教程(8)——函数视图及通用类视图

目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…

c# 查找相似颜色算法

下是一个基于欧几里得距离的C#颜色相似度查找算法实现,包含详细注释和优化策略: using System; using System.Collections.Generic;public class ColorMatcher {// 颜色容器 - 使用字典存储颜色ID到RGB的映射private readonly Dictionary<int, byte[]> _colorDictiona…

【A2DP】蓝牙音频编解码器互操作性要求详解

目录 一、音频编解码器互操作性&#xff1a;核心要点总览 二、必选与可选编解码器互操作性要求大盘点 2.1 必选与可选的编解码器支持 2.2 必选编解码器要求 2.3 可选编解码器要求 2.4 厂商自定义&#xff08;Vendor Specific&#xff09;A2DP编解码器互操作性要求 2.5 不…

electron 设置跨域iframe

在 Electron 的主进程中禁用同源策略 在 Electron 的主进程文件中添加 app.commandLine.appendSwitch("disable-site-isolation-trials"); 来禁用站点隔离试验。在创建 BrowserWindow 时&#xff0c;设置 webPreferences 的 webSecurity: false 来禁用同源策略。