Chinese-Clip实现以文搜图和以图搜图

本文不生产技术,只做技术的搬运工!

前言

        目前网上能够找到的资料有限,要么收费,要么配置复杂,作者主打一个一毛不拔,决定自己动手实现一个,功能清单受启发于Nidia AI lab实验室的nanodb项目,打算开发一个可以实现以文搜图和以图搜图的demo,由于作者非科班出身,代码知识面较窄,因此未实现网页功能,仅提供demo,具体业务功能大家需要自行编写。

实现思路

        整体思路如下图所示,我们先将图像使用clip生成其对应的特征向量存入数据库当中,然后通过图像输入或者文本输入进行查询,需要注意,图像和文本输入有一项即可。      

环境配置

Chinese-Clip:GitHub - OFA-Sys/Chinese-CLIP: Chinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.Chinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation. - OFA-Sys/Chinese-CLIPicon-default.png?t=O83Ahttps://github.com/OFA-Sys/Chinese-CLIP%C2%A0%C2%A0

milvus:

pip install -U pymilvus

pytorch:

pip install torch==1.13.0+cu117 torchvision==0.14.0+cu117 torchaudio==0.13.0 --extra-index-url https://download.pytorch.org/whl/cu117

源码

数据入库

import torch
from PIL import Image
import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
import numpy as np
import os
from pymilvus import MilvusClient
client = MilvusClient("/home/project_python/Chinese-CLIP/my_database/coco2017.db")
if client.has_collection(collection_name="text_image"):client.drop_collection(collection_name="text_image")
client.create_collection(collection_name="text_image",dimension=512,  # The vectors we will use in this demo has 768 dimensionsmetric_type="COSINE"
)
print("Available models:", available_models())def getFileList(dir, Filelist, ext=None):"""获取文件夹及其子文件夹中文件列表输入 dir:文件夹根目录输入 ext: 扩展名返回: 文件路径列表"""newDir = dirif os.path.isfile(dir):if ext is None:Filelist.append(dir)else:if ext in dir:Filelist.append(dir)elif os.path.isdir(dir):for s in os.listdir(dir):newDir = os.path.join(dir, s)getFileList(newDir, Filelist, ext)return Filelistif __name__ == "__main__":device = "cuda" if torch.cuda.is_available() else "cpu"model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')model.eval()img_dir = r"/home/project_python/Chinese-CLIP/my_dataset/coco"image_path_list = []image_path_list = getFileList(img_dir, image_path_list, '.jpg')data = []i = 0for image_path in image_path_list:temp = {}image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)with torch.no_grad():image_features = model.encode_image(image)# 对特征进行归一化,请使用归一化后的图文特征用于下游任务image_features /= image_features.norm(dim=-1, keepdim=True)image_features = image_features.cpu().numpy().astype(np.float32).flatten()# 将特征向量转换为字符串#features_str = ','.join(map(str, image_features.flatten()))temp['id'] = itemp['image_path'] = image_pathtemp['vector'] = image_featuresdata.append(temp)i = i + 1print(i)res = client.insert(collection_name="text_image", data=data)

上述代码会在指定路径生成一个coco2017.db的文件,这就说明数据完成了入库,我们接下来进行调用

数据查询

