【问题标题】:Search by similar binary vectors按相似的二元向量搜索
【发布时间】:2021-04-28 13:57:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你确定相似的位向量映射到相似的图像吗?例如,如果位向量是由加密散列函数(例如)产生的,那么这将是不正确的。
  • 是的,我为此使用了神经网络
  • @QuickDzen 你能澄清一下什么样的神经网络(多层感知器、卷积神经网络等)吗?这些位是否与 NN 学习到的特征相对应(即是否有人知道每个位对应的内容)?

标签: python c++ algorithm machine-learning image-recognition


【解决方案1】:

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

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

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

示例:

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

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

【讨论】:

  • 这是一个非常好的解决方案!但是我有一组图像(大约 10 万张),并且对每条记录使用 XOR 会非常慢。也许您应该以某种方式对这些数据进行排序,然后对其中一些应用 XOR?
  • @QuickDzen 问题是排序对于精确匹配很有效。如果允许更改任何位,则排序将毫无用处。最佳策略将取决于相似性要求。如果相似度非常接近,您可以生成潜在的候选者并在 b-tree 中搜索所有候选者。如果不允许更改某些位,您可以对这些位进行排序并比较有限的集合。另一个想法可能是将 512 位压缩成一组 128 位或更少,并将压缩形式与更强的相似性要求进行比较以限制完整搜索
【解决方案2】:

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

【讨论】:

  • 这是一个不错的解决方案!但是我有一组图像(大约 10 万张),并且对每条记录使用 XOR 会非常慢。也许你应该以某种方式对这些数据进行排序,然后对其中的一些应用 sorensen-dice 系数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多