个性化阅读
专注于IT技术分析

如何在Ubuntu 18.04中使用Keras,Tensorflow和Python 3实现图像搜索引擎

本文概述

图片搜索引擎会分析图片并提出一些基本问题, 例如图片上是否有一张脸或多于一张?图像上出现哪种颜色?频率如何?分辨率是多少?然后, 搜索者可以根据此信息缩小搜索范围。当然, 这是一个非常大的主题, 我们不会深入解释, 但是我们将向你介绍如何使用一些工具来实现自己的图像搜索引擎, 这些工具已经准备就绪, 可以根据需要完全正常工作, 如果没有, , 你当然可以对其进行修改, 使其与你自己的需求相匹配。

在本文中, 我们将向你简要说明如何在Ubuntu 18.04中使用Keras和Tensorflow和Python快速实现自己的图像搜索引擎。

要求

你将需要在系统和Pip 3上安装Python 3, 你可以使用以下命令分别在Ubuntu系统上安装它们:

sudo apt-get install python3

和点:

sudo apt-get install python3-pip

话虽如此, 让我们开始吧!

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微框架。它将用于显示搜索引擎的图形结果, 因此, 当你上传文件时, 它将被分析, 并返回与你的搜索匹配的图像。

有关此项目的更多信息, 请访问Github上的官方资源库。

2.存储你的图像

现在已经下载了项目并安装了所有依赖项, 我们可以继续进行一些手动工作。在项目结构内部, 你将需要存储”图像数据库”的图像(与查询图像相比)。

在目录/ sis / static / img内存储所有你希望用作参考的图像, 并且用户可以搜索这些图像。所有图像都必须为JPEG格式:

图片存储静态Keras Tensorflow图像搜索引擎

这一步完全取决于你, 你将决定项目将能够提供的信息和图像种类。有了它们后, 我们将能够在下一步中提取信息。

3.生成每个图像的PKL文件

该脚本从图像中提取深层功能。给定一组数据库图像, 使用具有ImageNet预训练权重的VGG16网络为每个图像提取4096D fc6功能。要生成pkl文件, 请使用python在sis的根目录上运行offline.py脚本:

python3 offline.py

由于其深度和完全连接的节点数, VGG16已超过533MB。首次运行脚本后, 将下载该文件。

运行脚本后, 你将找到带有图片信息的新二进制文件。 FeatureExtractor类(Keras模型)提取的信息将使用pickle序列化为/ sis / static / feature目录中的PKL二进制文件:

PKL文件Keras Tensorflow

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-04
import os
import numpy as np
from PIL import Image
from feature_extractor import FeatureExtractor
import glob
import pickle
import json

if __name__=="__main__":
    fe = FeatureExtractor()
    features = []
    img_paths = []

    # Append every generated PKL file into an array and the image version as well
    for 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 hamburguer
    img = Image.open("/home/ourcodeworld/Desktop/hamburguer_query.jpg")  # PIL image

    # Search for matches
    query = fe.extract(img)
    dists = np.linalg.norm(features - query, axis=1)  # Do search
    ids = np.argsort(dists)[:30] # Top 30 results
    scores = [(dists[id], img_paths[id]) for id in ids]

    # Store results in a dictionary
    results = []

    for item in scores:
        results.append({
            "filename" : item[1], "uncertainty": str(item[0])
        })

    # Create a JSON file with the results
    with 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 –用于分类和检测的卷积网络

你也可以阅读它们, 以补充本文中所有已学到的知识。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Ubuntu 18.04中使用Keras,Tensorflow和Python 3实现图像搜索引擎

评论 抢沙发

评论前必须登录!