3

我的目标是通过概率估计进行多类图像分类。

到目前为止,“单标签”分类与 OpenCV C++ 库提供的所有强大功能开箱即用地运行良好。目前我正在使用带有本地 Sift 描述符和 SVM 分类的 BoW 描述符。到目前为止,一切都很好。但现在我需要对图像进行概率估计。因此,我需要的不是“图像 A 是 X 类”,而是输出“图像 A 具有 50% 的可能性 X 类、10% 的 Y 类、30% 的 Z 类”等,并对所有类进行估计。

不幸的是,我在机器学习方面没有那么胜任。我开始调查这个问题,现在我的大脑很痛。我的菜鸟问题:

  • 是 libsvm 选项-b probability_estimates是我正在寻找的吗?
  • 有没有办法仅使用 OpenCV 来做到这一点?(如果在使用 OpenCV 的多类分类中获取 SVM 分类分数是唯一的方法,有人可以向我解释一下输出吗?)
  • 您对如何实现我的目标还有其他建议吗?要阅读的论文,要使用的图书馆?

任何提示表示赞赏。谢谢!

PS:我知道以前在这里回答过很多类似的问题,但对我来说,没有一个能真正抓住我的观点。

4

1 回答 1

3

SVM 算法的一些实现确实提供了概率估计。然而,SVM 本身并不提供概率估计。它是在创建算法后“附加”的功能。这些概率估计不是“可信的”,如果我没记错的话,计算概率估计的能力在几个版本之前就因为这个原因从 Scikit-Learn 库中删除了。不过,如果您坚持使用 SVM,请查看支持向量分类的实用指南来自 LibSVM。它是 OpenCV 调用的库。您可以跳过数学以获取提示。LibSVM 的输出以及 OpenCV 的 SVM 在文档中进行了解释。或者,您可以选择使用 LibSVM。这将允许您在不重新编译 OpenCV 的情况下获得概率估计(如您的链接中所建议的那样),但缺点是您必须将数据传递给 LibSVM 的适当形式(即,OpenCV 的 Mat 不太可能直接与 LibSVM 一起使用)。

如果您使用的是线性支持向量机,即带有线性内核的支持向量机,那么您可以尝试用逻辑回归分类器替换它,因为根据经验它们的行为相似(两者都是线性分类器,只是一个使用铰链损失,另一个使用逻辑损失)。逻辑回归的概率估计会起作用。

或者,考虑使用随机森林(或其变体,极随机树)分类器。它们还提供概率估计,作为测试样本达到的给定叶节点中训练样本的比例。话虽如此,这两个分类器并不是基于原则性数学(尽管研究人员正在努力弄清楚它们在理论上是如何工作的),尽管众所周知它们在许多现实世界的环境中都表现出色(Kinect 姿势估计就是一个例子)。

如果您的分类器不是从一开始就设计成这样做的,即不是您从标准统计机器学习教科书中找到的分类器,那么提出概率估计是一件非常困难的事情。这就像从一个人的屁股中拉出数字一样。大多数执行分类的算法只是为每个测试样本的每个类别/标签计算一个“分数”,然后使用具有“最佳”分数的那个。这更容易做到。对于 SVM,它试图将这个分数“翻译”为“概率”,但它没有被“校准”,这实际上使它毫无用处。

您可以查看这篇论文:Predicting Good Probabilities With Supervised Learning,以获取有关如何计算其中一些分类器的概率以及为什么需要校准它们的更多详细信息。

一般来说,我建议对分类器返回的概率估计持怀疑态度。如果您想要它们,请使用统计分类器,例如逻辑回归,而不是 SVM。

至于库,虽然 OpenCV 确实提供了一些机器学习算法,但它们非常有限。尝试一个合适的 ML 库。我假设您使用的是 C++,所以我建议您查看免费的Shogun 机器学习库

如果您正在使用 Python,或者只是想看看有关如何使用机器学习算法的教程,请查看优秀的Scikit-Learn 库

关于将机器学习算法应用于行业问题的一些一般建议(幻灯片):开发行业优势机器学习和数据挖掘软件的经验和教训

于 2015-02-04T05:14:32.297 回答