我正在通过使用 3 个不同的功能(即 SIFT、HISTOGRAM 和 EGDE)来开发对象分类器。
然而,这 3 个特征具有不同的维向量,例如 SIFT = 128 维。历史 = 256。
现在,由于大小不同,这些特征无法连接到一次向量中。我打算做的,但我不确定它是否会是正确的方式是这样的:
对于每个特征,我分别训练分类器,然后分别对 3 个不同的特征应用分类,然后计算多数,最后以多数票声明图像。
你认为这是正确的方法吗?
我正在通过使用 3 个不同的功能(即 SIFT、HISTOGRAM 和 EGDE)来开发对象分类器。
然而,这 3 个特征具有不同的维向量,例如 SIFT = 128 维。历史 = 256。
现在,由于大小不同,这些特征无法连接到一次向量中。我打算做的,但我不确定它是否会是正确的方式是这样的:
对于每个特征,我分别训练分类器,然后分别对 3 个不同的特征应用分类,然后计算多数,最后以多数票声明图像。
你认为这是正确的方法吗?
有几种方法可以获得考虑到多个特征的分类结果。您所建议的一种可能性是,您可以训练多个分类器并通过某种协议而不是组合特征,而是在它们之间达成共识。这通常属于集成方法领域。尝试使用谷歌搜索增强随机森林,以获取有关如何组合分类器的更多详细信息。
但是,您的特征向量不能连接起来是不正确的,因为它们具有不同的维度。您仍然可以将这些特征连接在一起形成一个巨大的向量。例如,将您的 SIFT 和 HIST 特征连接在一起将为您提供一个 384 维的向量。根据您使用的分类器,您可能必须对向量的条目进行规范化,以便没有一个特征仅仅因为通过构造它具有更大的值而占主导地位。
编辑以回应您的评论:您的直方图似乎是一些特征向量,描述了整个对象的特征(例如颜色),而您的 SIFT 描述符是在该对象的局部兴趣关键点处提取的。由于 SIFT 描述符的数量可能因图像而异,因此您不能将它们直接传递给典型的分类器,因为它们通常会在您希望分类的每个样本中获取一个特征向量。在这种情况下,您将不得不使用从许多图像中提取的 SIFT 描述符构建一个码本(也称为视觉词典)。然后,您将使用此代码簿来帮助您从从每个图像中提取的许多 SIFT 描述符中导出单个特征向量。这就是所谓的“视觉词袋”(BOW)" 模型。现在您有一个“总结”SIFT 描述符的向量,您可以将其与直方图连接以形成更大的向量。这个向量现在总结了整个图像/(图像中的对象)。
有关如何构建词袋码本以及如何使用它从从每个图像中提取的许多 SIFT 描述符中导出单个特征向量的详细信息,请查看本书(可从作者的网站免费下载)http://programmingcomputervision。 com/在“搜索图像”一章下。它实际上比听起来简单得多。
粗略地说,只需运行 KMeans 来对来自许多图像的 SIFT 描述符进行聚类,并将它们的质心(这是一个称为“视觉词”的向量)作为码本。例如,对于 K = 1000,您有 1000 个视觉字码本。然后,对于每个图像,创建一个与 K 大小相同的结果向量(在本例中为 1000)。这个向量的每个元素对应一个视觉词。然后,对于从图像中提取的每个 SIFT 描述符,在码本中找到其最接近的匹配向量,并增加结果向量中相应单元格中的计数。完成后,此结果向量实质上会计算不同视觉词在图像中出现的频率。对于相同的视觉词,相似的图像将具有相似的计数,因此该向量有效地代表了您的图像。您还需要“规范化” 这个向量以确保具有不同数量的 SIFT 描述符(以及因此总计数)的图像具有可比性。这可以像简单地将每个条目除以向量中的总计数一样简单,也可以通过更复杂的度量,例如书中描述的 tf/idf。
我相信作者也在他的网站上提供了python代码来附书。如果您不确定,请查看或试验它们。
用于组合特征的更复杂的方法包括多核学习 (MKL)。在这种情况下,您计算不同的内核矩阵,每个使用一个特征。然后,您可以找到组合核矩阵的最佳权重,并使用组合核矩阵来训练 SVM。您可以在 Shogun 机器学习库中找到此代码。