import torch
from PIL import Image,ImageDraw, ImageFont
import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
import numpy as np
import time
from pymilvus import MilvusClient
client = MilvusClient("/home/project_python/Chinese-CLIP/my_database/coco2017.db")
print("Available models:", available_models())
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']def display_single_image_with_text(image_path):with Image.open(image_path) as img:draw = ImageDraw.Draw(img)# 设置字体和字号,这里假设你有一个可用的字体文件,例如 Arial.ttf# 如果没有,可以使用系统默认字体try:font = ImageFont.truetype("Arial.ttf", 30)except IOError:font = ImageFont.load_default()# 文本内容和颜色text = "Example image"text_color = (255, 0, 0)  # 红色# 文本位置text_position = (10, 10)# 绘制文本draw.text(text_position, text, fill=text_color, font=font)# 显示图像img.show()def display_images_in_grid(image_paths, images_per_row=3):# 计算需要的行数num_images = len(image_paths)num_rows = (num_images + images_per_row - 1) // images_per_row# 打开所有图像并调整大小images = []for path in image_paths:with Image.open(path) as img:img = img.resize((200, 200))  # 调整图像大小以适应画布images.append(img)# 创建一个空白画布canvas_width = images_per_row * 200canvas_height = num_rows * 200canvas = Image.new('RGB', (canvas_width, canvas_height), (255, 255, 255))# 将图像粘贴到画布上for idx, img in enumerate(images):row = idx // images_per_rowcol = idx % images_per_rowposition = (col * 200, row * 200)canvas.paste(img, position)# 显示画布canvas.show()def load_model(device):model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')model.eval()return model, preprocessdef text_encode(text,device):new_text = clip.tokenize([text]).to(device)with torch.no_grad():text_features = model.encode_text(new_text)text_features /= text_features.norm(dim=-1, keepdim=True)text_features = text_features.cpu().numpy().astype(np.float32)return text_featuresdef image_encode(model,preprocess,image_path,device):image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)with torch.no_grad():image_features = model.encode_image(image)image_features /= image_features.norm(dim=-1, keepdim=True)image_features = image_features.cpu().numpy().astype(np.float32)return image_featuresif __name__ == "__main__":search_text = "猫"search_image_path = "/home/project_python/Chinese-CLIP/my_dataset/coco/val2017/000000000285.jpg"device = "cuda" if torch.cuda.is_available() else "cpu"model, preprocess = load_model(device)text_flag = Falseif text_flag:text_features = text_encode(search_text,device)results = client.search("text_image",data=text_features,output_fields=["image_path"],search_params={"metric_type": "COSINE"},limit=36)else:display_single_image_with_text(search_image_path)image_features = image_encode(model,preprocess,search_image_path,device)results = client.search("text_image",data=image_features,output_fields=["image_path"],search_params={"metric_type": "COSINE"},limit=36)image_list = []for i,result in enumerate(results[0]):image_list.append(result["entity"]["image_path"])display_images_in_grid(image_list,9)

上述代码使用text_flag控制是以文搜图还是以图搜图,True时为以文搜图,False时为以图搜图

实现效果

以文搜图

以图搜图

示例图像:

搜索结果:

附加

1. Chinese-Clip开放了onnx和trt推理,大家可以根据自己的需求改进,参考链接如下:

FoundationModel/Chinese-CLIP: 本项目为CLIP模型的中文版本,使用大规模中文数据进行训练(~2亿图文对),旨在帮助用户快速实现中文领域的图文特征&相似度计算、跨模态检索、零样本图片分类等任务 - deployment.md at master - Chinese-CLIP - OpenI - 启智AI开源社区提供普惠算力!Chinese-CLIP - 本项目为CLIP模型的中文版本,使用大规模中文数据进行训练(~2亿图文对),旨在帮助用户快速实现中文领域的图文特征&相似度计算、跨模态检索、零样本图片分类等任务icon-default.png?t=O83Ahttps://openi.pcl.ac.cn/FoundationModel/Chinese-CLIP/src/branch/master/deployment.md

2. 大家也可以根据自己的时间安排复现下面的项目,作者这里只是demo,上不了台面,参考链接如下:

https://github.com/jackyzha0/nanoDBicon-default.png?t=O83Ahttps://github.com/jackyzha0/nanoDB

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

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

相关文章

Abaqus混凝土梁三点弯曲开裂模拟基于随机多边形骨料及界面过渡区模型

在细观混凝土开裂研究中,仿真可直观揭示混凝土中多相材料的破坏特征及微观裂缝的发展规律。本案例建立包含随机多边形粗骨料、界面过渡区(ITZ)及水泥砂浆在内的细观混凝土梁二维模型,对混凝土梁在三点弯曲工况下进行有限元模拟&am…

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars(九) 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时,经常需要修改窗口标题、更改软…

渗透测试之js利用

引言 在渗透测试中,js利用是一个非常重要的部分,作为一个网络安全人员,我也是经常利用到这一模块,首先,js是什么呢 什么是js JavaScript(简称js),javascript和java虽然名字相似,但两个东西却…

请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配

vs版本升级时,编译时会出现上述问题,如原来在2017下编译的程序,后来改用2019,出现上述问题。需要在解决方案-通用属性-调试源文件下变更相应设置。

Airbus结构数字样机理念及实践(转)

关注作者 1、数字样机的背景 早期的设计文档通过二维工程图来描述,对工程师来说,绘制工程图足够表达设计思想,工程图成为了标准的“工程师语言”。但是外围的用户通常通过透视图来表达设计意图,不得不产生了大量针对不同教育背景…

ik分词器了解 和 通过zip安装包的方式 将ik分词器安装到elasticsearch中

