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

时间:2015-05-29 14:23:59

标签: image classification svm sift

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

1. svm分类器的scikit-learn输入是2-d数组,这意味着每行代表一个图像,每个图像的特征量是相同的; here
2. opencv-python的SIFT算法返回一个关键点列表,这是一个形状为enter image description here的numpy数组。 here
所以我的问题是:
我如何处理SIFT功能以适应SVM分类器的输入?你能救我吗?

UPDATE1

感谢pyan的建议,我调整了我的建议如下:
1.从每个图像中获取SIFT特征向量
2.对所有向量执行k均值聚类 3.创建基于集群中心的特征字典a.k.a. cookbook 4.基于特征字典重新表示每个图像,当然每个图像的尺寸量是相同的 5.训练我的SVM分类器并对其进行评估

UPDATE2:

我已经将所有图像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向量。之后,每个图像都可以重新表示;
基于上述工作,我可以训练我的最终分类器B.
note:for predict a new image, its SIFT vectors must be transform by classifier A into the vector as classifier B's input

你能给我一些建议吗?

1 个答案:

答案 0 :(得分:4)

图像分类可以非常通用。为了定义好的功能,首先需要明确您想要的输出类型。例如,图像可以根据其中的场景分为自然视图,城市视图,室内视图等。不同类别的分类可能需要不同类型的特征。

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

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