如何使用SIFTfeatures/descriptors作为SVM训练的输入?

How to use SIFT features/descriptors as input for SVM training?

我想使用 C++ 将脑肿瘤的 MRI 图像分为良性和恶性。我正在使用 SIFT 功能,我正在关注的论文在训练 SVM 分类器之前使用 kmeans 对它们进行了聚类。我不明白的是为什么有必要这样做?据我所知,kmeans 仅对特征进行聚类;它不会改变输入的大小。

我读到可能的方法是 BoW 和直方图。 在直方图方法中,它只是计算每个聚类中的特征数量,对吗?我不认为这会提供我对良性和恶性肿瘤进行分类所需的信息,因为它们可以很小也可以很大。 在 BoW 方法中,我没看懂这个

基本上,我不知道如何处理我的 SIFT 特征以将其用作 SVM 的输入。我真的必须创建某种字典吗?我求你了,请赐教。非常感谢!

我不太熟悉 OpenCV 或 SIFT 功能,但这应该足够通用,对所有编程语言都有用。我也将在下面仅描述 BoW 方法。

假设我们有 N 张图片。对于每个图像 i,我们有 F 个特征,每个特征有 D 个维度。我们可以将所有特征放入一个数组feats,这样它看起来像这样:

[1, 2, ..., D]
[..., ..., ..., D]
[N*F, ..., ..., D] 

feats 的每一行是一个特征,具有 D 个维度,我们总共有 N*F 个特征。

在 k-means 中,我们采用所有这些特征并将它们分组到 k 个集群中。因此,每个单独的特征都分配给一个单独的集群。大多数 k-means 函数通常 return 一个大小为 k x D 的矩阵 C,它表示簇的质心。这个矩阵C就是k-means算法的"codebook"或者"dictionary"。有些还 return 一个大小为 N*F 的向量,它显示了每个特征被分配到哪个集群(在 OpenCv 中,这由 labels 变量表示,在这个 link 中:http://www.developerstation.org/2012/01/kmeans-clustering-in-opencv-with-c.html).

由于我们已经有了所有特征的分配,每个图像 i 都有 F 个特征,可以简单地用它们所属的簇来表示。例如,如果原始图像表示为

[1, 2, ..., D]
[..., ..., ..., D]
[F, ..., ..., D] 

那么图像也可以简单地表示为向量:

[1] % Assignment of feature 1
[...]
[F] % Assignment of feature F

因此,您可以获取此向量并形成表示的聚类的直方图 h。此直方图是图像的特征向量,您稍后可以在 SVM 中使用它。

P.S。如果您需要任何进一步的说明 and/or 举个例子,请告诉我!