多类图像分类与概率估计

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

到目前为止,’单标签’分类在OpenCV C++库提供的所有强大功能的支持下,表现得非常好。我目前使用的是带有局部Sift描述子的BoW描述子和SVM分类。一切进展顺利。但现在我需要对图像进行概率估计。因此,我需要的输出不是“图像A属于类X”,而是“图像A有50%的可能性属于类X,10%的可能性属于类Y,30%的可能性属于类Z”,等等,并对所有类别进行估算。

不幸的是,我在机器学习方面并不那么擅长。我开始研究这个问题,现在我的头脑一片混乱。我的新手问题如下:

  • libsvm选项-b probability_estimates是我要找的吗?
  • 有没有办法仅用OpenCV来实现这一点?(如果在OpenCV中获取多类分类中的SVM分类得分是唯一的方法,能否有人向我解释一下输出?)
  • 你有其他建议来实现我的目标吗?有哪些论文可以阅读,哪些库可以使用?

任何建议都将不胜感激。谢谢!

附注:我知道这里之前已经回答了很多类似的问题,但对我来说,没有一个真正抓住我的重点。


回答:

一些SVM算法的实现确实提供了概率估计。然而,SVM本身并不直接提供概率估计。这是一个在算法创建后添加的功能。这些概率估计并不“可靠”,如果我没记错的话,由于这个原因,Scikit-Learn库在几次发布前已经移除了计算概率估计的能力。尽管如此,如果你坚持使用SVM,可以参考来自LibSVM的支持向量分类实用指南。这是OpenCV调用的库。你可以跳过数学部分,直接看建议。LibSVM的输出,以及因此OpenCV的SVM的输出,在文档中有解释。或者,你可以选择直接使用LibSVM。这样你就可以在不重新编译OpenCV的情况下获得概率估计(如你链接中建议的),但缺点是你需要将数据转换成适合LibSVM的格式(即,OpenCV的Mat不太可能直接与LibSVM兼容)。

如果你使用的是线性SVM,即使用线性核的SVM,那么你可以尝试用逻辑回归分类器替换它,因为实证上它们表现相似(两者都是线性分类器,只是其中一个使用铰链损失,另一个使用逻辑损失)。逻辑回归的概率估计是有效的。

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

关键是,如果你的分类器不是从一开始就设计来进行概率估计的,那么生成概率估计是非常困难的,即,不是你从标准统计机器学习教科书中找到的那种。这就像是凭空捏造数字。大多数执行分类的算法只是为每个测试样本计算每个类别/标签的“得分”,然后选择“最佳”得分的那个。这要容易得多。对于SVM,它试图将这个得分“翻译”成“概率”,但它不是“校准”的,这实际上使它毫无用处。

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

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

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

如果你使用的是Python,或者只是想看看如何使用机器学习算法的教程,那么可以查看优秀的Scikit-Learn库

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注