【问题标题】:How to learn a treshold value for image representations?如何学习图像表示的阈值?
【发布时间】:2017-08-30 19:14:51
【问题描述】:

我实现了一个基于内容的图像检索系统,它将图像编码为VLAD codes。简而言之,一幅图像是一个数千维的向量,两幅图像之间的相似度用两个对应的 VLAD 向量之间的 L2 距离来衡量。在实践中,我们返回查询代码与所有数据集代码之间的前 k 个最小距离作为结果。

现在,我正在 Oxford Building Dataset 上测试这个系统,这是一个用于测试您的 CBIR 系统的流行数据集:有 55 个查询图像,我们计算平均精度来评估您的方法。

给定一个查询图像,真阳性的集合被定义为“好”和“好”图像之间的联合。这些集合是由数据集作者手动创建的,有关更多信息,请阅读原始论文(参考上面的链接)。

因此,假设完美的 VLAD 代码,topk[0] 是数据集图像之间最相似的图像,并且它具有最小的 L2 距离 w.r.t。查询代码。 请注意,这将用于对象识别应用程序,因此给定查询图像,我们希望返回最相似的图像(而不是 top-k 值),因此计算此阈值时应考虑仅前 1 个距离。

我想做的是学习一个treshold值s.t。如果topk[0]<treshold 我们可以放心地假设这是一张相关图片。

机器学习并不是我真正的领域,但我想到的是学习这个价值:我们计算 topk[0] 的平均值,其中 topk[0] 图像是真正的正数,而我们没有考虑误报(它们会污染这个阈值)。我意识到这是一个非常幼稚的解决方案,但我没有想到更好的解决方案。

对于我的实现,我注意到top[0] 通常在1.0*1.3* 之间以获得良好的匹配,而通常非常“遥远”的图像具有>1.5*

【问题讨论】:

  • 为什么需要机器学习来确定阈值?您不能只保存测试图像的结果(例如:expectedValue = "equal/unequal", threshold)然后编写一个循环,遍历所有图像以获得不同的阈值并检查每个阈值有多少是正确的?然后采取最好的。
  • @FlorianH 感谢您的评论。您能否更好地解释一下 expectedValue=equal/unequal 是什么意思?
  • 对于两张图片的每次比较,您都保存了两件事。首先:您所期望的(无论它们是否相关或不相关)。所以你用手给它们贴上标签。第二:您为比较而获得的 topk[0] 。然后你可以做一个循环,比如说(双阈值 = 0.01;阈值
  • @FlorianH 所以你的建议是:(1)对于每个查询 q_i 计算距离 d_i(q_i,img_i),其中 img_i 是数据集中最近的图像,因此我们将获得距离集合 d_1(q_1, img_1), ... d_n(q_n,img_n) (2)阈值t,如果 * d(q_i,img_i) img_i加入匹配图像集合,得到匹配图像集合M i> (3) 查看M中有多少图像是真阳性MP(所以MPM的子集>) 并计算比率 ratio=MP/M (4) 重复 (2)-(3) 改变 t 以最大化 ratio .我是否正确总结了您的方法?
  • 是的,总结一下。您还可以查看以下链接 en.wikipedia.org/wiki/Precision_and_recall 以找到适合您目的的评估指标。 Devide (mp/p) 似乎没有多大意义。如果您只是愚蠢地将所有查询分类为正面,则您会达到最大值(对于 mp/p),这肯定不是您想要的。换句话说,您必须以某种方式至少查看您的误报。

标签: machine-learning computer-vision classification information-retrieval


【解决方案1】:

一般来说,我建议研究一些其他方法来量化具有重要属性的图像的相似性,例如尺度不变检测、对光照变化的鲁棒性等。如果您只想要 L2 范数的阈值,有几种方法可以实现。什么价值是“最好的”很大程度上取决于你想要什么。如果你重视最小化误报,那应该是你的成本函数,如果你重视避免误报而不是你应该为此优化......你也可以尝试同时优化两者,在你的成本函数。我能想到的一种方法是:

  1. 只取一半的数据集
  2. 选择一个阈值(在您认为合理的范围的中间)
  3. 使用此阈值对您的数据进行分类并计算误报、误报、真阳性和真阴性并评估您的质量
  4. 考虑以下情况:
    • 如果结果令人满意,就暂时坚持下去
    • 如果误报过多,则将阈值设置得更严格(将更严格一侧的未探索区间减半)
    • 如果漏报过多,请降低阈值(将不太严格的未探索区间减半)
  5. 重复直到您满意/达到最佳平衡。
  6. 预测您未采取的一半以找到您的阈值并验证您的结果。

只有一个可以考虑的选项,但也许您会觉得它很有帮助。

【讨论】:

  • 感谢您的回答,非常感谢。我们将使用它进行对象识别(给定查询图像,返回代表同一主题的最相似的图像),因此我们希望最大限度地减少误报,没有误报。在这种情况下,您建议如何进行?
  • 另一个问题:您只考虑一半的数据集,因为另一半将用于评估所选阈值是否好,对吧?
  • @justHelloWorld 是的。如果您对评估感到满意,您可以对整个数据集重复此操作。我建议的方法是对“正确”值进行简单的二分搜索。第 4 步中重要的是估计您的阈值是太高还是太低。不考虑误报的问题在于,永远不会出现任何误报的方法是永远不要将任何图像检测为阳性......所以你可以使用“至少检测到 2 个,最多 x 个误报”之类的东西
  • 如果你真的想进入物体识别领域,我建议你阅读诸如 vision.caltech.edu/CNS179/papers/Lades93.pdf 之类的东西,当然还有该领域最新的东西(主要是分层分类器神经网络......一些这样的算法在 scipy 中有实现)
  • @justHelloWorld 对我来说听起来不错...在我看来 TP/FP 是一个很好的优化成本函数,并且 ROC 曲线分析接缝对我来说是合理的...(但我当然不能保证它会起作用)。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2014-04-12
  • 2020-12-19
  • 1970-01-01
  • 2018-09-21
  • 2019-06-22
  • 2019-10-10
相关资源
最近更新 更多