目录

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

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



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