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

本文介绍了如何利用Elasticsearch8.x结合OpenAI的CLIP模型,构建一个支持图片和文本搜索的向量搜索引擎,包括KnnSearch的配置、图片向量化过程以及Streamlit实现的Web搜索页面,特别关注了多语言支持的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在当今大数据时代,搜索引擎已经是许多应用的核心组件之一,近年随着大模型以及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匹の子豚

在这里插入图片描述

图片搜索

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

<think>好的,我需要回答用户关于“以”技术实现方法的问题。根据用户提供的引用内容,特别是引用[2],其中提到了使用LLaVA多模态模型ElasticsearchES)来实现功能。现在需要将这些信息整理成结构清晰的回答,同时符合用户给出的格式要求。 首先,我应该明确用户的需求:他们想要了解如何通过本描述来片的技术或工具。根据引用[2],实现原理主要涉及片理解和本匹配两个部分。片理解部分使用LLaVA模型生成片的描述,而本匹配则通过ES进行查询,找到相似的描述对应的片。 接下来,我需要分步骤说明实现方法。根据引用内容,可以分为以下几个步骤:片预处理、本描述生成、建立索索引和查询匹配。每个步骤需要详细说明使用的工具或模型,例如LLaVA用于生成描述,ES用于存储和检索,可能还需要OCR处理字信息。 然后,需要列举相关的技术工具,如多模态模型(LLaVA、CLIP)、索引擎(Elasticsearch、Milvus)以及OCR工具(PaddleOCR、Tesseract)。这些工具的作用需要简要说明,帮助用户了解各自的功能。 此外,应用场景部分需要给出实际例子,比如电商平台、库管理、社交媒体等,这样用户能更好地理解技术的实际用途。 最后,根据用户的要求生成相关问题。这些问题应该围绕技术实现模型选择、优化方法、应用挑战等方面展开,确保覆盖用户可能感兴趣的后续问题。 需要注意的是,所有行内数学表达式和变量必须用$...$格式,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。另外,引用标识要自然地添加到引用段落末尾,如引用[2]中的内容。 现在,我需要确保回答结构清晰,分点说明,并正确引用来源。同时,避免使用Markdown格式,用自然的中表达,保持口语化,不过于正式。还要检查是否符合系统级指令,如使用正确的中标点,技术术语准确等。 可能还需要补充一些细节,比如在片预处理阶段,除了生成描述,可能还需要处理片的元数据或特征向量。但根据引用内容,主要依赖本描述,所以重点在本匹配上。此外,可以提到Rerank模型用于优化索结果,虽然这在以图搜图中更关键,但可能在以中也有应用。 总结下来,回答的结构应该是: 1. 实现原理概述 2. 关键技术步骤(分点说明) 3. 常用技术工具(分模型索引擎、OCR列举) 4. 应用场景举例 5. 相关问题生成 需要确保每个部分都简明扼要,并正确引用来源。同时,用户可能对如何选择模型或处理中本有疑问,生成的问题需要涵盖这些方面。</think>### 以技术实现方法 以的核心是通过本匹配片内容,关键技术分为**片内容理解**和**本语义匹配**两个阶段[^2]。 #### 一、实现原理 1. **片内容理解** 使用多模态模型(如LLaVA)分析片,生成结构化本描述(如标题、物体列表、场景特征等)。例如: ```python # 示例:使用LLaVA模型生成片描述 image_description = llava_model.analyze(image_path) ``` 2. **本语义匹配** 将生成的描述存入索引擎(如Elasticsearch),通过自然语言查询匹配相似内容,返回关联片。 #### 二、关键技术步骤 1. **片预处理** - 使用OCR模型(如PaddleOCR)提取片中的字信息 - 通过多模态模型生成片的标题和详细描述(如“沙滩上的棕榈树”) 2. **建立索索引** - 将片描述本向量化或分词后存入索引擎 - 支持关键词、短语或长本的模糊匹配 3. **查询优化** - 对用户输入的本进行语义扩展(如近义词替换) - 使用ReRank模型索结果排序(如调整“沙滩”与“海水”的权重) #### 三、常用技术工具 | 类型 | 工具示例 | 作用 | |-----------------|--------------------------|-----------------------------| | 多模态模型 | LLaVA、CLIP、BLIP | 生成片描述或本-像特征对齐 | | 索引擎 | Elasticsearch、Milvus | 快速检索相似本 | | OCR工具 | PaddleOCR、Tesseract | 提取片中的字 | #### 四、应用场景 1. 电商平台:索“红色连衣裙+蕾丝边” 2. 库管理:查找“冬季雪山风景照片” 3. 社交媒体:匹配“生日派对气球背景” [^2]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值