文章目录
- 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_createsamples 和 opencv_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
- -info positive_images.txt:指定正样本描述文件的路径。
- -vec samples.vec:生成的正样本向量文件。
- -num 1000:正样本的数量。
- -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 级联分类器的流程包括数据准备、生成样本描述文件、训练分类器和测试分类器。虽然训练过程可能耗时,但通过合理的参数调整和数据优化,可以获得高性能的分类器,用于检测特定的目标对象。