Elasticsearch8.x结合OpenAI CLIP模型实现图搜图及文搜图功能

news2025/1/13 0:18:38

前言

在当今大数据时代,搜索引擎已经是许多应用的核心组件之一,近年随着大模型以及AI技术(如:自然语言处理NLP)的流行,这些技术的结合将会创造出更多的应用场景,比如:电商商品搜索、图像识别、非结构化数据向量化等

本博客将介绍如何使用 Elasticsearch8.x 结合 OpenAI 提供的强大 CLIP 模型构建一个生产环境可用的向量搜索引擎,它不仅能够通过关键字匹配搜索,还可以通过向量相似度搜索,从而实现更智能和灵活的搜索体验,先上效果图

在这里插入图片描述

环境准备

Elasticsearch 8 及 Knn Search 介绍

在老版本Elasticsearch 7.x 中,KNN(K-Nearest Neighbors)插件默认并不是包含在其核心功能中的,需要手动安装 KNN 插件,而 Elasticsearch 8.0+ 则默认集成了 Knn Search 功能

接下来我们将了解如何配置和使用 Knn Search,以及它如何与 CLIP 模型集成

Elasticsearch8.x安装教程
Knn相似度查询官方文档

OpenAI CLIP 模型介绍

CLIP模型是 OpenAI 公司在 2021 年初发布的用于匹配图像和文本的预训练神经网络模型,CLIP模型的训练数据收集了约4亿张图片和文本信息进行自监督学习,使它拥有强大的特征抽取能力,在多模态研究领域堪称经典之作

本案例将重点演示两个子模型

clip-vit-base-patch32

clip-vit-base-patch32 是一个在视觉和语言任务中表现出色的模型,它使用 Vision Transformer (ViT) 架构,并经过大量的互联网数据训练,可以将图像和文本映射为统一的向量空间,这使得我们可以使用相同的向量空间进行图像和文本的搜索,为跨模态搜索提供了强大的支持

clip-ViT-B-32-multilingual-v1

clip-ViT-B-32-multilingual-v1 是一个支持多语言的 CLIP 模型。它继承了 clip-vit-base-patch32 的优秀特性,同时具备对多语言文本图像的强大处理能力,对于多语言搜索应用程序,这个模型是一个理想的选择

图片向量化

图片向量化采用clip-vit-base-patch32模型对图片进行矢量计算,使用Dataset进行图片加载,迭代图片返回图片编号、图片路径、图片文件

from torch.utils.data import DataLoader, Dataset
# 定义图片目录
IMG_PATH = Path(__file__).resolve().parents[1] / "images"
# DataSet类型
class ImageDataset(Dataset):
    def __init__(self):
        self.image_files = list(IMG_PATH.glob("*.png"))

    def __len__(self):
        return len(self.image_files)
        
	#迭代返回图片编号、路径、图片
    def __getitem__(self, idx):
        image_file = self.image_files[idx]
        image_id = image_file.name.split(".")[0]
        image = utils.pil_loader(image_file)
        image_url = image_file.name
        return image_id, image_url, image

本地图片矢量计算

def get_image_features(image):
	model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
	processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
	inputs = processor(images=images, return_tensors="pt")
    image_features = self.model.get_image_features(**inputs)
    image_features /= image_features.norm(dim=-1, keepdim=True)
    image_features = image_features.tolist()
    return image_features

创建ES索引,这里向量索引定义为 index_image_search"dims":512 表示字段的向量维度为512,"similarity":"l2_norm" 表示使用 L2 范数作为相似度计算的方法,L2 范数也被称为欧氏距离

"mappings": {
     "properties": {
         "feature_vector": {
             "type": "dense_vector",
             "dims": 512,
             "similarity": "l2_norm"
         },
         "image_path": {
             "type": "keyword",
         }
     }
 }

组装ES文档和向量数据,批量插入到 ES

from elasticsearch.helpers import bulk
#循环迭代图片集合
def define_data():
	dataloader = DataLoader(ImageDataset(), batch_size=64)
	for batch in tqdm(dataloader):
        image_ids, image_urls, images = batch
        image_features = get_image_features(images)
        batch_size = len(image_ids)
        for i in range(batch_size):
            yield {
                "_index": "index_image_search",
                "_id": image_ids[i],
                "image_path": image_urls[i],
                "feature_vector": image_features[i],
            }
# 批量插入
def bulk_ingest(self, chunk_size=128):
	return bulk(self.client, generate_data(), chunk_size=chunk_size, ignore_status=500)

至此以上步骤完成了对素材图片的向量化存储,接下来我们将启动一个python web页面来演示图片搜索功能

Streamlit 构建 Web 搜索页面

为了展示构建的搜索引擎,我们将使用 Streamlit 框架构建一个简单而强大的 Web 搜索页面,Streamlit 的简洁性和实时性使得构建交互式搜索界面变得非常容易

案例中页面表单元素组件主要包括:

  • 搜索类型(文搜图/图搜图)
  • 向量模型
  • 搜索数量
  • 搜索文本或图片地址
    在这里插入图片描述

总结

使用过程中我们发现clip-vit-base-patch32模型对部分中文的支持效果不是很好,所以我们引入了clip-ViT-B-32-multilingual-v1模型,实践下来它对中文的识别效果还是不错的,毕竟其具备支持多语言文本的解析能力。当然,如果场景中只用到英文来搜索,那么clip-vit-base-patch32模型足够了

