在OpenCV中训练Haar级联目标检测器

在OpenCV中训练Haar级联目标检测器

💡 原文英文,约4100词,阅读约需15分钟。
📝

内容提要

本文介绍在OpenCV中训练Haar级联目标检测器的方法。由于OpenCV 4的训练工具已损坏,需使用OpenCV 3的opencv_traincascade和opencv_createsamples,建议通过Anaconda创建独立环境。以猫脸检测为例,采用Oxford-IIIT宠物数据集,将狗图作为负样本、猫图及边界框作为正样本,生成info文件并转换为vec文件,再运行训练命令,最终输出cascade.xml,可在OpenCV 4中加载用于检测。

🔎

延伸解读

训练工具版本限制与应对

文章指出OpenCV 4的训练工具已损坏且修复未发布,因此必须使用OpenCV 3的opencv_traincascade和opencv_createsamples。由于Python中无法共存OpenCV 3和4,建议通过Anaconda创建独立环境(如cvtrain)来安装OpenCV 3,训练完成后可丢弃该环境,最终模型可在OpenCV 4中加载使用。

正负样本准备的关键细节

以猫脸检测为例,文章将Oxford-IIIT宠物数据集中的狗图作为负样本,猫图及边界框作为正样本。正样本需生成info文件,每行包含文件名、边界框数量及每个框的左上角坐标和宽高;负样本只需文件名列表。随后用opencv_createsamples将info文件转换为vec文件,并指定窗口宽高(如30x30),该尺寸需与训练时一致。

训练参数与性能权衡

训练通过opencv_traincascade进行,需指定-data输出目录、-vec正样本文件、-bg负样本列表、-numPos/-numNeg每阶段样本数、-numStages级联阶段数以及-w/-h窗口尺寸。文章示例使用900正样本、2000负样本、10阶段,训练耗时超过3小时。每阶段需满足minHitRate(默认0.995)和maxFalseAlarmRate(默认0.5),阶段越多检测越慢但误报率越低。

结果评估与改进方向

训练输出cascade.xml,可在OpenCV 4中通过CascadeClassifier加载,并用detectMultiScale检测。文章示例显示猫脸被检出但存在误报。作者指出,训练数据未使用正方形边界框而训练和检测使用正方形窗口,调整数据集可能改善效果;训练命令行参数和detectMultiScale参数也会影响结果,需注意Haar级联速度快但阶段增加会降低速度。

❓

Q&A

为什么训练Haar级联分类器要用OpenCV 3而不是OpenCV 4?

因为OpenCV 4中用于训练Haar级联的命令行工具(opencv_traincascade和opencv_createsamples)已经损坏,且修复尚未提供,所以目前只能使用OpenCV 3来训练。训练完成后保存为XML模型,即可在OpenCV 4中加载使用。

如何为训练Haar级联准备正样本和负样本数据?

负样本只需一个纯文本文件列出所有负样本图片的路径(如狗的照片)。正样本需要生成一个info文件,每行格式为:文件名 边界框数量 x0 y0 w0 h0 ...,其中每个边界框由左上角坐标和宽高组成。然后使用opencv_createsamples工具将info文件转换为二进制vec文件。

opencv_createsamples命令中的-w和-h参数有什么作用?

-w和-h指定了正样本被裁剪并缩放后的宽度和高度(像素),这些尺寸必须与训练时opencv_traincascade命令中指定的-w和-h一致,以确保模型输入窗口大小统一。

训练Haar级联时,-numPos、-numNeg和-numStages分别代表什么?

-numPos是每个阶段使用的正样本数量;-numNeg是每个阶段使用的负样本数量;-numStages是要训练的级联阶段数。这些参数影响训练时间和模型性能,需要根据实际情况调整。

训练完成后如何用生成的cascade.xml进行目标检测?

使用cv2.CascadeClassifier加载cascade.xml,将待检测图像转换为灰度图,然后调用detectMultiScale方法(可设置scaleFactor、minNeighbors、minSize等参数)获取检测框,最后在图像上绘制矩形框即可。

训练一个Haar级联分类器大概需要多长时间?

根据文章示例,训练一个10阶段的猫脸检测器在现代计算机上耗时超过3小时(约3小时25分钟)。训练时间受阶段数、样本数量、图像尺寸等因素影响,阶段越多训练越慢。

🏷️

标签

➡️

继续阅读