【发布时间】: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(所以MP是M的子集>) 并计算比率 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