CLIP与Chinese 您所在的位置:网站首页 以图搜图怎么用 CLIP与Chinese

CLIP与Chinese

2024-01-17 12:14| 来源: 网络整理| 查看: 265

欢迎关注公众号 - 【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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有