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

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

不幸的是,我在机器学习方面不那么称职。我开始研究这个问题,现在我的脑痛。我对您的新问题:

  • 我正在寻找libsvm选项-b probability_estimates吗?
  • 是否可以仅使用OpenCV做到这一点? (如果Get SVM classification score in multiclass classification with OpenCV是唯一方法,有人可以向我解释输出吗?)
  • 您对实现我的目标还有其他建议吗?论文阅读,图书馆使用?

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

    附注:我知道之前也回答过很多类似的问题,但对我来说,没有一个问题能真正捕获我的意思。

    最佳答案

    SVM算法的某些实现确实提供了概率估计。但是,SVM本身并不提供概率估计。创建算法后,此功能将“附加”。这些概率估计值不是“可信赖的”,并且,如果我没有记错的话,出于这个原因,Scikit-Learn库在几年前已删除了计算概率估计值的功能。不过,如果您坚持使用SVM,请查看LibSVM中的A Practical Guide to Support Vector Classification。它是OpenCV调用的库。您可以跳过数学以获得提示。 LibSVM的输出以及OpenCV的SVM均在文档中进行了说明。或者,您可以选择使用LibSVM。这将使您无需重新编译OpenCV即可获得概率估计值(如您的链接中所建议),但缺点是您必须将数据传递给LibSVM的适当格式(即,OpenCV的Mat不太可能直接与LibSVM一起使用)。

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

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

    如果您的分类器不是一开始就设计的,那就是很难估计出概率估计值,即不是从标准统计机器学习教科书中找到的分类器之一。就像把数字拔出来一样。大多数执行分类的算法都只是为每个测试样本的每个类别/标签计算一个“分数”,并与具有“最佳”分数的样本相匹配。这很容易做到。对于SVM,它尝试将此分数“转换”为“概率”,但未进行“校准”,这实际上使其变得无用。

    您可以看一下本文:Predicting Good Probabilities With Supervised Learning,以获取有关如何对这些分类器中的一些进行计算的概率以及为何需要对其进行校准的更多详细信息。

    通常,我建议采取分类器返回的概率估计值。如果需要它们,请使用统计分类器,例如Logistic回归而不是SVM。

    至于库,尽管OpenCV确实提供了一些机器学习算法,但是它们非常有限。尝试适当的ML库。我假设您正在使用C++,所以我建议您看一下免费的Shogun Machine Learning Library

    如果您使用的是Python,或者只是想看看有关如何使用机器学习算法的教程,请查看出色的Scikit-Learn library

    有关将机器学习算法应用于行业问题(幻灯片)的一些一般建议:Experiences and Lessons in Developing Industry-Strength Machine Learning and Data Mining Software

    08-24 23:26