本文概述
- 要求
- 1.克隆SIS项目并安装依赖项
- 2.存储你的图像
- 3.生成每个图像的PKL文件
- 4.使用Web界面进行测试
- 自定义逻辑
- 特别感谢和资源
在本文中, 我们将向你简要说明如何在Ubuntu 18.04中使用Keras和Tensorflow和Python快速实现自己的图像搜索引擎。
要求 你将需要在系统和Pip 3上安装Python 3, 你可以使用以下命令分别在Ubuntu系统上安装它们:
sudo apt-get install python3
和点:
sudo apt-get install python3-pip
【如何在Ubuntu 18.04中使用Keras,Tensorflow和Python 3实现图像搜索引擎】话虽如此, 让我们开始吧!
1.克隆SIS项目并安装依赖项 为了使用上述技术实现你自己的本地图像搜索引擎, 我们将依靠一个开源项目SIS。简单图像搜索引擎是@ matsui528由Scratch编写的图像搜索引擎, 他是日本东京大学工业科学研究所的助理教授。
首先, 在终端中使用以下命令使用Git克隆项目的源代码(如果你没有git, 请使用sudo apt-get install git进行安装):
git clone https://github.com/matsui528/sis.git
该项目最初非常轻巧, 因为它仅包含62行(python)+ 24行(html)。克隆源代码后, 使用以下命令切换到sis目录:
cd sis
并继续使用Pip安装项目的依赖项。你可以通过以下方式从项目提供的列表中安装它们:
pip3 install -r requirements.txt
这将安装5个依赖项:
- 枕头:枕头是Alex Clark和Contributors友好的PIL叉子。 PIL是Fredrik Lundh和贡献者提供的Python Imaging Library。
- h5py:h5py软件包是HDF5二进制数据格式的Pythonic接口。它使你可以存储大量的数值数据, 并轻松地从NumPy中操纵该数据。
- tensorflow:帮助你开发和训练ML模型的核心开源库。直接在浏览器中运行Colab笔记本即可快速入门。
- Keras:Keras是一个高级神经网络API, 用Python编写, 并且能够在TensorFlow, CNTK或Theano之上运行。它的开发着眼于实现快速实验。
- Flask:Flask是基于Werkzeug, Jinja 2和良好意图的Python微框架。它将用于显示搜索引擎的图形结果, 因此, 当你上传文件时, 它将被分析, 并返回与你的搜索匹配的图像。
2.存储你的图像 现在已经下载了项目并安装了所有依赖项, 我们可以继续进行一些手动工作。在项目结构内部, 你将需要存储” 图像数据库” 的图像(与查询图像相比)。
在目录/ sis / static / img内存储所有你希望用作参考的图像, 并且用户可以搜索这些图像。所有图像都必须为JPEG格式:
文章图片
这一步完全取决于你, 你将决定项目将能够提供的信息和图像种类。有了它们后, 我们将能够在下一步中提取信息。
3.生成每个图像的PKL文件 该脚本从图像中提取深层功能。给定一组数据库图像, 使用具有ImageNet预训练权重的VGG16网络为每个图像提取4096D fc6功能。要生成pkl文件, 请使用python在sis的根目录上运行offline.py脚本:
python3 offline.py
由于其深度和完全连接的节点数, VGG16已超过533MB。首次运行脚本后, 将下载该文件。
运行脚本后, 你将找到带有图片信息的新二进制文件。 FeatureExtractor类(Keras模型)提取的信息将使用pickle序列化为/ sis / static / feature目录中的PKL二进制文件:
文章图片
Tensorflow将使用它们来匹配你在后台逻辑上的图像查询。
4.使用Web界面进行测试 现在, 如在依赖项安装过程中提到的那样, 该项目带有一个基于使用Flask构建的Web界面的现成示例。该界面(基本上是一个简单的HTML页面, 具有单个文件输入和一些标题), 可让你将文件上传到同一页面, 并作为结果返回与搜索相关的图像。你可以启动运行server.py脚本的服务器:
python3 server.py
这将在http://0.0.0.0:5000上启动演示, 你可以对其进行测试(只要你的数据库中已经有一些图像):
文章图片
如在示例中所见, 背景中的逻辑对具有不确定性值的图像进行分类, 其值越接近1且值越小, 则匹配度越高。
自定义逻辑 当然, 由于项目是开源的, 因此你可以修改项目的工作方式。你也可以简单地创建一个Python脚本, 该脚本仅打印终端中所需的数据, 与查询匹配的项目的顺序等等。例如, 创建具有以下内容的以下文件custom.py:
# Our Code World custom implementation# Read article at: # https://ourcodeworld.com/articles/read/981/how-to-implement-an-image-search-engine-using-keras-tensorflow-with-python-3-in-ubuntu-18-04import osimport numpy as npfrom PIL import Imagefrom feature_extractor import FeatureExtractorimport globimport pickleimport jsonif __name__=="__main__":fe = FeatureExtractor()features = []img_paths = []# Append every generated PKL file into an array and the image version as wellfor feature_path in glob.glob("static/feature/*"):features.append(pickle.load(open(feature_path, 'rb')))img_paths.append('static/img/' + os.path.splitext(os.path.basename(feature_path))[0] + '.jpg')# Define the query image, in our case it will be a hamburguerimg = Image.open("/home/ourcodeworld/Desktop/hamburguer_query.jpg")# PIL image# Search for matchesquery = fe.extract(img)dists = np.linalg.norm(features - query, axis=1)# Do searchids = np.argsort(dists)[:30] # Top 30 resultsscores = [(dists[id], img_paths[id]) for id in ids]# Store results in a dictionaryresults = []for item in scores:results.append({"filename" : item[1], "uncertainty": str(item[0])})# Create a JSON file with the resultswith open('data.json', 'w') as outputfile:json.dump(results, outputfile, ensure_ascii=False, indent=4)
并运行:
python3 custom.py
这将创建一个JSON文件, 其中包含与查询匹配的图像的有序列表, 在我们的示例中, 我们使用汉堡包进行搜索, 如你所见, 第一个项目是汉堡包的图像:
[{"filename": "static/img/hamburguer_4.jpg", "uncertainty": "0.95612574"}, {"filename": "static/img/hamburguer_2.jpg", "uncertainty": "1.0821809"}, {"filename": "static/img/hamburguer_3.jpg", "uncertainty": "1.099425"}, {"filename": "static/img/hamburguer.jpg", "uncertainty": "1.1565413"}, {"filename": "static/img/hot_dog2.jpg", "uncertainty": "1.1644002"}, {"filename": "static/img/hot_dog_5.jpg", "uncertainty": "1.2176604"}, {"filename": "static/img/portrait-if-a-spitz-pomeranian_t20_v3o29E-5ae9bbdca18d9e0037d95983.jpg", "uncertainty": "1.262754"}, {"filename": "static/img/smiley_dog.jpg", "uncertainty": "1.3276863"}, {"filename": "static/img/golden-retriever-puppy.jpg", "uncertainty": "1.3307321"}, {"filename": "static/img/husky-winter-dogsled_h.jpg", "uncertainty": "1.3511014"}]
此实现非常有用, 因为你还可以过滤不确定性大于1.0的图像。了解此自定义示例将帮助你在自己的项目中实现此逻辑, 并创建例如某种API。
特别感谢和资源 没有以下来源的宝贵信息和资源, 本文将是不可能的:
- VGG16 –用于分类和检测的卷积网络
编码愉快!
推荐阅读
- 如何在Symfony 4中从services.yaml检索特定和所有YAML参数
- 本地与云视频转码
- 如何在Symfony 4表单中实现BotDetect验证码
- LeetCode|LeetCode 热题 HOT 100 第四十九天 152. 乘积最大子数组 中等题 用python3求解
- flask|Python flask2.0与flask_script与出现不兼容问题解决及 KeyError: ‘migrate‘ 错误解决办法,数据库迁移migrate
- 怎样运用苹果恢复大师找到iPhone录制的视频?
- 怎样完全删除苹果恢复大师第二模式中的 iTunes备份?
- 苹果恢复大师怎样注册?苹果恢复大师注册办法
- 苹果恢复大师无法运用怎样办?