如何使用 SIFT 和 SVM 实现通用图像分类器

how to implement a general image classifier using SIFT and SVM

我想训练我的 svm 分类器以使用 scikit-learn 进行图像分类。 而我想用opencv-python的SIFT算法函数提取图像feature.The情况如下:

1. scikit-learn的svm分类器输入是一个二维数组,即每一行代表一张图片,每张图片的特征量相同;here
2. opencv-python的SIFT算法returns一个关键点列表,它是一个形状为的numpy数组。 here
所以我的问题是:
我如何处理 SIFT 特征以适应 SVM 分类器的输入?你能帮帮我吗?

更新1:

感谢pyan的指点,我将我的方案修改如下:
1.从每个图像中获取SIFT特征向量
2. 对所有向量执行 k 均值聚类
3. 创建特征字典,a.k.a。食谱,基于聚类中心
4.根据特征字典重新表示每张图片,当然每张图片的维数是一样的
5. 训练我的 SVM 分类器并对其进行评估

更新2:

我把所有的图像SIFT特征向量收集到一个数组(x * 128)中,这个数组太大了,然后我需要对其进行聚类。
问题是:
如果我使用 k-means ,必须设置参数簇数,我不知道如何设置最佳值;如果我不使用 k-means,哪种算法可能适合这个?
note:I want to use scikit-learn to perform clustering

我的建议是:
1.对向量执行dbscan聚类,然后我可以得到label_size和标签;
2. 因为scikit-learn中的dbscan不能用于预测,我可以根据dbscan结果训练一个新的分类器A;
3. 分类器 A 就像一本食谱,我可以标记每个图像的 SIFT 向量。之后,每个图像都可以重新表示;
4.based 在上面的工作上,我可以训练我的最终分类器 B。
note:for predict a new image, its SIFT vectors must be transform by classifier A into the vector as classifier B's input

你能给我一些建议吗?

图像分类可以很一般。为了定义好的特征,首先你需要清楚你想要什么样的输出。例如,图像可以根据其中的场景分类为自然景观、城市景观、室内景观等。不同类型的分类可能需要不同类型的特征。

计算机视觉中用于基于关键字的图像分类的常用方法是词袋(特征装袋)或字典学习。您可以进行文献搜索以熟悉该主题。在您的情况下,基本思想是将 SIFT 功能分组到不同的集群中。不是直接给 scikit-learn 提供 SIFT 特征,而是给出特征组频率的向量作为输入。所以每个图像将由一个一维向量表示。

来自维基百科的简短介绍Bag-of-words model in computer vision