多类图像分类与概率估计

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

到目前为止,’单标签’分类在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

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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