了解提取特征的编码

Posted

技术标签:

【中文标题】了解提取特征的编码【英文标题】:Understanding encoding of extracted features 【发布时间】:2015-02-25 18:26:13 【问题描述】:

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

我发现 vl_feat 有一个用于 Fisher 编码的内置库,而不是从头开始,他们有一个教程链接here

现在我已经完成了大部分所需的操作,但实际编码的内容让我感到困惑,例如教程清楚地表明,使用 GMM 获得的参数(例如 [means, covariances, priors] 和提取的 SIFT)执行 Fisher 编码功能将按照教程在 GMM 中使用:

Fisher 编码使用 GMM 来构建视觉词典。到 举例构造一个 GMM,考虑一些二维数据 点。在实践中,这些点将是 SIFT 或 其他本地图像特征。

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

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

那么,一旦我执行了这一步,我要对另一个数据集进行编码吗?这让我感到困惑。我已经使用我提取的 SIFT 特征来生成 GMM 的参数。

接下来,我们创建另一个随机向量集,应该对其进行编码 使用Fisher向量表示和刚刚得到的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】:

您在此过程中有两个阶段: (1) 培训 您在其中使用了解您的域的一些统计属性,以及 (2) 测试您使用学习的表示/模型并将它们应用于新样本。

因此,您应该将特征数据集拆分为两个“拆分”,一个用于学习 Fisher 编码的 GMM(一个 training 集),另一个拆分以将编码应用于(a 测试设置)。

通常您会抽取大量能够很好地代表您感兴趣的领域的图像(例如,如果您对人物感兴趣,则应该考虑许多室内和室外人物的照片、特写和合影等)。尽可能从这些训练图像中筛选描述符并使用它们来学习模型:

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

一旦你有了这个模型保存它,你就可以将它应用到新的照片来编码它们

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

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

【讨论】:

感谢您的回复。因此,如果我有 1000 张图像,并使用 600 张进行训练,其余的用于测试,那么我如何比较两者?我的意思是,在这种情况下,训练将根据gmm 参数进行,而测试将根据fisher vectors,使用分类器,它们将如何比较?这不是将一种特征类型(训练)与另一种特征类型(测试)进行比较吗?抱歉,也许我没有正确理解您的解释,如果可能的话,您能否提供一个示例来说明这将如何工作?非常感谢 @FarazKhan 您不应该与训练集进行比较 - 那将是“作弊”。您可以使用 600 张照片来学习模型,然后将 400 张图像的 Fisher 向量与自己进行比较:找到相似的图像等。例如,您可以从 400 张图像中选择一张图像并搜索最接近的 10 张图像矢量 - 即找到 10 个最相似的图像。 这里写的太多了,所以我更新了我原来的问题,请你看一下。非常感谢 dataToBeEncoded 的大小是多少?我很难理解为什么 encoding 是 1200×1 向量,而你的 numClusters 是 128... datatobeEncoded 的大小与data 相同。就像你建议的那样,我将我的数据库分为两部分,一部分用于培训,另一部分用于测试。它们是rootSIFT 功能。每个图像都由大小为128 x 1 的特征呈现。我有 128 个集群,所以 means 的大小为 128 x 128。但是当我将这些数据提供给vl_fisher 时,我得到了12000 x 1 向量。该向量中的大多数元素都是零,其中一些元素具有实际值

以上是关于了解提取特征的编码的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习与scikit-learn-44]:特征工程-特征提取(编码)-3-权重向量编码以及代码示例

用于转换特征提取函数的 Matlab 编码器

如何在标签编码后提取特征以进行对象到数字的转换

One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid

学习笔记TF025:自编码器

降噪自动编码器(Denoising AutoEncoder)+BERT