功能袋如何工作?

时间:2016-06-07 11:00:42

标签: c++ algorithm computer-vision k-means

我不确定这是否是这个问题的正确论坛,我很抱歉。

我对Bag of Features模型很陌生,我试图通过向量来表示图像(对于CBIR项目)。

根据我的理解,给定S nk图像,并假设我们想要通过尺寸为i的矢量来表示图像,这些是实施BoF的步骤:

  1. 对于每个图像i-D,计算一组关键点,并从中计算描述符D的集合。
  2. 将所有图像中的描述符集合在一起,所以现在我们有k
  3. k上运行D方法(上面定义k)算法,现在我们有iv个群集,每个描述符向量完全属于一个群集。
  4. k定义为相对于图片i生成的BoF向量(大小为i)。每个维度都初始化为0.
  5. 对于每个图片d,以及属于i-D的每个描述符d,找出所有k群集之间属于哪个群集d。假设j属于第vi[j]++个群集,则为q
  6. 我不清楚如何实现第5点,那么我们如何理解描述符所属的聚类,,特别是如果我们试图计算BoF向量的图像是查询图像(因此不属于初始数据集)?我们是否应该找到最近邻居(1-NN)以了解查询描述符属于哪个群集?

    为什么我需要这个 - 应用程序:

    我实施BoF模型以实现CBIR:给定查询图像i,在图像数据集中找到q的最相似图像INSPECT REPLACING 。为此,我们需要解决1近似最近邻问题,例如使用LSH。问题是LSH中每个图像的输入都表示为一个向量,所以我们需要BoF才能做到这一点!我希望现在为什么我需要它更清楚:)

    如果我在上述程序中犯了一些错误,请告诉我。

1 个答案:

答案 0 :(得分:1)

您的算法正在为图像生成等效的单词。这些“单词”并不意味着是最终的结果,而只是使其易于与其他机器学习技术一起使用的东西。

在此设置中,您将从初始要素(第1点的关键点)生成一组k个簇。 然后用每个簇中关键点的数量来描述每个图像(就像你有一个由长度为k的字典中的单词组成的文本)。

第3点表示你从训练集图像中获取所有关键点,并运行k-means algorithm,以找出点之间的一些合理分离。这基本上确定了单词的含义。

因此,对于新图像,您需要像训练集一样计算关键点,然后使用已经在训练中计算过的聚类,找出新图像的特征向量。也就是说,您将图像转换为您构建的字典中的单词。

这是从图像生成合理特征向量的所有方法(如果需要,可以是部分结果)。这不是一个完整的机器学习算法。要完成它,您需要知道自己想要做什么。如果您只是想找到最相似的图像,那么最近邻搜索应该这样做。如果要标记图像,则需要从特征向量中训练分类器(如naive-bayes),并使用它来计算查询的标签。