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

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

前言

        目前网上能够找到的资料有限,要么收费,要么配置复杂,作者主打一个一毛不拔,决定自己动手实现一个,功能清单受启发于Nvidia 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-CLIPhttps://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="t
### 使用 CLIP 模型实现本到像的索功能 为了利用 CLIP 模型实现本到像的索功能,需理解其核心机制在于通过对比学习建立像之间的关联。CLIP 能够将输入的本描述转换成特征向量,并同样处理一组候选片以获得对应的特征向量。之后计算这些向量间的相似度得分,从而挑选出最匹配目标描述的片。 #### 加载预训练好的 CLIP 模型并准备数据集 首先安装必要的库: ```bash pip install torch transformers ftfy regex requests tqdm ``` 加载已有的 CLIP 预训练权重件以及初始化编码器: ```python import torch from PIL import Image from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize from transformers import CLIPProcessor, CLIPModel model_name = "openai/clip-vit-base-patch32" device = "cuda" if torch.cuda.is_available() else "cpu" # 初始化模型与处理器 model = CLIPModel.from_pretrained(model_name).to(device) processor = CLIPProcessor.from_pretrained(model_name) def preprocess(image_path): image = Image.open(image_path) inputs = processor(images=image, return_tensors="pt", padding=True)["pixel_values"].to(device) return inputs ``` #### 编写查询函数执行本至像检索 定义一个用于接收用户提供的字提示作为参数的功能,接着调用 `encode_text()` `encode_image()` 函数分别获取本嵌入每张待选照片的视觉表征;最后比较两者间余弦距离找出最佳配对项。 ```python def search_images_by_text(text_query, candidate_images_paths): text_inputs = processor(text=[text_query], return_tensors="pt").input_ids.to(device) with torch.no_grad(): text_features = model.get_text_features(input_ids=text_inputs)[0].float() scores = [] for img_path in candidate_images_paths: img_input = preprocess(img_path) image_features = model.get_image_features(pixel_values=img_input)[0].float() score = (image_features @ text_features.T).item() scores.append((img_path, score)) sorted_scores = sorted(scores, key=lambda x: x[1], reverse=True) top_match_img_path, _ = sorted_scores[0] return top_match_img_path ``` 上述方法展示了如何借助 CLIP 架构完成从自然语言表述到可视化内容的有效查找操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值