如何使用 SIFT 特征/描述符作为 SVM 训练的输入?

noo*_*ert 2 c++ opencv svm sift

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

我读过可能的方法是 BoW 和直方图。在直方图方法中,它只计算每个集群中的特征数量,对吗?我认为这不会提供我对良性和恶性肿瘤进行分类所需的信息,因为它们可以既小又大。在 BoW 方法中,我不理解此链接

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

nee*_*uck 5

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

假设我们有N图像。对于每个图像i,我们有F许多特征,每个特征都有D维度。我们可以将所有功能放入一个数组中feats,使其看起来像这样:

[1, 2, ..., D]
[..., ..., ..., D]
[N*F, ..., ..., D] 
Run Code Online (Sandbox Code Playgroud)

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

在 k-means 中,我们获取所有这些特征并将它们分组到k集群中。因此,每一个特征都被分配给一个集群。大多数 k-means 函数通常返回一个C大小为 的矩阵k x D,它表示集群的质心。这个矩阵C是 k-means 算法的“码本”或“字典”。有些还返回一个大小向量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] 
Run Code Online (Sandbox Code Playgroud)

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

[1] % Assignment of feature 1
[...]
[F] % Assignment of feature F
Run Code Online (Sandbox Code Playgroud)

因此,您可以采用此向量并形成h所表示的集群的直方图。此直方图是图像的特征向量,您稍后可以在 SVM 中使用它。

PS如果您需要任何进一步的说明和/或示例,请告诉我!

  • (1) 您聚类的向量/特征来自两个类。(2) 直方图的大小为 `k`。直方图中的元素 i 是集群 i 在图像中出现的次数。我很高兴能帮上忙 :D (2认同)
  • 您可以尝试空间金字塔匹配 (SPM)。它类似于 BoW,你可以在这里阅读它:http://www.csd.uwo.ca/~olga/Courses/Fall2014/CS9840/Papers/lazebnikcvpr06b.pdf。这个版本确实考虑了补丁之间的空间关系。基本上,金字塔的第 0 层是标准的弓。在级别 1 计算标准 BoW,然后将图像划分为 4 个区域。计算每个区域的直方图并加权更高。因此,您有 5 个直方图,可以更好地显示补丁之间的关系。如果您对此有具体问题,请告诉我。 (2认同)