noo*_*ert 2 c++ opencv svm sift
我想使用 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]
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如果您需要任何进一步的说明和/或示例,请告诉我!