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

标签 c++ opencv svm libsvm cascade-classifier

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

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

这里是我的两个问题:

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

一如既往地提前感谢您!

马可。

最佳答案

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

关于c++ - 以 SVM 作为弱学习器的 Opencv 级联分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33800996/

相关文章:

c++ - 引用其他引用和指向引用的指针

c++ - 在容器中存储多重继承对象

c++ - 使用 Cython 包装使用 OpenCV 类型作为参数的 C++ 类

c++ - 创建 CvSVM vector 的 vector (数组)

python - [scikit 学习] : Anomaly Detection - Alternative for OneClassSVM

c++ - 查找 'SEGV on unknown address' 的原因,由 READ 访问引起

c++ - 从 C 优雅地调用 C++

java - 整齐地返回轮廓 - OpenCV/Java

c++ - Opencv如何使用MatIterator迭代具有浮点RGB值的彩色图像?

machine-learning - 如何在使用 libSVM(RBF 内核)进行网格搜索后选择 C ​​和 gamma 以获得最佳泛化能力?