目录 1. ik分词器的作用(效果) (1)标准分析器效果 (2)ik_smart分词 (3)ik_max_word分词 2. 首先根据自己的elasticsearch的版本下载对应的ik分词器版本 3. 将下载好的ik分词器…

【人工智能】网络安全技术及应用

文章目录 前言一、网络安全概念1、你是否了解以下网络安全事件?2、什么是网络安全?3、网络安全的核心要素4、网络安全、信息安全、数据安全三者的区别5、网络安全的重要性6、网络安全-法律法规7、网络安全-等级保护 二、常见的网络安全威胁和攻击1、网络…

计算机屏幕坐标系简介

计算机屏幕坐标系简介 计算机屏幕坐标系是用于描述计算机显示屏上点的位置的系统。它在图形编程、游戏开发、用户界面设计等多个领域中至关重要。因此,需要理解掌握。坐标系通常由两个维度(二维坐标系,平面坐标系)或三个维度&…

java 通过jdbc连接sql2000方法

1、java通过jdbc连接sql2000 需要到三个jar包:msbase.jar mssqlserver.jar msutil.jar 下载地址:https://download.csdn.net/download/sunfor/90145580 2、将三个jar包解压到程序中的LIB下: 导入方法: ①在当前目录下&#xff…

车牌识别之二:车牌OCR识别(包含全部免费的数据集、源码和模型下载)

重要的事说在前面 数据集: https://pan.baidu.com/s/1YayAeqgdqZ0u2vSovd0Z4w 提取码:8888 如果作者误删的话,参考这里下载的CCPD2019.tar.xz和CCPD2020.zip获取。 背景 上一节车牌识别之一:车牌检测(包含全部免费的数据集、源…

单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”

在当今全球科技竞争日益激烈的背景下,技术自主可控的重要性愈发凸显。它不仅关乎国家安全,更是推动产业升级和经济发展的关键。特别是在一些特殊领域,如防爆通信,自主可控的技术更是不可或缺。遨游通讯推出了一款融合了单北斗、鸿…

【zlm】 webrtc源码讲解三(总结)

目录 setsdp onwrite ​编辑 play 参考 setsdp onwrite play 参考 【zlm】 webrtc源码讲解_zlm webrtc-CSDN博客 【zlm】 webrtc源码讲解(二)_webrtc 源码-CSDN博客

打造专业的电子商务维护页面:如何确保用户信任与业务连续性

在电子商务网站的运营过程中,维护是不可避免的一部分。然而,网站的短暂下线如果处理不当,可能会导致用户流失和销售额的下降。为了在维护期间依然保持客户的信任与业务的连续性,创建一个专业的维护页面至关重要。本文将为您详细介…

【python因果库实战5】使用银行营销数据集研究营销决策的效果5

目录 接触次数的效应 重新定义治疗变量和潜在混杂因素 更深入地审视干预情景 逆概率加权 标准化 总结及与非因果分析的比较 接触次数的效应 我们现在转而研究当前营销活动中接触次数的数量(campaign)对积极结果发生率的影响。具体来说,…

单步调试Android Framework——App冷启动

纸上得来终觉浅,绝知此事要躬行。 —— [宋]陆游 基于aosp_cf_x86_64_phone-trunk_staging-eng , 下面是具体断点位置。 第一部分,桌面launcher进程 com.android.launcher3.touch.ItemClickHandler onClickonClickAppShortcutstartAppShor…

【5G】5G的主要架构选项

最初,在3GPP讨论中考虑了所有可能的聚合和核心网络组合,共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 :Standalone architecture with 5G-core 特点: 5G核心网(5GC, …

MySQL数据库备份,恢复

备份策略不同,恢复方式也不同。 在进行数据备份的时候,能使用冷备份就使用冷备份,安全可靠, 但是冷备份自己的缺点是【每一个数据库都对应着一个前端的业务】此时前端业务停止可能带来经济损失。 一.备份类型 根据服务是否在线…

OpenCV 学习记录:首篇

最近在学习机器视觉,希望能通过记录博客的形式来鞭策自己坚持学完,同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV? OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

基于vue框架的的校园二手市场交易平台8k655(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:学生,大学,商品分类,商品信息,在线咨询 开题报告内容 基于Vue框架的校园二手市场交易平台开题报告 一、课题意义 (一)理论意义 本课题旨在研究基于Vue框架的校园二手市场交易平台的设计与实现。当前&#xff…

3D计算机视觉概述

3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像(像素表达&#xff…