当前位置: 首页 > article >正文

深度学习篇---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.kler.cn/a/589019.html

相关文章:

  • Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)
  • 五大基础算法——贪心算法
  • 各省水资源平台 水资源遥测终端机都用什么协议
  • CSS中绝对定位
  • 【报错问题】在visual studio 终端使用npm -v后报错禁止运行脚本怎么处理
  • 大三下找C++开发实习的感受分享
  • 网络通信(传输层协议:TCP/IP ,UDP):
  • ADA-YOLO模型深度解析 | 自适应动态注意力驱动的目标检测新范式
  • 本地部署Deep Seek-R1,搭建个人知识库——笔记
  • 【Go每日一练】计算整数数组的最大子数组和
  • 深入解析大语言模型的 Function Call 实现—— 以 Qwen2.5为例
  • 02-Canvas-fabric.ActiveSelection
  • 浅谈Mysql数据库事务操作 用mybatis操作mysql事务 再在Springboot中使用Spring事务控制mysql事务回滚
  • 数学 :矩阵
  • 【Gitee】删除仓库的详细步骤
  • ArcGIS 水利制图符号库:提升水利工作效率的利器
  • 【QT:控件】
  • 第三百八十节 JavaFX教程 - JavaFX区域图
  • 【商城实战(38)】Spring Boot:从本地事务到分布式事务,商城数据一致性的守护之旅
  • 数据结构——单链表list