使用LLaVA模型实现以文搜图和以图搜图

本文将会详细介绍如何使用多模态模型——LLaVA模型来实现以文搜图和以图搜图的功能。本文仅为示例Demo,并不能代表实际的以文搜图和以图搜图的技术实现方案。

1、实现原理

  • 使用多模态模型获取图片的标题和详细描述
  • 以文搜图功能:使用ES实现查询匹配,找到相似的图片描述,从而获得对应图片。
  • 以图搜图功能:对于查询图片,根据其图片描述,在ES查询得到详细的图片描述;再对这些查询得到的图片描述使用Rerank模型进行匹配,调整顺序,从而获得对应图片

2、使用模型

  • 多模态模型:LLaVA-1.5-7B,主要用于图片理解,本文的使用场景为获取图片标题和图片内容描述。
  • OCR模型:PaddleOCR,主要用于图片中的文字识别。
  • ReRank模型:ReRank模型,主要用于文本匹配,本文的使用场景为匹配两张图片的内容描述。

2.1、下面将按功能进行阐述,主要分为以下三部分:

  • 图片上传
  • 以文搜图
  • 以图搜图

3、前期准备

3.1、基于LLaVa大模型的图片理解

参考:https://blog.csdn.net/zhanghan11366/article/details/136763065?spm=1001.2014.3001.5501

3.2、基于PaddleOCR文字识别

模型介绍及部署方法: https://www.paddlepaddle.org.cn/hubdetail?name=ch_pp-ocrv3&en_category=TextRecognition

3.2.1、安装

1、环境依赖

paddlepaddle >= 2.2
paddlehub >= 2.2

2、安装

 hub install ch_pp-ocrv3

3.2.2、服务部署

PaddleHub Serving 可以部署一个目标检测的在线服务。

第一步:启动PaddleHub Serving

运行启动命令: hub serving start -m ch_pp-ocrv3
这样就完成了一个目标检测的服务化API的部署,默认端口号为8866。
NOTE:如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。

第二步:发送预测请求

配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果。

import requests
import json
import cv2
import base64

def cv2_to_base64(image):
    data = cv2.imencode('.jpg', image)[1]
    return base64.b64encode(data.tostring()).decode('utf8')

# 发送HTTP请求
data = {'images': [cv2_to_base64(cv2.imread(r"C:\Users\zh\Desktop\1.jpg"))]}
headers = {"Content-type": "application/json"}
url = "http://0.0.0.0:8866/predict/ch_pp-ocrv3"
r = requests.post(url=url, headers=headers, data=json.dumps(data))

# 打印预测结果
print(r.json()["results"])

结果如下:

[{'data': [{'confidence': 0.9090811014175415, 'text': '2023年A1大模型应用研究报告', 'text_box_position': [[102, 90], [780, 90], [780, 127], [102, 127]]}, {'confidence': 0.9284242391586304, 'text': 'AI、AGI、大模型、通用大模型、行业大模型', 'text_box_position': [[215, 207], [670, 207], [670, 227], [215, 227]]}], 'save_path': ''}]

3.3、es部署与测试

3.3.1、es部署

docker load < es.tar

####便于添加用户和密码
chmod 644 /.../elasticsearch.yml
chmod 644 /.../kibana.yml

docker run -d 
-v /.../elasticsearch.yml:/home/elasticsearch/elasticsearch-7.16.2/config/elasticsearch.yml 
-v /.../kibana.yml:/home/elasticsearch/kibana-7.16.2-linux-x86_64/config/kibana.yml 
-p 9200:9200 -p 5601:5601 --name elasticKibana nshou/elasticsearch-kibana

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.RunningFor}}\t{{.Status}}\t{{.Ports}}" | head -n 11

3.3.2、按照ik_smart分词器

下载网址:https://github.com/infinilabs/analysis-ik/releases?page=2
下载解压之后,把文件名修改为ik放到plugins文件夹下:

docker cp /.../ik elasticKibana:/home/elasticsearch/elasticsearch-7.16.2/plugins

docker restart elasticKibana

测试如下:
在这里插入图片描述

3.4、基于ReRank模型的文本匹配

模型下载:https://huggingface.co/maidalun1020/bce-reranker-base_v1
服务:

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
from operator import itemgetter
from sentence_transformers import CrossEncoder


app = FastAPI()
# init rerank model
model_path = './model/bce-reranker-base_v1'
model = CrossEncoder(model_path, max_length=512)


class SentencePair(BaseModel):
    text1: str
    text2: str

from typing import List

class Sentences(BaseModel):
    texts: List[SentencePair]


@app.get('/')
def home():
    return 'hello world'


@app.post('/rerank')
def get_embedding(sentence_pairs: Sentences):
    scores = model.predict([[pair.text1, pair.text2] for pair in sentence_pairs.texts]).tolist()
    result = [[scores[i], sentence_pairs.texts[i].text1, sentence_pairs.texts[i].text2] for i in range(len(scores))]
    sorted_result = sorted(result, key=itemgetter(0), reverse=True)
    return {"result": sorted_result}


if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=50074)

4、结果展示

