使用SIFT特征进行SVM分类器的训练

4

我希望使用SIFT DESCRIPTOR和SVM将一组图片分为4类。现在,使用SIFT extractor可以得到不同大小的关键点。例如img1有100个关键点,img2有55个关键点……我该如何使用matlab构建直方图以生成固定大小的向量?

3个回答

9
在这种情况下,稠密sift可能是一个不错的选择。
有两个主要阶段:
第一阶段:创建码本。
1.将输入图像分成一组子图像。 2.在每个子图像上应用sift。每个关键点将具有128维特征向量。 3.通过简单地应用k-means聚类和选择的k来对这些向量进行编码以创建码本。每个图像将产生一个大小为128 * m的矩阵Vi(i <= n且n是用于创建码字的图像数量)。因此,K-means的输入是由所有i的Vi水平连接而成的大矩阵V。K-means的输出是一个大小为128 * k的矩阵C。
第二阶段:计算直方图。
对于数据集中的每个图像,执行以下操作:
  1. 创建大小为k的零直方图向量h
  2. 像第一阶段的步骤2中那样应用密集sift。
  3. 对于每个关键点的向量,在码本矩阵C中找到它的“最佳匹配”向量的索引(可以是欧几里得距离中的最小值)。
  4. h中相应的箱增加1。
  5. 通过L1或L2范数对h进行归一化。

现在h已准备好进行分类。

另一个可能性是使用Fisher向量而不是码本,https://hal.inria.fr/file/index/docid/633013/filename/jegou_aggregate.pdf


你能解释一下测试和训练过程应该如何进行吗?我正在尝试实现你在这里描述的方法,但不知道如何测试模型。如果我有一个带标签的图像数据集,首先,我需要为测试图像创建一个码本,对吧?然后,对于数据集中的每个图像,我使用测试图像的码本计算直方图。因此,我得到了一堆直方图,可以用来训练我的SVM。但是如何测试它呢?我如何将我的单个输入图像转换成那些直方图的格式,以便可以在其上测试已经训练好的SVM?或者我的理解是错误的? - Denis Yakovenko
1
好的,我想我明白了。 我应该为整个数据集创建一个代码本,而不是“输入图像”。 然后,只有使用生成的代码本才能创建直方图。 - Denis Yakovenko

6
您将始终获得不同数量的关键点以获取不同图像,但每个描述符点的特征向量大小保持不变,即128。人们更喜欢使用矢量量化或K-Mean聚类,并构建单词袋模型直方图。您可以查看this线程。

1
使用传统的SIFT方法,每张图像中的关键点数量不会相同。实现这一点的方法之一是密集采样描述符,使用Dense SIFT,在图像顶部放置一个正则网格。如果所有图像的大小相同,则每个图像将具有相同数量的关键点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接