首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解提取特征的编码

理解提取特征的编码
EN

Stack Overflow用户
提问于 2014-12-29 14:52:16
回答 1查看 1.9K关注 0票数 5

我关注的编码是fisher编码,因为我已经证明了我的工作取得了最好的效果。因此,我想测试fisher编码在我提取的(SIFT)特性,并测试系统的性能,无论是否编码。

与其重新开始,我发现vl_feat有一个内置的用于fisher编码的库,并且他们也有一个教程来实现这个链接的这里

现在,我已经完成了所需的大部分工作,但是实际编码的内容让我感到困惑,例如,本教程明确指出,fisher编码是使用GMM获得的参数(如[means, covariances, priors] )执行的,而SIFT提取的特性将在GMM中使用,如本教程所示:

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

代码语言:javascript
复制
numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;

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

那么,一旦我执行了这个步骤,我将编码另一个数据集?这就是让我困惑的地方。我已经使用我提取的SIFT特性来生成GMM的参数。

接下来,我们创建另一个随机向量集,它应该使用Fisher向量表示和刚得到的GMM编码:

代码语言:javascript
复制
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

因此,这里的encoded是最终结果,但它编码了什么?我希望我从图像中提取的SIFT特性被编码,但是如果我遵循GMM中使用的教程。如果是这样的话,那么datatoBeEncoded是什么?我又要在这里使用筛子了吗?

谢谢

更新

@Shai

谢谢,但我想我一定做错了什么。我不太明白你所说的“把图像和自己比较”是什么意思。我有4类,来自每班1000张图片。因此,我使用了第1类中的前600幅图像来学习gmm参数,然后使用这些参数对fisher向量进行编码。

代码语言:javascript
复制
numClusters = 128 ;
[means, covariances, priors] = vl_gmm(data, numClusters);

因此,每个means, covariances的大小都是128 x 128和大小1 x 128的前项。

现在,当我使用这些对400幅图像上的fisher矢量进行编码时,使用以下函数

代码语言:javascript
复制
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

编码的大小与12000 x 1大小有很大的不同。这些不能与生成的模型相比较。

我已经有一个系统正在处理数据集的非编码版本,而且它运行得很好,但是我想看看编码将如何改变,理论上结果应该得到改进。

如果需要的话,我可以在这里添加代码,但是它是针对UBM的,而我感到困惑的原因是因为您提到的训练方法就是我对UBM使用的方法。

如果我只是对测试图像进行编码,由于大小不匹配,我无法在分类器中使用它们。

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

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2014-12-31 16:18:40

在这个过程中有两个阶段:

(1)在您使用的培训中学习域的一些统计属性,以及

(2)在您使用所学表示/模型的地方进行测试,并将它们应用于新的样本。

因此,您应该将您的特性数据集分成两个“拆分”,一个用于学习用于Fisher编码的GMM(一个培训集),另一个用于将编码应用于(测试集)。

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

代码语言:javascript
复制
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(TrainingData, numClusters);

一旦您保存了这个模型,就可以将它应用到新的照片中来对它们进行编码。

代码语言:javascript
复制
encoding = vl_fisher(TestData, means, covariances, priors);

请注意,虽然TrainingData通常非常大,可以从几十个(甚至数百个)图像中收集,但TestData可能要小得多,甚至是从单个图像中收集的描述符。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27691052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档