如何使用SIFT功能/描述符作为SVM培训的输入?

时间:2015-08-07 05:47:21

标签: c++ opencv svm sift

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

我已经读过可能的方法是BoW和直方图。 在直方图方法中,它只计算每个群集中的功能数量吗?我不认为这将提供我对分类良性和恶性肿瘤所需的信息,因为它们既小又大。 在BoW方法中,我不理解这个link

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

1 个答案:

答案 0 :(得分:3)

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

我们假设我们有N张图片。对于每个图片i,我们有F个要素,每个要素都有D个尺寸。我们可以将所有功能放入数组feats中,以便它看起来像这样:

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

feats的每一行都是一个功能,尺寸为D,我们总共有N*F个功能。

在k-means中,我们采用所有这些功能并将它们分组到k个群集中。因此,每个功能都分配给一个群集。大多数k-means函数通常返回大小为C的矩阵k x D,其表示聚类的质心。该矩阵C是"代码簿"或"字典" k均值算法。有些还会返回大小为N*F的向量,该向量会显示每个要素分配给哪个群集(在OpenCv中,这由此链接中的labels变量表示: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。如果您需要任何进一步的说明和/或示例,请告诉我们!