具有概率估计的多类图像分类

Multi-class image classification with probability estimation

本文关键字:图像分类 概率      更新时间:2023-10-16

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

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

不幸的是,我在机器学习方面并不那么称职。我开始调查这个问题,现在我的大脑很痛。我的菜鸟问题给你:

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

任何提示都值得赞赏。谢谢!

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

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

如果您使用的是线性 SVM,

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

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

如果你的分类器从一开始就不是为了

做到这一点而设计的,也就是说,不是你从标准统计机器学习教科书中找到的分类器之一,那么提出概率估计是非常困难的。这就像从屁股里掏出数字一样。大多数执行分类的算法只是为每个测试样本的每个类别/标签计算一个"分数",并使用具有"最佳"分数的算法。这要容易得多。对于 SVM,它试图将此分数"转换"为"概率",但它没有"校准",这实际上使其无用。

你可以看看这篇论文:用监督学习预测良好的概率,了解更多关于如何计算其中一些分类器的概率,以及为什么需要校准它们。

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

至于库,虽然OpenCV确实提供了一些机器学习算法,但它们非常有限。尝试使用适当的 ML 库。我假设你正在使用C++,所以我建议看看免费的幕府将军机器学习库。

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

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