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

时间:2015-02-03 16:00:45

标签: c++ opencv machine-learning libsvm multilabel-classification

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

到目前为止,'one-label'分类开箱即用,具有OpenCV C ++库提供的所有强大功能。目前我正在使用具有本地Sift描述符和SVM分类的BoW描述符。到现在为止还挺好。但现在我需要对图像进行概率估计。因此,不是“图像A是X类”,而是我需要输出“图像A具有50%似然等级X,具有10%等级Y,30%等级Z”等,并且具有估计值所有课程。

不幸的是,我不太适合机器学习。我开始研究这个问题,现在我的大脑受伤了。我的菜鸟问题:

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

P.S。:我知道之前有很多类似的问题在这里得到解答,但对我来说,没有一个能真正抓住我的观点。

1 个答案:

答案 0 :(得分:3)

SVM算法的一些实现确实提供了概率估计。但是,SVM 固有地提供概率估计。这是一个在"上添加的功能。在创建算法之后。这些概率估计值并非“值得信赖”,如果我没记错的话,出于这个原因,几个版本之前已经从Scikit-Learn库中删除了计算概率估计值的能力。但是,如果您坚持使用SVM,请查看LibSVM中的A Practical Guide to Support Vector Classification。它是OpenCV调用的库。您可以跳过数学来获得提示。 LibSVM的输出,以及OpenCV的SVM,在文档中进行了解释。或者,您可以选择使用LibSVM。这将允许您在不重新编译OpenCV的情况下获得概率估计(如链接中所示),但缺点是您必须将数据传递给LibSVM的相应表单(即,OpenCV'垫不太可能直接使用LibSVM。)

如果您正在使用线性SVM,即具有线性内核的SVM,那么您可以尝试使用Logistic回归分类器替换它,因为根据经验他们的行为类似(两者都是线性分类器,只是一个使用铰链损失而另一个使用铰链损失,后勤损失)。 Logistic回归的概率估计可行。

或者,考虑使用随机森林(或其变体,极随机树)分类器。它们还提供概率估计值,作为测试样本达到的给定叶节点中训练样本的比例。话虽如此,这两个分类器并非基于原理数学(虽然研究人员正在研究它们在理论上如何工作),尽管已知它们在许多现实世界环境中都能很好地工作(Kinect姿态估计就是一个例子)。

如果你的分类器从一开始就没有设计成这样做,那么概率估计是非常困难的,也就是说,不是你从标准统计机器学习教科书中找到的那个。这就像从一个人的屁股中拉出数字。大多数执行分类的算法只是计算得分"对于每个测试样本的每个类别/标签,并使用" best"得分了。这样做要容易得多。对于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