其它语言模型可在官网搜索下载:Hugging Face

案例展示

下面给出几组搜索对比结果图:

Model:ViT-B-32-Multi/ViT-B-32
搜索词:不见啄木鸟,但闻啄木声

在这里插入图片描述

在这里插入图片描述

Model:ViT-B-32-Multi/ViT-B-32
搜索词:two cute little pigs

在这里插入图片描述
在这里插入图片描述

Model:ViT-B-32-Multi/ViT-B-32
搜索词:かわいい2匹の子豚

在这里插入图片描述

图片搜索

在这里插入图片描述
欢迎大家讨论学习(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1340990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实习知识整理12:点击购物车渲染出购物车中的商品并实现在购物车界面对商品价格和数量的相关操作

1. 点击购物车渲染出购物车商品界面 通过userId从购物车表中查找商品的相关信息 前端:需要向后端传递userId 后端: CartMapper.java CartMapper.xml CartService.java 接口 CartServiceImpl.java 实现类 CartController.java cartIndex.html页面 …

第二十一章Java网络通信

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下: 计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议&#x…

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

电子学会C/C++编程等级考试2023年03月(七级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:走出迷宫 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。 时间限制:1000 内存限制…

docker学习笔记03-持久化存储

1.docker架构 2.docker持续化存储-数据卷 //以后台方式运行容器 (推荐) docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name容器名称 镜像ID/镜像名称[:版本号]执行下面命令 docker run -p 1122:3306 --name mysql99…

脆皮大学生“拯救”方案——智慧高校智能视频监控系统的建设

随着“脆皮大学生”的网络热梗爆火,大学生日常监管问题也浮出水面。虽然高校大学生作为成年人,可以对自己的日常行为进行自我约束,但由于大学生涉世未深,缺乏独立生活经验,社会关系简单,在校期间&#xff0…

嵌入式Linux:提升VMware虚拟机运行速度的方法

使用虚拟机运行Linux操作系统通常会比在物理机上直接安装系统的运行效率更低,本篇博文将介绍如何优化虚拟机的设置,进而提升虚拟机性能体验。 第1步:选择VMware菜单:编辑–>首选项–>更新,将”启动时检查产品更新…

为什么IDEA建议去掉StringBuilder,而要使用“+”拼接字符串

在字符串拼接时应该都见过下面这种提示: 大家普遍认知中,字符串拼接要用StringBuilder,那为什么idea会建议你是用呢,那到底StringBuilder和有什么具体区别呢,我们一起来探究一下。 普通拼接 普通的几个字符串拼接成一…

积极拥抱信创,思迈特软件与麒麟软件NeoCertify完成认证

近日,思迈特软件与麒麟软件有限公司进行了联合测试,并顺利完成产品兼容性测试。经评测,思迈特软件一站式大数据分析平台(Smartbi Insight V11)与银河麒麟高级服务器操作系统(飞腾版)V10、&#…

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后 、37. 解数独

332.重新安排行程 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 C代码&#xff1a; class Solution { public: unordered_map<string, map<string, int>> targets;bool backtrack…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

一款降压型开关模式转换器解决方案

一、基本概述 TX4145 是一款降压型开关模式转换器。TX4145 在 6-60V 宽输入电源范围内实现不同峰值输出电流&#xff0c;并且具有出色的线电压和负载调整率。 TX4145 采用 PWM 电流模工作模式&#xff0c;环路易于稳定并提供快速的瞬态响应。 TX4145 外部提供 FS 脚&#xf…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

java设计模式学习之【中介者模式】

文章目录 引言中介者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用聊天室示例代码地址 引言 想象一下一座忙碌的机场&#xff0c;各种飞机需要起飞、降落&#xff0c;而不同的飞行活动之间必须互不干扰。如果没有一个统一的控制系统&#xff0c;这将是一…

Vue ThreeJs实现银河系行星运动

预览 可通过右上角调整参数&#xff0c;进行光影练习 代码 <template><div id"body"></div> </template> <script>import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import …

FontsTest.java

package fonts;import java.awt.Font; import java.awt.GraphicsEnvironment;/*** Font测试* * 不同字体在不同操作系统是不一样的&#xff0c;更新* * linux&#xff1a; https://blog.csdn.net/spencer_tseng/article/details/135232675windows&#xff1a; https://blog.cs…

48道Linux面试题

本博客将汇总 Linux 面试中常见的题目&#xff0c;并提供详细的解答。 文章目录 1、绝对路径用什么[符号表](https://so.csdn.net/so/search?q符号表&spm1001.2101.3001.7020)示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命…

活动回顾 (下) | 机器学习系统趋势研判,大咖金句汇总

作者&#xff1a;三羊、李宝珠、李玮栋、Yudi、xixi 编辑&#xff1a;李宝珠 在大模型时代的浪潮中&#xff0c;机器学习系统正经历着前所未有的变革。模型规模的急剧膨胀&#xff0c;让我们见证了 AI 能力的巨大提升&#xff0c;然而这种提升不仅为各个领域带来了新的机遇&…

Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

六、Redis 分布式系统

六、Redis 分布式系统 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3.6 集群收缩 6.4 分布式系统的限制…