微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按相似的二元向量搜索

如何解决按相似的二元向量搜索

我有一组被编码(使用神经网络)的图像(大约 10 万张),它们被编码成一个 512 位的向量。例如:

https://image1.png => [0,1,... 1] // size = 512 bit
https://image2.png => [1,... 0] // size = 512 bit
https://image3.png => [0,... 1] // size = 512 bit

任务是通过用户发送的图像(二进制向量)从一组相似的图像中非常快速地找到。我用汉明距离找到了一个可能的解决方案,但我不确定我的图像集的速度。

我想知道是否有人遇到过这样的问题并且知道在这种情况下使用什么更好?

解决方法

由于您有二进制向量,而且大小相同,相似性确定大大简化。对于两张图片,您只需要:

  • XOR 两个向量:两个相同的位置将导致 0,两个不同的位置将导致 1。
  • 计算结果中的位数,您就会得到不同位置的数量。您可以在 python 或 C++ 中轻松完成此操作(取决于您的 C++ 编码,您可以在整数数组上使用 bitset::count() 或某种 optimized 算法,或者 {{ 3}} built-in 替代您最喜欢的编译器)

这种相似性检查非常有效。您只需要将位数与您定义的相似性阈值进行比较(例如:超过 x 位的差异意味着不够相似)。

示例:

Image 1: [0,1,... 1]
Image 2: [1,... 0]
XOR      [1,... 1]
bitcount ---> 3 differences (or more depending on ...)

注意:如果您希望根据相同的位置而不是不同的位置来定义阈值,请从 512 中减去位数(或者更一般地说,在计算位数之前将结果取反).

,

这取决于图像的上下文。然而,一种相似性度量是由 s(img_i,img_j) = 2 (img_i . img_j) /(|img_i|^2 + |img_j|^2) 定义的 sorensen-dice 系数。您可以在 here 中找到有关它的更多详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。