我找到了this关于创建自己的haar-classifier级联的教程。
这向我提出了一个问题:运行HaarTraining和创建自己的分类器(与使用OpenCv提供的级联相反)有什么好处(如果有的话)?
答案 0 :(得分:31)
Haar或LBP级联分类器是用于检测或刚性物体的常用技术。因此,培训自己的级联有两个主要观点:
OpenCV附带的级联不包括所有可能的对象类型。因此,如果要创建面部检测应用程序,则可以使用OpenCV级联之一,但如果需要检测狗,则无法使用级联。
OpenCV的级联很好,但它们不是最好的。这是一项具有挑战性的任务,但有可能培养一种具有更高检测率并产生更少假阳性和假阴性的级联。
还有一个主要评论:您的教程中使用的haartraining应用程序现在被OpenCV团队视为已弃用。 opencv_traincascade
是一个较新的版本,它有两个重要功能:它支持LBP功能,并支持多线程(TBB)。典型的差异看起来像这样
haartraining + singlecore>一个分类器3周。
traincascades + multicore<一个分类器30分钟。
但最糟糕的是,我不知道任何解释opencv_traincascade
用法的好教程。有关详细信息,请参阅this thread。
答案 1 :(得分:2)
我可以给你一个Linux示例。代码和技术来自各种来源。它遵循this example,但有一个python版本的mergevec,所以你不必编译mergevec.cpp文件。
假设您有两个裁剪&的文件夹准备积极&负片图像(本例中为.png文件),您将创建两个包含所有图像名称的文本文件:
find positive_images -iname "*.png" > positives.txt
find negative_images -iname "*.png" > negatives.txt
然后,使用Naotoshi Seo(在OpenCV / bin文件夹中)提供的createsamples.pl脚本,该脚本获取两个文本文件和一个输出文件夹,并创建.vec文件:
perl createsamples.pl positives.txt negatives.txt 'output' 1500 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxzangle 0.5 -w 50 -h 50"
使用名为mergevec.py的Blake Wulfe创建的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
如果一切顺利,请使用新创建的级联(classifier / cascade.xml),例如opencv示例中的facedetect.py:
opencv-3.0.0-rc1/samples/python2/facedetect.py --cascade classifier/cascade.xml test_movie.mp4