如何构建可扩展的图像搜索引擎

时间:2020-05-28 17:20:55

标签: python machine-learning web architecture scalability

我一直在构建一个图像搜索引擎,该引擎使用机器学习来查找相似的图像。

我的方法是,我使用了预先训练的CNN模型,当用户输入图像时,它会通过CNN传递,并且图像嵌入是从最后一个隐藏层获取的。通过存储图像的嵌入来计算余弦相似度,并返回大多数相似图像。

问题:我想从中制作一个可扩展 API ,并且可以供数百个用户使用< / strong>,同时具有最短响应时间。另外,数据库中可能存在大量图片,那么存储它们的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可能会在这里找到2种选择。

  1. 您可以将每个嵌入或编码的矢量图像存储为 例如,图像本身为二进制格式。

专业人士


与运行时编码相比,时间效率要高得多,因为您只需对用户图像进行编码并与存在编码值进行比较即可。

缺点


内存(数据库大小),但是您可以改善这一点,通过构建网络具有强编码效果的方法,可以显着减少输出矢量长度,我猜想对编码器结果设置一些限制将有助于实现此结果。


  1. 具有压缩图像的体系结构。只是 编码器解码器架构。

    您定位两层 第一层 稍微成像一下(不丢失信息),最后一层 具有很强的编码权重。

    存储两个图层,输出图像的编码值和 已编码的值,该值将用于测量 相似性

    您将编码图像传递给解码器,该图像可能是 转置的卷积层简称为 deconvolution 渲染图像。

专业人士


时间的效率仍然很高,但低于 first 方法,因为如果需要显示图像,则需要对其进行解码。

缺点


内存消耗(数据库大小),但远少于第一方法


通过摆脱最后一层的编码值,您可以改善整体内存时间。并只需存储中间层编码值(半编码图像)并存储它,通过这种方式,存储图像所需的内存会大大减少,通过压缩尺寸,并且时间仍然相同,但单独的请求(对于每个图像,继续编码解码以呈现图像)。


更新

对于使用 Keras 的最简单方法建立模型,它是高级 API ,运行在 TensorFlow 之上,或者您可以使用 PyTorch

我通常使用的 Tensorflow 对于效率和处理所有过程(例如预处理)都非常有用,为您的图像使用有效的格式,训练预测,它具有很好的功能来处理您的输入管道


训练完模型后,您需要尽可能高效地搜索,如果您使用算法将编码后的矢量进行聚类这样的 KMeans ,那么您只需要比较 N个群集,而不是整个数据集,则可以使用 KMeans Tensorflow Sklearn 。无论如何,我建议您对每种情况有一些逻辑,以便在整个数据集上进行搜索,并在 N个群集交替之间进行搜索。

高效搜索的另一种方法是使用数据结构,例如 kd树,但是您需要添加一些逻辑来处理案例, KMeans 可能是您更好的选择,因为 kd树可能需要一些额外的努力。


然后,您可以使用 Django 框架甚至 Flask 将实现和逻辑打包到基于Web的应用程序中。

相关问题