了解提取的要素的编码

时间:2014-12-29 14:52:16

标签: matlab image-processing encoding classification feature-detection

我关注的编码是费希尔编码,因为我已经证明我的工作效果最好。所以我想在我提取的(SIFT)功能上测试Fisher编码,并测试系统的性能,无论是否编码。

而不是重新开始我发现vl_feat有一个用于fisher编码的内置库,他们有一个教程,以及链接here

现在我已经完成了大部分需要但实际上编码的内容令我感到困惑,例如教程清楚地表明使用GMM获得的参数(例如[means, covariances, priors])和根据教程:

,将在GMM中使用SIFT提取的特征
  

Fisher编码使用GMM构建可视单词字典。至   举例说明构建GMM,考虑一些二维数据   点。在实践中,这些点将是SIFT或的集合   其他本地图像功能。

numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;

numClusters = 30 ;
[means, covariances, priors] = vl_gmm(data, numClusters);

然后,一旦我执行了这一步,我将编码另一个数据集?这让我很困惑。我已经使用我提取的SIFT功能为GMM生成参数。

  

接下来,我们创建另一组随机矢量,这些矢量应该被编码   使用Fisher Vector表示和刚刚获得的GMM:

encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

所以这里encoded是最终结果,但它编码了什么?我想要从我的图像中提取的SIFT功能进行编码,但是如果我按照GMM中使用的教程进行编码。如果是这种情况那么datatoBeEncoded是什么?我是否可以再次使用SIFT专长?

谢谢

更新

@Shai

谢谢,但我相信我一定做错了。我不太明白你的意思"比较图像和他们自己"。我有4个班,每班1000个图像。所以我使用了第1类中的前600个图像来学习gmm参数,然后使用这些参数来编码fisher矢量

numClusters = 128 ;
[means, covariances, priors] = vl_gmm(data, numClusters);

因此,每个means, covariances的大小为128 x 128,大小为1 x 128

现在,当我使用这些函数

对400幅图像上的fisher矢量进行编码时
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

编码的大小非常不同,大小为12000 x 1。这些不能与生成的模型进行比较。

我已经有一个系统正在处理数据集的非编码版本并且它运行良好,但我想看看编码将如何产生影响,理论上应该改进结果。

如果需要,我可以在这里添加代码,但它适用于UBM-GMM,我感到困惑的原因是因为你提到的训练方法是我用于UBM的。

如果我只编码测试图像,由于尺寸不匹配,我不能在分类器中使用它们。

也许我没有正确地选择这个或犯了一些愚蠢的错误,是否有可能得到一个简单的例子,我可以理解它的工作。

非常感谢

1 个答案:

答案 0 :(得分:3)

这个过程分为两个阶段:
(1)培训您使用的地方了解您域名的某些统计属性,以及
(2)测试您使用学习的表示/模型并将其应用于新样本。

因此,您应该将要素数据集拆分为两个“拆分”,一个用于学习Fisher编码的GMM(一个训练集),另一个用于将编码应用于(a < em> test set)。

通常你会拍摄大量代表你感兴趣领域的图像(例如,如果你对人们感兴趣,你应该考虑许多室内和室外人物的照片,特写镜头和团体照片等。)你提取尽可能多的您可以从这些训练图像中使用SIFT描述符并使用它们来学习模型:

numClusters = 30 ;
[means, covariances, priors] = vl_gmm(TrainingData, numClusters);

一旦您拥有此模型保存,您就可以将其应用于照片进行编码

encoding = vl_fisher(TestData, means, covariances, priors);

请注意,虽然TrainingData通常非常大并且可能会从数十(甚至数百)个图像中收集,但TestData可能会显着缩小,甚至可能是从收集的描述符单个图像。