CLIP与Chinese-CLIP:多模态预训练模型解读和图文检索体验

欢迎关注公众号 - 【AICV与前沿】,一起学习最新技术吧

欢迎关注公众号 - 【AICV与前沿】,一起学习最新技术吧

欢迎关注公众号 - 【AICV与前沿】,一起学习最新技术吧

1. CLIP回顾

CLIP是2021年OpenAI提出的基于图文对比学习的多模态预训练模型,具备强大的zero-shot迁移能力。

数据集:来源于互联网上搜集的4亿个image-text对,涵盖了50万个qurey,并尽量保持不同qurey的数据量均衡。

核心思想:将image-text对当做一个整体,基于对比学习的方法,模型训练时尽可能地提高image与对应text的特征相似度,尽可能的降低image与不配对text的相似度。

具体如下图(1):

训练阶段

假设训练N个image-text图像文本对,CLIP的图像编码器对N个图像进行特征提取得到N个特征向量,同理文本编码器对N个文本进行特征提取得到N个文本特征向量。那么N个图像特征和N个文本特征两两比对就会得到N*N种概率。CLIP要做的就是尽可能提高对角线匹配对的相似分数,一共有N个,降低非对角线非匹配对的概率分数,一共有N(N-1)个。论文给出的伪代码如下:


# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

分别计算图像的交叉熵损失和文本的交叉熵损失,最后求平均得到最终损失。
在这里插入图片描述

推理阶段

如图(2)和图(3),先准备好多个text prompt和一张image,然后CLIP会根据Text Encoder和Image Encoder输出的特征进行逐一匹配(可以看出分类问题转为检索问题)计算相似分数,根据相似分数从而获取到image对应的最大可能类别,反过来也可得到单个文本与多张图片中的某个进行匹配对应。

由于CLIP是基于文本与图像进行对比学习,所以对于没出现过(不在训练集里面)的图像,可以根据文本特征与图像特征匹配得到,这也是clip具备强大的zero-shot迁移能力的原因。

2. Chinese-CLIP


文章:https://arxiv.org/abs/2211.01335
代码:https://github.com/OFA-Sys/Chinese-CLIP

2.1 原理

2022年阿里达摩院开源的基于2亿中文原生图文对的多模态预训练模型。

数据集:大规模的中文图文对数据(约 2 亿规模),其中包括来自 LAION-5B 中文子集、Wukong 的中文数据、以及来自 COCO、Visual Genome 的翻译图文数据等。

为了提升训练效率和模型效果,Chinese-CLIP基于两阶段流程进行训练,具体如下:

(1)第一阶段,使用已有的图像预训练模型和文本预训练模型分别初始化 Chinese-CLIP 的双塔,并冻结图像侧参数,让语言模型关联上已有的图像预训练表示空间。这是由于CLIP的文本编码器是英文版本训练得到,所以需要对CLIP的文本表征模型进行重新训练。

(2)第二阶段,解冻图像侧参数,通过对比学习微调中文原生的图像和文本数据。
在这里插入图片描述
两阶段的训练流程优点如下:

(1)相比从头开始做预训练,该方法在多个下游任务上均展现显著更优的实验效果,而其显著更高的收敛效率也意味着更小的训练成本。

(2)相比全程只训练文本侧做一阶段训练,加入第二阶段微调训练能有效在图文下游任务,尤其是中文原生的图文任务上进一步提升效果。

2.2 实验结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. API快速上手

下面提供一段简单的代码示例说明如何使用中文CLIP的API。开始使用前,请先安装cn_clip

通过pip安装

pip install cn_clip

或者从源代码安装

cd Chinese-CLIP
pip install -e .

安装成功后,即可通过如下方式轻松调用API,传入指定图片(示例)和文本,提取图文特征向量并计算相似度。

import torch 
from PIL import Image

import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
print("Available models:", available_models())  
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()
image = preprocess(Image.open("examples/pokemon.jpeg")).unsqueeze(0).to(device)
text = clip.tokenize(["杰尼龟", "妙蛙种子", "小火龙", "皮卡丘"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    # 对特征进行归一化,请使用归一化后的图文特征用于下游任务
    image_features /= image_features.norm(dim=-1, keepdim=True) 
    text_features /= text_features.norm(dim=-1, keepdim=True)    

    logits_per_image, logits_per_text = model.get_similarity(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)  # [[1.268734e-03 5.436878e-02 6.795761e-04 9.436829e-01]]

4. 图文检索应用

简单搭建一个可视化的图文检索服务,基于Chinese-Clip进行文到图以及图到图的检索,体验结果如下:

4.1 以文搜图

查询文本:一直奔跑的小狗
在这里插入图片描述
查询文本:夕阳、大海、沙滩
在这里插入图片描述

4.2 以图搜图

在这里插入图片描述

在这里插入图片描述

由于检索数据库来源于网上,并且量级较少,故检索结果可能会存在少许偏差,但也足以看出以文搜图和以图搜图都展示了Chinese-CLIP的强大能力。

参考文献

https://zhuanlan.zhihu.com/p/618490277

https://zhuanlan.zhihu.com/p/580546929

https://mp.weixin.qq.com/s/yks5sWxF6iPUlW5CSYs88A

https://github.com/OFA-Sys/Chinese-CLIP

### 使用 OpenVINO 部署 CLIP 模型 为了使用 OpenVINO 部署 CLIP (Contrastive Language–Image Pretraining) 模型,需遵循一系列特定步骤来准备环境并优化模型性能。此过程涉及安装必要的库、下载预训练CLIP 模型以及将其转换为 Intermediate Representation (IR),以便能够在 Intel 的硬件上高效运行。 #### 安装依赖项 首先,确保已安装最新版本的 OpenVINO 工具套件其他必需软件包: ```bash pip install openvino-dev transformers torch ``` #### 下载 CLIP 模型 可以从 Hugging Face Model Hub 获取预训练好的 CLIP 模型,并保存到本地文件夹中用于后续处理[^1]。 #### 转换模型至 IR 格式 利用 `mo` 命令行工具将 PyTorch 版本的 CLIP 模型转化为 OpenVINO 支持的 XML BIN 文件形式。这一步骤对于加速推理速度至关重要。 ```bash mo --input_model clip_vit_base_patch32.onnx \ --output_dir ./ir_models/clip/ ``` 上述命令假设已经通过 ONNX 导出了 CLIP 模型;如果不是,则需要先完成这一导出操作[^2]。 #### 编写 Python 推理脚本 创建一个新的 Python 文件,在其中加载刚刚生成的 IR 文件,并编写简单的图像特征提取逻辑。下面是一个基本的例子: ```python from openvino.runtime import Core import numpy as np from PIL import Image from torchvision.transforms.functional import to_tensor, resize def preprocess_image(image_path): img = Image.open(image_path).convert('RGB') img = resize(img, size=(224, 224)) tensor_img = to_tensor(img)[None, :] return tensor_img.numpy() ie_core = Core() model_xml = "./ir_models/clip/clip.xml" compiled_model = ie_core.compile_model(model=model_xml, device_name="CPU") text_input_key = compiled_model.input(0) image_input_key = compiled_model.input(1) img_features = preprocess_image("example.jpg") logits = compiled_model([img_features]) print(logits) ``` 这段代码展示了如何读取图片数据并对之应用标准变换流程,之后调用编译后的模型执行前向传播计算得到最终输出结果[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值