4.1、图片展示

在这里插入图片描述

4.2、以字搜图

在这里插入图片描述

4.3、以图搜图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统&#xff1f;二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里&#xff0c;非易失性存储技术扮演着至关重要的角色。MTD&#…

面试知识汇总——垃圾回收器(分代收集算法)

分代收集算法 根据对象的存活周期&#xff0c;把内存分成多个区域&#xff0c;不同区域使用不同的回收算法回收对象。 对象在创建的时候&#xff0c;会先存放到伊甸园。当伊甸园满了之后&#xff0c;就会触发垃圾回收。 这个回收的过程是&#xff1a;把伊甸园中的对象拷贝到F…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能&#xff0c;以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表&#xff0c;请参阅 API 差异报告。如需详细了解新的 API&#xff0c;请访问 Android API 参考文档&#xff0…

Selenium 自动化 —— 定位页面元素

更多内容请关注我的 Selenium 自动化 专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作切换浏览器窗口 使用 Selenium 做自动化&#xff0c;我们不仅仅是打开一个网页&#xff0c;这只是万里长…

Stable Diffusion 进阶教程 - 二次开发(制作您的文生图应用)

目录 1. 引言 2. 基于Rest API 开发 2.1 前置条件 2.2 代码实现 2.3 效果演示 2.4 常见错误 3. 总结 1. 引言 Stable Diffusion作为一种强大的文本到图像生成模型&#xff0c;已经在艺术、设计和创意领域引起了广泛的关注和应用。然而&#xff0c;对于许多开发者来说&#xff…

时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测

时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

DRC检查及丝印的调整

DRC检查及丝印的调整 综述&#xff1a;本文主要讲述AD软件中DRC检查、丝印的调整以及logo的添加的相关步骤&#xff0c;附加logo添加的脚本链接和大量操作图片&#xff0c;使步骤详细直观。 1. 点击“工具”→“设计规则检查”→“运行DRC”。&#xff08;一开始可以只开启电…

利用云手机技术,开拓海外社交市场

近年来&#xff0c;随着科技的不断进步&#xff0c;云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么&#xff0c;究竟云手机在海外社交营销中扮演了怎样的角色呢&#xff1f; 首先&#xff0c;云手机技术能够消除地…

LLM - 大语言模型的指令微调(Instruction Tuning) 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137009993 大语言模型的指令微调(Instruction Tuning)是一种优化技术&#xff0c;通过在特定的数据集上进一步训练大型语言模型(LLMs)&a…

javaWeb个人日记(博客)管理系统

一、简介 在快节奏的生活中&#xff0c;记录生活点滴、感悟和思考是一种重要的方式。基于此&#xff0c;我设计了一个基于JavaWeb的个人日记本系统&#xff0c;旨在帮助用户轻松记录并管理自己的日记。该系统包括登录、首页、日记列表、写日记、日记分类管理和个人中心等功能&…

mysql - 缓存

缓存 InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中&#xff0c;也就是说即使我们只需要访问一个页的一条记录&#xff0c;那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以…

命令模式(请求与具体实现解耦)

目录 前言 UML plantuml 类图 实战代码 模板 Command Invoker Receiver Client 前言 命令模式解耦了命令请求者&#xff08;Invoker&#xff09;和命令执行者&#xff08;receiver&#xff09;&#xff0c;使得 Invoker 不再直接引用 receiver&#xff0c;而是依赖于…

Java基础--128陷阱

问题引入 Integer a 123; Integer b 123; System.out.println(ab); 结果为true。 但是如果代码如下 Integer a 1230;Integer b 1230;System.out.println(ab); 这个的结果就是false。 问题解决 当Integer a 123时&#xff0c;其实他底层自动转换成了Integer a Inte…

Learn OpenGL 29 延迟着色法

延迟着色法 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading)&#xff0c;它是我们渲染物体的一种非常直接的方式&#xff0c;在场景中我们根据所有光源照亮一个物体&#xff0c;之后再渲染下一个物体&#xff0c;以此类推。它非常…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…

Windows如何搭建 ElasticSearch 集群

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中。 除了负载能力&#xff0c;单点服务器…

Redis到底是多线程还是单线程?

Redis6.0之前&#xff1a;是单线程模式。 Redis6.0之后&#xff1a;Redis的IO线程是多线程&#xff0c;worker线程是单线程。 Redis6.0之前&#xff1a;单线程 Redis6.0之后&#xff1a;Redis的IO线程是多线程&#xff0c;worker线程是单线程。

iOS开发进阶(九):OC混合开发嵌套H5应用并互相通信

文章目录 一、前言二、嵌套H5应用并实现双方通信2.1 WKWebView 与JS 原生交互2.1.1 H5页面嵌套2.1.2 常用代理方法2.1.3 OC调用JS方法2.1.4 JS调用OC方法 2.2 JSCore 实现原生与H5交互2.2.1 OC调用H5方法并传参2.2.2 H5给OC传参 2.3 UIWebView的基本用法2.3.1 H5页面嵌套2.3.2 …

面试算法-101-重排链表

题目 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交…