【问题标题】:SIFT descriptors values: OpenCV vs VLFeatSIFT 描述符值:OpenCV 与 VLFeat
【发布时间】:2017-04-23 15:51:41
【问题描述】:

我正在尝试比较 OpenCVVLFeat 的 SIFT 实现。

我注意到 VLFeat 的描述符值是整数,例如:

0 0 0 0 0 0 0 0 0 0 0 17 45 20 26 0 1 ...

对于 OpenCV:

0.0391555 0 0 0.0998274 0.235747 0 0 0.0276871 0.156622 ...

请注意,这些是 2 个不同图像的描述符。

我有两个问题:

  1. 为什么它们有两个不同的值?
  2. 如果我需要使用 VLFeat(然后是 VLAD 编码)的 k-means 的 OpenCV 表示,是否需要更改这些值?

【问题讨论】:

    标签: opencv computer-vision sift vlfeat


    【解决方案1】:

    免责声明,我不是 OpenCV 或 VLFeat 方面的专家,但我认为我知道答案。

    VLFeat 可以生成整数和浮点描述符。要生成整数描述符,请使用 vl_sift 函数,要生成浮点描述符,请使用带有 FloatDescriptors 参数的 vl_dsift 函数。

    出于性能原因,VLFeat 可能使用整数描述符。使用整数的计算通常比使用浮点数更快。但是,它可能以牺牲精度为代价。尽管如此,在计算机视觉的情况下,较小的精度可能并不那么重要。在integer k-means algorithm 的描述中,您甚至可以阅读“虽然这对某些应用程序有限制,但它适用于聚类图像描述符,通常不需要非常高的精度”。

    关于k-means算法。整数描述符有一个版本 (vl_ikmeans),浮点描述符有一个版本 (vl_kmeans)]。对于 OpenCV,只需使用后者。

    【讨论】:

    • vl_siftvl_dsift完全不同的算法w.r.t。生成关键点的过程,它们不能基于描述符值(int或float)进行比较。
    • 根据 VLFeat documentation:“默认情况下,VL_DSIFT() 计算的特征等同于 VL_SIFT()”。还有一个示例描述为“此示例使用 VL_DSIFT() 和 VL_SIFT() 生成等效的 SIFT 描述符:”
    • 我的错,我不知道默认行为是一样的(我删除了 -1 ;))。但是,DSIFT 表示“密集 SIFT”,并且关键点是从标准网格生成的。也许你可以获得相同的行为,但两种算法的目的不同。
    • 例如DSIFT广泛用于分类,而SIFT更适合物体识别。但这是过时了。
    • 无论如何,在我看来,VLFeat 出于性能原因使用整数。但是,您应该能够将 vl_kmeans 与浮点数一起使用,并与 OpenCV 描述符一起使用。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2015-02-01
    • 2017-01-08
    • 2014-05-15
    • 2016-12-24
    • 2015-05-11
    相关资源
    最近更新 更多