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

2023-11-15

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 2020年全国平均工资出炉:IT行业超17万居首!网友:又是拖后腿的那个~

    2020年全国平均工资出炉了 2020年全国城镇非私营单位就业人员年平均工资为97379元 2020年全国城镇私营单位就业人员年平均工资为57727元 前三甲依次是信息传输 软件和信息技术服务业177544元 其次是科学研究和技术服务业13
  • codeblocks创建和使用静态库(C语言)

    静态库 扩展名为 a 或 lib 是包含函数的文件 用于在link阶段整合执行程序 动态链接库 扩展名 dll 是不在link阶段整合进执行程序中的 DLL文件在执行阶段动态调用 下面我们将用免费的开发工具CodeBocks开发静态库 创建
  • 【C++】在线IDE

    1 洛谷在线IDE https www luogu com cn ide 2 菜鸟工具 https c runoob com compile 12 3 Cloud Studio https cloudstudio net
  • 使用STM32CubeMX生成源码工程后,使用ST-LINK下载出现问题的解决方法

    第一次使用STM32CubeMX生成源码工程文件 各种时钟引脚资源配置好后 点击生成了Keil的工程 编译通过 连接ST LINK下载程序 第一次下载 一切正常 然后修改了一下程序 再次下载 出现找不到设备的提示 以为板子出了问题 又拿过来
  • Python 数组(Arrays)

    数组 Array 是有序的元素序列 若将有限个类型相同的变量的集合命名 那么这个名称为数组名 组成数组的各个变量称为数组的分量 也称为数组的元素 有时也称为下标变量 用于区分数组的各个元素的数字编号称为下标 数组是在程序设计中 为了处理方便
  • 为什么db是先写日志,而redis是后写日志

    预写式日志 Write Ahead Logging WAL 基本上所有的数据库都实现了这个WAL技术 来保证原子性和持久性 WAL的核心思想是 在数据写入到数据库之前 先写入到日志 这一定程度上也可以提高效率 因为不需要每次都和磁盘交互 可
  • 各种开源应用的实践经验

    在实际的项目中 很多地方需要用到开源项目 而现在的开源项目太多 从开源项目的首页去看的话 也未必能得到足够充分的信息 多数时候是选用淘汰法 选剩下两到三个项目然后自己再去一个一个地去试用 选择合适的开源组件确实是一件麻烦事 本文将记录下选择
  • Arthas 定位CPU跑满问题,源头竟是Apache Beanutils

    一 背景 大早上 线上k8s 机子 某个机子 cpu 飙高 导致k8s 健康检查失败 线上环境会自动执行jstack 上传到oss 通知到 钉钉告警群 直接分析锁 cpu 高的线程 二 过程分析 2 1 排查cpu 占用最高的线程 使用js
  • JAVA-0基础学习笔记-day01

    0基础学Java笔记day01 01 01 计算机基础知识 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设
  • Java经典面试题 带答案(五)

    Java经典面试题 带答案 五 Java 面试笔试题汇总 一 编程语言 Java 2 二 软件工程方面 9 三 智力测试 9 四 数据库 12 五 Java框架方面 14 六 XML方面 17 七 网络基础方面 17 八 算法方面 19 1
  • eclispe黑色配色方案,插件配置

    http blog csdn net zhwangkaixuan article details 9303359 使用android官方的ADT感觉界面白色的太怪了 看就了眼睛不舒服 上网找了一个eclispe的插件可以定制编辑器的配色方案
  • Docker学习笔记05-----镜像仓库之官方Docker Hub

    官方Docker Hub https hub docker com 1 创建Repository 2 构建容器镜像 2 1 创建Dockerfile FROM java 8 MAINTAINER itmrl LABEL name hello
  • Qt颜色选择器(HSV)

    目录 引言 HSV颜色空间 实现思路 代码实现 引言 基于Qt实现的HSV颜色选择器 效果如下 HSV颜色空间 HSV Hue Saturation Value 是根据颜色的直观特征创建的颜色模型 如下图所示 Hue为色调 通过角度表示不同
  • 3_Nginx重载、热部署、日志切割

    文章目录 常用命令 重载配置文件 热部署 流程 日志切割 常用命令 获取帮助 nginx h 使用指定的配置文件 nginx c conf file 在命令行中覆盖配置文件中的指令 nginx g 指定运行目录 nginx p 发送信号 n
  • 【Vue学习笔记3】使用Vite开启一个Vue3工程项目

    1 什么是Vite Vite是一个web开发构建工具 Vite 的竞品是 Webpack 而且按照现在的趋势看 使用率超过 Webpack 也是早晚的事 Vite 主要提升的是开发的体验 Webpack启动调试环境需要 3 分钟都很常见 V
  • linux环境下的Qt编程问题解决

    1 gcc编译器无法使用 原因可能是没有安装g 终端输入命令 sudo apt get install g 2 编译程序报错Could not start process make qmake all 解决办法 终端输入命令 sudo ap
  • 机器学习(第二章)—— 模型评估

    目录 一 评估指标的局限性 二 ROC曲线 三 余弦距离的应用 四 A B测试的陷阱 五 模型的评估方法 六 超参数优化 七 过拟合与欠拟合 准确率的局限性 精确率与召回率的权衡 平方根误差的 意外 什么是ROC曲线 为什么要进行在线A B
  • include过滤器

    include过滤器分为core gui io scene video几个文件夹以及 IEventReceiver h Irrlicht h Irrlicht h IrrlichtDevice h Irrlicht h IrrlichtDe
  • 【Selenium】webdriver.ChromeOptions()官方文档参数

    Google官方Chrome文档 在此记录一下 Chrome Flags for Tooling Many tools maintain a list of runtime flags for Chrome to configure the
  • CLIP与Chinese-CLIP:多模态预训练模型解读和图文检索体验

    欢迎关注公众号 AICV与前沿 一起学习最新技术吧 欢迎关注公众号 AICV与前沿 一起学习最新技术吧 欢迎关注公众号 AICV与前沿 一起学习最新技术吧 1 CLIP回顾 CLIP是2021年OpenAI提出的基于图文对比学习的多模态预训