以 SVM 作为弱学习器的 Opencv 级联分类器

Posted

技术标签:

【中文标题】以 SVM 作为弱学习器的 Opencv 级联分类器【英文标题】:Opencv cascade classifier with SVM as weak learner 【发布时间】:2016-02-21 10:11:27 【问题描述】:

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

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

这是我的两个问题:

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

一如既往地提前感谢您!

马可。

【问题讨论】:

【参考方案1】:

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

【讨论】:

您好 Giusppe,谢谢您的回答。你的观点是正确的,并且在级联中使用了 svm,我试图这样做是因为这篇论文“Fast Human Detection Using a Cascade of Histograms of Oriented Gradients”,Zhang Zhu,Shai Avidan,Mei-Chen Yeh,Kwang- Ting Cheng,2006,他们说它就像一个魅力!无论如何,我已经在使用 HOG 功能和 opencv 进行培训;最后我得到了一些结果(我增加了数据集 - 10k pos,60k neg),现在结果是“好”(远非完美但比以前更好......!)。我会接受你的回答!谢谢,再见【参考方案2】:

这个paper 不错。它只是说,如果您使用较少的样本来训练它(假设少于训练集的一半),SVM 可以被视为弱分类器。权重越高,被“弱 SVM”训练的机会就越大。

不幸的是,源代码并没有被广泛使用。如果你想要一个快速的原型,在修改 opencv 之前使用 python scikit learn 看看你是否能得到理想的结果。

【讨论】:

以上是关于以 SVM 作为弱学习器的 Opencv 级联分类器的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中的Haar级联分类器数据:

opencv训练好的分类器都有哪些

在 OpencV 中训练 SVM 分类器?

使用 SVM 作为图像分类器的精度/F 分数是不是可以达到 10%?

OpenCV中支持的人脸检测方法整理与汇总

[opencv][转载]利用级联分类器车辆检测训练