13

我找到了有关创建自己的 haar 分类器级联的本教程。

这向我提出了一个问题:运行 HaarTraining 和创建自己的分类器(与使用 OpenCv 提供的级联相比)有什么优势(如果有的话)?

4

2 回答 2

31

Haar 或 LBP 级联分类器是用于检测或刚性物体的常用技术。所以这里有两个要点来训练你自己的级联:

  1. OpenCV 附带的级联并不涵盖所有可能的对象类型。因此,如果您要创建人脸检测应用程序,则可以使用其中一个 OpenCV 级联,但如果您需要检测例如狗,则没有现成的级联。

  2. OpenCV 的级联很好,但不是最好的。这是一项具有挑战性的任务,但可以训练一个具有更高检测率并产生更少假阳性和假阴性的级联。

还有一个重要的评论:您的教程中使用的 haartraining 应用程序现在被 OpenCV 团队认为已弃用。opencv_traincascade是一个较新的版本,它有两个重要的特性:它支持 LBP 特性和它支持多线程 (TBB)。典型的区别是这样的

一个分类器的 haartraining + 单核 > 3 周。
traincascades + multicore < 30 分钟一个分类器。

但最糟糕的是,我不知道任何解释opencv_traincascade. 有关详细信息,请参阅此线程

于 2011-08-29T14:13:10.220 回答
2

我可以给你一个 Linux 的例子。代码和技术来自各种来源。它遵循此示例,但使用了 python 版本的 mergevec,因此您不必编译 mergevec.cpp 文件。

假设您有两个文件夹,其中包含已裁剪和准备好的正负图像(本示例中为 .png 文件),您将创建两个包含所有图像名称的文本文件:

find positive_images -iname "*.png" > positives.txt
find negative_images -iname "*.png" > negatives.txt

然后,使用 Naotoshi Seo 提供的createsamples.pl脚本(在 OpenCV/bin 文件夹中),它获取两个文本文件和一个输出文件夹,并创建 .vec 文件:

perl createsamples.pl positives.txt negatives.txt 'output' 1500 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxzangle 0.5 -w 50 -h 50"

接下来是由Blake Wulfe创建的名为 mergevec.py 的 python 脚本,它将通过组合子文件夹中的所有 .vec 文件来创建一个 output.vec 文件

python mergevec.py -v samples -o output.vec

假设这一切都完成了,如下使用 opencv_traincascade 应该会有所帮助:

opencv_traincascade -data classifier -vec output.vec -bg negatives.txt \
  -numStages 10 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 200 \
  -numNeg 400 -w 50 -h 50 -mode ALL

如果一切顺利,请将您新创建的级联(分类器/cascade.xml)与 opencv 示例中的 facedetect.py 之类的内容一起使用:

opencv-3.0.0-rc1/samples/python2/facedetect.py --cascade classifier/cascade.xml test_movie.mp4
于 2015-08-11T13:19:58.173 回答