我找到了有关创建自己的 haar 分类器级联的本教程。
这向我提出了一个问题:运行 HaarTraining 和创建自己的分类器(与使用 OpenCv 提供的级联相比)有什么优势(如果有的话)?
我找到了有关创建自己的 haar 分类器级联的本教程。
这向我提出了一个问题:运行 HaarTraining 和创建自己的分类器(与使用 OpenCv 提供的级联相比)有什么优势(如果有的话)?
Haar 或 LBP 级联分类器是用于检测或刚性物体的常用技术。所以这里有两个要点来训练你自己的级联:
OpenCV 附带的级联并不涵盖所有可能的对象类型。因此,如果您要创建人脸检测应用程序,则可以使用其中一个 OpenCV 级联,但如果您需要检测例如狗,则没有现成的级联。
OpenCV 的级联很好,但不是最好的。这是一项具有挑战性的任务,但可以训练一个具有更高检测率并产生更少假阳性和假阴性的级联。
还有一个重要的评论:您的教程中使用的 haartraining 应用程序现在被 OpenCV 团队认为已弃用。opencv_traincascade
是一个较新的版本,它有两个重要的特性:它支持 LBP 特性和它支持多线程 (TBB)。典型的区别是这样的
一个分类器的 haartraining + 单核 > 3 周。
traincascades + multicore < 30 分钟一个分类器。
但最糟糕的是,我不知道任何解释opencv_traincascade
. 有关详细信息,请参阅此线程。
我可以给你一个 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