具有SVM作为弱学习者的Opencv级联分类器

时间:2015-11-19 10:17:37

标签: c++ opencv svm libsvm cascade-classifier

我正在开展与人员检测相关的项目。我成功实现了基于HOG SVM的分类器(带有libSVM)和级联分类器(带有opencv)。 svm分类器工作得很好,我测试了很多视频,它正确地检测到了一些误报和一些假阴性的人;这里的问题是计算时间:在整个图像上接近1.2-1.3秒,在前景补丁上0.2-0.4秒;因为我正在开发一个必须能够在近乎实时的环境中工作的项目,所以我切换到了级联分类器(以减少计算时间)。 所以我用opencv(opencv_traincascade)训练了许多不同的级联分类器。输出在计算时间方面是很好的(在整个图像上0.2-0.3秒,只在前景上发射时少得多),所以我实现了目标,比方说。这里的问题是检测的质量:我得到了很多误报和很多假阴性。由于两个方法之间的唯一区别是opencv中使用的基本分类器(决策树或决策树桩,据我所知,无论如何都没有SVM),所以我开始认为我的问题可以是基础分类器(在某种程度上,猪的功能最好用超平面分隔我猜)。

当然,libsvm和Opencv中使用的数据集完全相同,无论是用于训练还是用于测试......为了完整起见,我使用了近9,000个正样本和近3万个负样本。

这是我的两个问题:

  • 是否可以在opencv_traincascade函数中更改基础弱学习器?如果是的话,它是svm可能的选择之一吗?如果两个答案都是肯定的,那我该怎么做呢? :)
  • 是否有其他计算机视觉或机器学习库将svm实现为弱分类器并且有一些训练级联分类器的方法? (这些库是否适合与opencv一起使用?)

一如既往地谢谢你!

马哥。

2 个答案:

答案 0 :(得分:1)

原则上弱分类器可以是任何东西,但Adaboost相关方法的优势在于它们能够从简单的分类器中获得良好的结果(由于某种原因,它们被称为“弱”)。 使用SVN和Adaboost级联是一个矛盾,因为前者不需要在这样的框架中使用:它能够自己完成它的工作,后者很快就因为它利用了弱分类器。
此外,我不知道有任何关于它的研究,OpenCv不支持它:你必须自己编写代码。这是一项艰巨的任务,可能你不会得到任何有趣的结果 无论如何,如果您认为HOG功能更适合您的任务,OpenCv的traincascade可以选择它,除了Haar和Lbp。 至于你的第二个问题,我不确定,但相信答案是否定的 我的建议是:尝试从traincascade获得最大的收益,例如尝试增加你可以使用的样本数量并比较结果。

答案 1 :(得分:0)

paper非常好。它只是说如果你使用较少的样本来训练SVM,可以将SVM视为弱分类器(假设不到训练集的一半)。权重越高,“弱SVM”训练的机会就越大。

遗憾的是,源代码并未广泛使用。如果你想要一个快速原型,使用python scikit学习,看看你是否可以在修改opencv之前得到理想的结果。