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

Posted

技术标签:

【中文标题】如何使用 SIFT 和 SVM 实现通用图像分类器【英文标题】:how to implement a general image classifier using SIFT and SVM 【发布时间】:2015-08-12 11:14:17 【问题描述】:

我想用 scikit-learn 训练我的 svm 分类器进行图像分类。 而我想使用opencv-python的SIFT算法函数来提取图像特征。情况如下: 1. scikit-learn的svm分类器的输入是一个二维数组,也就是说每一行代表一张图片,每张图片的特征量是一样的;here 2. opencv-python 的 SIFT 算法返回一个关键点列表,它是一个形状为 的 numpy 数组。 here 所以我的问题是: 我如何处理 SIFT 特征以适应 SVM 分类器的输入?你能帮帮我吗?

更新1

感谢 pyan 的建议,我已将我的建议修改如下: 1. 从每张图像中获取 SIFT 特征向量 2. 对所有向量执行 k-means 聚类 3. 基于集群中心创建特征字典,又名食谱 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和labels; 2. 因为scikit-learn中的dbscan不能用于预测,所以我可以根据dbscan结果训练一个新的分类器A; 3. 分类器 A 就像一本食谱,我可以标记每个图像的 SIFT 向量。之后,每个图像都可以重新表示; 4.基于以上工作,我可以训练我的最终分类器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】:

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

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

来自***的简短介绍Bag-of-words model in computer vision

【讨论】:

感谢您的帮助,我已将我的建议改编为上述,期待您的建议! 我觉得这很合理。祝你好运!

以上是关于如何使用 SIFT 和 SVM 实现通用图像分类器的主要内容,如果未能解决你的问题,请参考以下文章

SVM 分类器没有保存在“.xml”中?

如何使用 bagging 集成 SVM 和 CNN 分类器?

SVM 分类器和测试图像

如何让 Opencv SVM 更快?

基于SVM的分类器Python实现

以 SVM 作为弱学习器的 Opencv 级联分类器