如何构建可扩展的图像搜索引擎 [关闭]
Posted
技术标签:
【中文标题】如何构建可扩展的图像搜索引擎 [关闭]【英文标题】:How to build a scalable image search engine [closed] 【发布时间】:2020-09-16 02:59:27 【问题描述】:我一直致力于构建一个使用机器学习来查找相似图像的图像搜索引擎。
我的方法是,我使用了预训练的 CNN 模型,当用户输入图像时,它会通过该 CNN,并且图像嵌入来自最后一个隐藏层。余弦相似度是通过嵌入存储的图像来计算的,并返回最相似的图像。
问题:我想用它制作一个可扩展并可供数百名用户使用的API /strong> 同时,响应时间最短。此外,数据库中可能有大量图像,那么存储它们的最佳方式是什么?
【问题讨论】:
【参考方案1】:您可能会遵循以下 2 个替代方案。
-
您可以将每个图像嵌入或编码矢量存储为 pair
例如,图像本身为二进制格式。
优点
比运行时编码的时间效率要高得多,因为您只需对用户图像进行编码并与存在编码值进行比较。
缺点
内存消耗(数据库大小),但您可以改进这一点,通过构建具有强编码结果的网络,您可以显着减少输出向量长度,我想对编码器结果设置一些限制有助于实现这个结果。
具有压缩图像的架构。简单地 编码器和解码器架构。
你的目标是两层 第一层编码 图像一点(不丢失信息),最后一层 具有很强的编码权重。
存储两层输出图像的编码值和 编码值,您将用于测量 相似度。
您将编码图像传递给解码器,这可能是 转置卷积层简称为反卷积 渲染你的图像。
优点
时间效率仍然很高,但不如first方法,因为如果需要显示,则需要解码图像。
缺点
内存消耗(数据库大小),但远小于第一种方法
您可以通过去掉最后一层编码值来提高整体内存和时间。并且只存储中间层编码值(半编码图像)并存储它,这样存储图像所需的内存显着减少,通过压缩其尺寸,时间仍然相同,但单独的请求(继续编码每个图像,解码用于渲染图像)。
更新
构建模型是使用 Keras 最简单的方法,它是在 TensorFlow 之上运行的高级 API 或你可以使用 PyTorch。
正如我通常使用的那样,Tensorflow 非常适合提高效率和处理所有过程,例如 预处理、为图像使用高效格式、训练 strong> 和 predicting,它具有非常好的功能来处理您的输入 pipeline。
在您的模型经过训练后,您需要尽可能高效地搜索,如果您使用算法聚类您的编码向量这样的KMeans,那么你只需要比较N个集群而不是整个数据集,你可以使用KMeans Tensorflow 或 Sklearn。无论如何,我建议您为每个案例在整个数据集上搜索并在 N 个集群 上搜索并在它们之间交替 进行一些逻辑。
高效搜索的另一种方法是使用数据结构如kd树,但您需要添加一些逻辑来处理您的情况, KMeans 可能是您更好的选择,因为 kd 树 可能需要一些额外的努力。
然后您可以使用 Django 框架甚至 Flask 将您的实现和逻辑打包到基于 Web 的应用程序中。
【讨论】:
感谢您的详细回答,但我的问题更多是在软件方面,想了解我应该使用哪些系统设计和框架来快速存储和搜索以获得最短的响应时间。 不客气,我已经更新了我的答案。以上是关于如何构建可扩展的图像搜索引擎 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用图像的 tesseract 输出从另一个图像创建可搜索的 pdf