使用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 base64def 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.ymldocker 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-kibanadocker 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/pluginsdocker 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 CrossEncoderapp = FastAPI()
# init rerank model
model_path = './model/bce-reranker-base_v1'
model = CrossEncoder(model_path, max_length=512)class SentencePair(BaseModel):text1: strtext2: strfrom typing import Listclass 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、以图搜图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线构建自动部署软件JPOM

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 简而轻的低侵入式在…

【Python函数和类2/6】函数的参数

目录 目标 为函数设置参数 传递实参 关键字实参 关键字实参的顺序 位置实参 常见错误 缺少实参 位置实参的顺序 默认值形参 参数的优先级 默认值形参的位置 总结 目标 上篇博客中&#xff0c;我们在定义函数时&#xff0c;使用了空的括号。这表示它不需要任何信息就…

课堂练习:环境体验——1、 Linux 文件目录

任务描述 欢迎进行Linux世界&#xff0c;当你下载、安装了某个Linux发行版&#xff0c;体验了Linux桌面并安装了一些你喜爱和需要的软件之后&#xff0c;应该去了解下Linux真正的魅力所在&#xff1a;命令行。 每一个Linux命令其实就是一个程序&#xff0c;借助这些命令&#…

uniapp 使用命令行创建vue3 ts 项目

命令行创建 uni-app 项目&#xff1a; vue3 ts 版 npx degit dcloudio/uni-preset-vue#vite-ts 项目名称注意 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 如果下载失败&#xff0c;请去gitee下载 https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite-ts…

ES学习日记(五)-------插件head安装

接上回,必要的git和node已经装完了,现在开始装head 回到es集群项目里找到plugins(插件文件夹下), 存在安装在plugins启动es报错的情况,报错信息如图一,解决方案就是换个目录,不要放在plugin目录下 git clone https://github.com/mobz/elasticsearch-head.git 打开远程登陆,默…

【微服务】Sentinel(流量控制)

文章目录 1.基本介绍1.Sentinel是什么2.Sentinel主要特性3.Sentinel核心功能1.流量控制2.熔断降级3.消息削峰填谷 4.Sentinel两个组成部分 2.Sentinel控制台显示1.需求分析2.下载3.运行1.进入cmd2.输入java -jar sentinel-dashboard-1.8.0.jar3.查看默认端口8080 4.访问1.账号和…

同元软控专业模型库系列——机械篇

01 引言 卫星太阳帆在轨展开、C919大飞机起飞降落、机器人自主行走、汽车自如转向飞驰......在航天、航空、工业机械、车辆、船舶等众多行业中&#xff0c;我们可以看到各种机械应用的身影。 近些年&#xff0c;随着装备数字化和人工智能技术的迅速发展&#xff0c;世界装备制…

【61-80】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【61-80】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用61、 四次挥手相关内容62、挥手为什么需要四次&#xff1f;63、2MSL等待状态&#xff1f;64、四次…

硬件10、从网站获取封装

百度搜索IC封装网或者网址https://www.iclib.com/ 搜索想要的器件&#xff0c;直接下载他的原理图库和封装库

【单调栈】【网格】【柱图面积】85. 最大矩形

作者推荐 视频算法专题 本文涉及的基础知识点 单调栈分类、封装和总结 网格 LeetCode85. 最大矩形 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;…

【氮化镓】GaN器件中关态应力诱导的损伤定位

概括总结&#xff1a; 这项研究通过低频1/f噪声测量方法&#xff0c;探究了在关态&#xff08;OFF-state&#xff09;应力作用下&#xff0c;AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;中由应力引起的损伤的定位。研究中结合了电致发光&#xff08;EL&#xf…

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…