Chinese-Clip實現以文搜圖和以圖搜圖(transformers版)

本文不生產技術,只做技術的搬運工!

前言

????????作者昨天使用cn_clip庫實現了一版,但是覺得大家復現配置環境可能有點復雜,因此有使用transformers庫實現了一版,提供大家選擇,第一篇參考鏈接如下:

Chinese-Clip實現以文搜圖和以圖搜圖-CSDN博客文章瀏覽閱讀728次,點贊9次,收藏17次。使用clip實現以文搜圖和以圖搜圖的圖文檢索功能https://blog.csdn.net/qq_44908396/article/details/144537426

?環境配置

transformers:

pip install transformers

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

源碼

數據入庫

from PIL import Image
import requests
from transformers import ChineseCLIPProcessor, ChineseCLIPModel
import torch
import os
import numpy as np
from pymilvus import MilvusClient
client = MilvusClient("BlingPic.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"
)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 = ChineseCLIPModel.from_pretrained("OFA-Sys/chinese-clip-vit-base-patch16")model.to(device)preprocess = ChineseCLIPProcessor.from_pretrained("OFA-Sys/chinese-clip-vit-base-patch16")model.eval()img_dir = r"/home/turing/圖片/BlingPic"image_path_list = []image_path_list = getFileList(img_dir, image_path_list, '.jpg')data = []i = 0for image_path in image_path_list:temp = {}image = Image.open(image_path)with torch.no_grad():inputs = preprocess(images=image, return_tensors="pt").to(device)image_features = model.get_image_features(**inputs)image_features = image_features / image_features.norm(dim=-1, keepdim=True)  # normalizeimage_features = image_features.cpu().numpy().astype(np.float32).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)

上述代碼會在指定路徑生成一個BlingPic.db的文件,這就說明數據完成了入庫,我們接下來進行調用

數據查詢

from PIL import Image,ImageDraw,ImageFont
from transformers import ChineseCLIPProcessor, ChineseCLIPModel,AutoTokenizer
import torch
import numpy as np
from pymilvus import MilvusClient
client = MilvusClient("BlingPic.db")
# 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 = ChineseCLIPModel.from_pretrained("OFA-Sys/chinese-clip-vit-base-patch16")model.to(device)preprocess = ChineseCLIPProcessor.from_pretrained("OFA-Sys/chinese-clip-vit-base-patch16")model.eval()return model, preprocessdef text_encode(model,text,device):tokenizer = AutoTokenizer.from_pretrained("OFA-Sys/chinese-clip-vit-base-patch16")inputs = tokenizer(text, return_tensors="pt").to(device)with torch.no_grad():text_features = model.get_text_features(**inputs)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 = Image.open(image_path)with torch.no_grad():inputs = preprocess(images=image, return_tensors="pt").to(device)image_features = model.get_image_features(**inputs)image_features = image_features / image_features.norm(dim=-1, keepdim=True)  # normalizeimage_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(model,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時為以圖搜圖

實現效果

以文搜圖

以圖搜圖

示例圖像:

搜索結果:

附加

權重下載遇到問題參考如下鏈接:

解決OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file-CSDN博客文章瀏覽閱讀1.4k次,點贊6次,收藏2次。解決hugging face無法下載模型的問題https://blog.csdn.net/qq_44908396/article/details/142516867

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63392.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unity3D】無限循環列表(擴展版)

基礎版:【Unity技術分享】UGUI之ScrollRect優化_ugui scrollrect 優化-CSDN博客 using UnityEngine; using UnityEngine.UI; using System.Collections.Generic;public delegate void OnBaseLoopListItemCallback(GameObject cell, int index); public class BaseLo…

MSSQL AlwaysOn 可用性組(Availability Group)中的所有副本均不健康排查步驟和解決方法

當遇到 MSSQL AlwaysOn 可用性組(Availability Group)中的所有副本均不健康的情況時(MSSQL AG 副本名稱: All replicas unhealthy),這通常意味著可用性組無法正常工作,數據同步和故障轉移功能可能受到影響。以下是一些可能的原因及相應的排查步驟和解決方法: 1. 檢查副本…

springboot檢測配置是否存在,如果存在則返回,不存在則提示新增

我這里是以七牛為例子 在yml中添加七牛的相關配置 qiniu: #七牛的相關配置accessKey: your_access_keysecretKey: your_secret_keybucket: your_bucket_namedomain: your_domain 對應在給配置文件來一個相應的實體類QiniuConfig Component ConfigurationProperties(prefix &…

[NOIP2016 普及組] 海港 -STL-隊列queue

[NOIP2016 普及組] 海港 題目背景 NOIP2016 普及組 T3 題目描述 小 K 是一個海港的海關工作人員,每天都有許多船只到達海港,船上通常有很多來自不同國家的乘客。 小 K 對這些到達海港的船只非常感興趣,他按照時間記錄下了到達海港的每一…

【Vulkan入門】16-IndexBuffer

