计算机视觉的应用2-以图搜图功能的实现

大家好,我是微学AI,今天给大家带来计算机视觉的应用2-以图搜图功能实现,以图搜图是一种网络图片搜索引擎技术,其主要功能是通过上传或输入一张图片,快速查找出相似或相同的图片或相关信息。

一、以图搜图的背景

以图搜图技术的背景是当前互联网上图片海量增长,导致要针对一张图片进行查找的时间成本越来越高,我们要找一张相似的图片往往无从下手,于是人们引入了以图搜图的技术,使用以图搜图技术可以方便快捷有效地搜索到所需图片和信息。以图搜图主要有两种方式,一种是上传待搜索的图片,一种是将该图片的URL链接复制粘贴到搜索引擎中,如Google Image、百度识图、TinEye等。

2bb9a135751342d29a527b1f26d52442.png 

二、以图搜图的原理

以图搜图应用广泛,如基于图像的商品搜索、识别盗版内容、协助电商平台提供相关商品推荐、解决图像拼接、医学图像等问题。以下介绍以图搜图的技术原理和应用。

以图搜图的技术原理主要有两种:基于特征的方法和基于深度学习的方法。

基于特征的方法

该方法将图像表示为特征向量,即将图片转换为可比较的数字形式。该方法主要包含以下步骤:

1. 图像预处理:将图片缩放、旋转、裁剪、去噪等处理,使其质量更好。

2. 特征提取:提取图片的特征向量。主要包括局部特征、全局特征和混合特征等。

扫描二维码关注公众号,回复: 14617879 查看本文章

3. 建立索引:将特征向量封装成数据结构,并根据距离度量建立索引。

4. 检索:输入一张图片,得到它与数据库中所有图片的相似度,并根据相似度排序。

2.基于深度学习的方法

该方法使用卷积神经网络从数据中学习并提取特征,并通过余弦距离等距离度量方法计算相似度。主要包括以下步骤:

1. 图像预处理:与基于特征的方法一样,对图片进行预处理。

2. 特征提取:使用卷积神经网络提取图片的特征向量。

3. 检索:输入一张图片,计算其与数据库中所有图片的相似度,并根据相似度排序。

三、以图搜图的应用场景

以图搜图的应用场景非常广泛,主要包括以下几个方面:

1. 电商平台搜索:将用户上传的图片进行搜索,提高商品的搜索体验。

2. 图片版权检测:检测盗版内容,保护原创内容的权益。

3. 医学图像识别:通过比对相似图片,辅助医生进行病情的判断。

4. 智能家居:通过比对图片识别出家庭成员或宠物的动态。

以图搜图极大地促进了图片检索和识别技术的发展,方便人们日常的生活和工作。

四、以图搜图功能的代码实现

import os
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.preprocessing import image
from PIL import Image
import pickle
import gradio as gr

def get_image_embedding(img_path, model):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    features = model.predict(x)
    features = np.squeeze(features)
    features = features / np.linalg.norm(features)
    return features

from keras.applications import MobileNet
model = MobileNet(weights='imagenet', include_top=False, pooling='avg')

def cosine_similarity(a, b):
    dot = np.dot(a, b)
    norma = np.linalg.norm(a)
    normb = np.linalg.norm(b)
    cos_sim = dot / (norma * normb)
    return cos_sim

# 定义图像数据集目录
image_dir = 'images'

def add_image_dir(image_dir):
    # 重新加载嵌入向量
    # with open('embeddings.pkl', 'rb') as f:
    #     embeddings = pickle.load(f)
    embeddings ={}
    for filename in os.listdir(image_dir):
        if filename.endswith('.png') or filename.endswith('.jpg'):
            img_path = os.path.join(image_dir, filename)
            embeddings[filename] = get_image_embedding(img_path, model)
    # 将嵌入向量保存到文件
    with open('embeddings.pkl', 'wb') as f:
        pickle.dump(embeddings, f)

def add_img(img_path):
    # 重新加载嵌入向量
    with open('embeddings.pkl', 'rb') as f:
        embeddings = pickle.load(f)
    filename =img_path.split('/')[-1]
    embeddings[filename] = get_image_embedding(img_path, model)
    # 将嵌入向量保存到文件
    with open('embeddings.pkl', 'wb') as f:
        pickle.dump(embeddings, f)

def search_similar_images(query_path):
    # 重新加载嵌入向量
    with open('embeddings.pkl', 'rb') as f:
        embeddings = pickle.load(f)
    # 计算输入图像的嵌入向量
    query_embedding = get_image_embedding(query_path, model)
    # 计算输入图像向量与每张图像的向量之间的相似度
    similarities = {}
    for filename, embedding in embeddings.items():
        sim = cosine_similarity(query_embedding, embedding)
        similarities[filename] = sim
    # 将相似度最高的前10个图像返回
    top10_similar_images = sorted(similarities.items(), key=lambda x: x[1], reverse=True)[:10]
    result = [filename for filename, sim in top10_similar_images]
    results = [('images/'+x,x) for x in result ]

    return results

# 添加图片的目录文件
add_image_dir(image_dir)
query_path = '1234.png'
similar_images = search_similar_images(query_path)
print(similar_images)


if __name__ == "__main__":
    title ='图片搜索'
    with gr.Blocks() as demo:
        gr.Markdown(title)

        with gr.Row():
            with gr.Column(scale=1):
                img= gr.Image(type="filepath")

                btn = gr.Button("搜索", )
            with gr.Column(scale=100):
                out = gr.Gallery(label="检索结果为:").style(grid=4, height=200)

        btn.click(fn=search_similar_images, inputs= img, outputs=out)

    demo.launch(show_api=False)

运行结果:

46460a3986454f10979fd02eb4fc4b63.png

这里需要我们本地创建‘images‘的文件夹,把图片文件都放入文件夹中,然后程序中会创建图片的嵌入矩阵embeddings.pkl,我们加载embeddings.pkl进行图片搜索的相似度匹配,后面如果我需要添加图片到文件夹中,还需要将新的图片嵌入矩阵加入embeddings.pkl文件中,并进行查找。我们可以利用add_img函数添加图片。

有什么问题,有什么需求可以联系,合作也可以联系。

往期作品:

 深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-SpeakGPT的本地实现部署测试,基于ChatGPT在自己的平台实现SpeakGPT功能

20.深度学习实战20(进阶版)-文件智能搜索系统,可以根据文件内容进行关键词搜索,快速找到文件

21.深度学习实战21(进阶版)-AI实体百科搜索,任何名词都可搜索到的百科全书

 (待更新...)

猜你喜欢

转载自blog.csdn.net/weixin_42878111/article/details/129501316