图像检测功能:SIFT,HISTOGRAM和EDGE

时间:2013-07-31 04:29:36

标签: opencv image-processing histogram sift

我正在使用3种不同的功能开发对象分类器,即SIFT,HISTOGRAM和EGDE。

然而,这3个特征具有不同的维度向量,例如SIFT = 128维度。 HIST = 256。

由于尺寸不同,现在这些功能无法连接成一次矢量。我打算做什么,但我不确定这是否正确:

对于每个特征,我分别训练分类器,而不是分别对3个不同的特征应用分类,而不是计算多数,最后用多数票宣告图像。

你认为这是正确的方法吗?

1 个答案:

答案 0 :(得分:13)

有多种方法可以获得考虑多个功能的分类结果。你所建议的是一种可能性,而不是组合功能,你训练多个分类器,并通过一些协议,达成他们之间的共识。这通常属于整体方法的领域。尝试谷歌搜索增强,随机森林有关如何组合分类器的更多细节。

但是,由于特征向量具有不同的维度,因此无法将其连接起来。您仍然可以将这些功能连接成一个巨大的向量。例如,将您的SIFT和HIST功能结合在一起将为您提供384维度的向量。根据您使用的分类器,您可能必须对矢量的条目进行标准化,以便没有任何一个特征仅仅因为构造它具有更大的值而占主导地位。

编辑以回复您的评论: 您的直方图似乎是描述整个对象特征(例如颜色)的特征向量,而您的SIFT描述符是在该对象的本地兴趣关键点处提取的。由于SIFT描述符的数量可能因图像而异,因此您无法将它们直接传递给典型的分类器,因为它们通常会为您要分类的每个样本采用一个特征向量。在这种情况下,您必须使用从许多图像中提取的SIFT描述符构建代码簿(也称为可视字典)。然后,您将使用此代码簿来帮助您从每个图像中提取的许多SIFT描述符中派生单个特征向量。这就是所谓的“视觉词汇包(BOW)”模型。现在您有一个“汇总”SIFT描述符的向量,您可以将其与直方图连接以形成更大的向量。此单个矢量现在总结了整个图像/(图像中的对象)。

有关如何构建单词代码簿包以及如何使用它从每个图像中提取的许多SIFT描述符派生单个特征向量的详细信息,请查看本书(可从作者的网站免费下载){{3在“搜索图像”一章下。它实际上比听起来简单得多。

粗略地说,只需运行KMeans就可以从许多图像中聚类SIFT描述符,并将它们的质心(这是一个称为“视觉词”的向量)作为码本。例如。对于K = 1000,您有1000个可视单词码本。然后,为每个图像创建一个与K大小相同的结果向量(在本例中为1000)。该向量的每个元素对应于视觉词。然后,对于从图像中提取的每个SIFT描述符,在码本中找到其最接近的匹配向量,并在结果向量中的相应单元中递增计数。完成后,此结果向量基本上计算不同视觉单词在图像中出现的频率。类似的图像对于相同的视觉单词将具有相似的计数,因此该向量有效地表示您的图像。您还需要对此向量进行“规范化”,以确保具有不同数量的SIFT描述符(因此总计数)的图像具有可比性。这可以简单到简单地将每个条目除以向量中的总计数,或者通过更复杂的度量,例如书中描述的tf / idf。

我相信作者还会在他的网站上提供python代码来陪伴这本书。如果您不确定,请查看或试验它们。

更复杂的组合功能方法包括多核学习(MKL)。在这种情况下,您可以使用一个功能计算不同的内核矩阵。然后,您可以找到组合核矩阵的最佳权重,并使用组合的核矩阵来训练SVM。您可以在Shogun机器学习库中找到相应的代码。