欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 深度学习篇---Opencv中Haar级联分类器的自定义

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

2025/3/14 7:30:00 来源:https://blog.csdn.net/2301_79556402/article/details/146223976  浏览:    关键词:深度学习篇---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 级联分类器的流程包括数据准备、生成样本描述文件、训练分类器和测试分类器。虽然训练过程可能耗时,但通过合理的参数调整和数据优化,可以获得高性能的分类器,用于检测特定的目标对象。


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词