我有数百万张图像,每张图像,我已经将它们转换成512个数字来表示该图像中比像素更高的抽象级别。该数据集类似于包含512个字段和一百万行的表,其中填充了浮点数。
当给出新图像时,我希望能够查询100万条记录并按照“相似性”的顺序返回记录。相似性可以定义为512个元素的两个数组之间的最小差异和。
永久存储此数据并执行数值计算以便“图像搜索”快速的最佳方法是什么?
仅供参考:512个元素是图像分类中使用的卷积神经网络的中间输出特征。我正在尝试在给出新图像时返回最相似的图像。
我对此很陌生 - 我希望这个问题有道理。
我可以用许多不同的方式存储数据库...在sql数据库,csv文件中序列化...但我不确定的是什么是以后快速搜索的最佳格式。
我的建议是矢量化,可能在Python的Numpy,MATLAB或Octave等中。基本上,这意味着你可以在两个矩阵之间采用不同的方式:
例如,在Python3中:
import numpy as np
pic1 = np.array([[1,2], [3,4]])
pic2 = np.array([[4,3], [2,1]])
diff = pic1 - pic2
dist = diff * diff
similarity = 1/ sum(sum(dist))
print(similarity)
这很快,因为现在你的操作是O(图片数量)而不是O(n * d ^ 2),其中d是图像边缘的维度