TOC 先叨叨 上篇介紹了如何使用VertexBuffer傳入頂點信息。兩個多星期了我們一直在玩三個點,本篇介紹如何渲染更多的點。 在渲染前考慮一個問題,渲染一個三角形需要三個點,渲染兩個相接的三角形需要幾個點? 答案是6個點&#xf…

IDEA 打包普通JAVA項目為jar包

需求:普通java項目(有添加依賴的jar包),沒有用maven管理依賴和打包,要打成jar包,包可以用“java -jar 包名” 啟動程序。 講如何打包前,先記錄下普通項目的目錄結構和怎么添加依賴包 1.目錄結…

python的流程控制語句之制作空氣質量評估系統

👨?💻個人主頁:開發者-曼億點 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 曼億點 原創 👨?💻 收錄于專欄&#xff1a…

Docker Compose 多應用部署 一鍵部署

介紹 Docker Compose通過一個單獨的docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器,幫助我們實現多個相互關聯的Docker容器的快速部署。 如:springbootmysqlnginx 如果一個個去部署他會非常的麻煩,這時候可以選擇Docker …

【數據結構——線性表】單鏈表的基本運算(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 相關知識 測試說明 我的通關代碼: 測試結果: 任務描述 本關任務:編寫一個程序實現單鏈表的基本運算。 相關知識 為了完成本關任務,你需要掌握:初始化線性表、銷毀線性表、判定是否為空表、求線性…

git branch -r(--remotes )顯示你本地倉庫知道的所有 遠程分支 的列表

好的,git branch -r 這個命令用于列出遠程分支。讓我詳細解釋一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 這個命令會顯示你本地倉庫知道的所有 遠程分支 的列表。它不…

【AI熱點】小型語言模型(SLM)的崛起:如何在AI時代中找到你的“左膀右臂”?

人工智能模型的演變 多年來,谷歌等科技巨頭和OpenAI等初創公司,一直在不遺余力地利用海量在線數據,打造更大、更昂貴的人工智能(AI)模型。這些大型語言模型(LLM)被廣泛應用于ChatGPT等聊天機器…

【昇騰】NPU ID:物理ID、邏輯ID、芯片映射關系

起因: https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查詢所有NPU設備: [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…

Elasticsearch-DSL高級查詢操作

一、禁用元數據和過濾數據 1、禁用元數據_source GET product/_search {"_source": false, "query": {"match_all": {}} }查詢結果不顯示元數據 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…

基于Spring Boot的體育商品推薦系統

一、系統背景與目的 隨著電子商務的快速發展和人們健康意識的提高,體育商品市場呈現出蓬勃發展的態勢。然而,傳統的體育商品銷售方式存在商品種類繁多、用戶選擇困難、個性化需求無法滿足等問題。為了解決這些問題,基于Spring Boot的體育商品…

【Java Nio Netty】基于TCP的簡單Netty自定義協議實現(萬字,全篇例子)

基于TCP的簡單Netty自定義協議實現(萬字,全篇例子) 前言 有一陣子沒寫博客了,最近在學習Netty寫一個實時聊天軟件,一個高性能異步事件驅動的網絡應用框架,我們常用的SpringBoot一般基于Http協議&#xff0…

【2025最新計算機畢業設計】基于SSM校園歌手賽事管理系統【提供源碼+答辯PPT+文檔+項目部署】

作者簡介:?CSDN新星計劃導師、Java領域優質創作者、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和學生畢業項目實戰,高校老師/講師/同行前輩交流。? 主要內容:🌟Java項目、Python項目、前端項目、PHP、ASP.NET、人工智能…

Visual Studio 使用 GitHub Copilot 協助調試

🎀🎀🎀【AI輔助編程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 與 IntelliCode 輔助編碼Visual Studio 安裝和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 擴展Visual Studio 使用 GitHu…

了解ARM的千兆以太網——RK3588

1. 簡介 本文并不重點講解調試內容,重點了解以太網在ARM設計中的框架以及在設備樹以及驅動的一個整體框架。了解作為一個驅動開發人員當拿到一款未開發過的ARM板卡應該怎么去把網卡配置使用起來。 2. 基礎知識介紹 在嵌入式ARM中實現以太網的解決方案通常有以下兩種…

Springboot家政服務管理系統

摘 要 科技進步的飛速發展引起人們日常生活的巨大變化,電子信息技術的飛速發展使得電子信息技術的各個領域的應用水平得到普及和應用。信息時代的到來已成為不可阻擋的時尚潮流,人類發展的歷史正進入一個新時代。在現實運用中,應用軟件的工作…

DC-9筆記

靶機信息 官網:DC: 9 ~ VulnHub 只有一個flag,官網上沒給其他提示 信息收集 nmap 192.168.66.2-254nmap 192.168.66.146 -A -p-開放了80端口,22端口是filtered的,被過濾? NMAP 六種端口狀態解讀_nmap filtered-CSDN博客 那來看看http服務吧 http(80) 頁腳是空白的,插件也…