当前OpenAI提出的CLIP是AI领域内最火热的多模态预训练模型,简单的图文双塔结构让多模态表征学习变得异常简单。此前CLIP只有官方英文版本,如果想在中文领域尤其是业务当中使用这种强大的表征模型,需要非常麻烦的翻译工作。近期达摩院提出中文版本CLIP,Chinese CLIP系列,在ModelScope和Github均已开源,并且代码也已经并入Huggingface Transformers,在检索任务上效果非常好。这里就根据Chinese CLIP官方介绍来做个简单的快速上手指南。

Github: GitHub - OFA-Sys/Chinese-CLIP: Chinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.

ArXiv: https://arxiv.org/abs/2211.01335

中文CLIP简介

Chinese CLIP作为CLIP的中文版,几乎没有做太多复杂的模型改进,主要就是将预训练数据替换成大约2亿规模的主要以中文原生数据为主的图文对数据。而针对CLIP训练成本高训练难度大的问题,Chinese CLIP采用了两阶段训练的方案:

图文双塔分别用已有的预训练模型初始化,分别为CLIP的图像塔和中文RoBERTa。在第一阶段训练中,图像侧参数冻结,让文本塔通过对比学习使其表征空间对齐CLIP的图像表征空间,而在第二阶段,模型在通过对比微调学习中文原生的图像和文本数据。

快速使用

在上手代码前,我看到官方还提供了检索和分类两种Demo,其中检索的Demo在ModelScope上,可以看到检索回来的结果基本是符合文字描述的,比如“戴眼镜的猫”这种:

Huggingface上有更加简洁的零样本分类的demo:

精准识别梅老板没啥问题(当然那个马大头属实是来搞笑的了……)

看了一下感觉官方给的API还是蛮简单的,首先先安装中文CLIP,可以直接安装pip包或者拉代码下来安装也行:

# 通过pip安装
pip install cn_clip# 或者从源代码安装
cd Chinese-CLIP
pip install -e .

随后就是几行代码就可以快速产出特征,做个简单的零样本分类只需要把预先准备好的标签传入即可:

import torch
from PIL import Imageimport 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]]

代码的整体逻辑也都比较简单,首先可以看到可用的模型规模还是比较多的,ViT-H属实有点过大,但是ViT-B、ViT-L还是可以接受,ResNet-50就最良心,不过相对来说它的效果也会差些。在这里使用使用“load_from_name”这个接口,传入模型类型就可以完成模型载入的工作,然后使用preprocess就可以对图像做好预处理,文本就传入自己准备好的分类标签,放到一个列表里,传给clip.tokenize去完成接下来的工作。

产出特征的代码也比较简洁易懂,encode_image和encode_text分别负责产出图像和文本特征,随后完成归一化以后,用get_similarity的接口就可以算出图像文本的相似度,从而得出图像的分类概率。可以看到例子当中皮卡丘的图片在皮卡丘这一标签的分类概率也达到了94%,还是比较精准的。

除了官方API,ModelScope和Huggingface Transformers上的使用方法也都比较类似,在这里就不赘述了。大家可以自己去查看对应链接:

ModelScope 魔搭社区

https://huggingface.co/OFA-Sys/chinese-clip-vit-base-patch16

小结

CLIP对于多模态用处还是比较大的,中文CLIP出现之后中文领域的多模态做起来也会容易很多,可以在检索、分类等众多场景发挥用户。本文简单介绍了官方提供的API的使用方法,后续会再继续补充文档上更详细的检索任务上的下游微调的方法。

中文CLIP快速上手指南相关推荐

  1. Eclipse快速上手指南

    本指南介绍到的软件可能已经有更新,希望大家不要局限于本文中的版本号 Eclipse是一款非常优秀的开源IDE,非常适合Java开发,由于支持插件技术,受到了越来越多的开发者的欢迎.最新的Eclipse ...

  2. 分布式作业 Elastic-Job 快速上手指南

    转载自 分布式作业 Elastic-Job 快速上手指南 Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任 ...

  3. TortoiseGit + GitHub 快速上手指南

    TortoiseGit + GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版,它很好的实现了与windows资源管理器的融合,使用界面与Tor ...

  4. raptor累乘流程图_Markdown快速上手指南

    Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...

  5. 最新课程 | openGauss 快速上手指南课程即将开课

    点击蓝字|关注我们 2020 年 7 月 1 日,openGauss 数据库源代码正式开放,并成立了 openGauss 开源社区.恩墨学院与 openGauss 开源社区达成合作,为了推动社区技术生 ...

  6. NexentaStor iSCSI/ NAS 存储服务器软件图解教程(3)——NMV快速上手指南Part2

    NexentaStoriSCSI/NAS 存储服务器软件图解教程(3) Nexenta Management View (NMV)/*NexentaStor Web 管理界面*/快速上手指南Part ...

  7. HTAP 快速上手指南

    本指南介绍如何快速上手体验 TiDB 的一站式混合型在线事务与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 功能. 注意 ...

  8. Wwise 快速上手指南: 程序员篇(v2016.1)

    Wwise 快速上手指南: 程序员篇(v2016.1) https://gameinstitute.qq.com/community/detail/107700 Wwise 快速上手指南: 程序员篇 ...

  9. ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介

    成就更好的自己 ROS无人机快速上手指南旨在于让使用此无人机开发平台的比赛参赛人员,算法设计人员,无人机爱好者更加快速的了解底层控制运作原理,从而缩短开发周期,减少掉坑次数,快速验证算法的速度,不用在 ...

最新文章

  1. 招聘|字节跳动招计算机视觉方向算法实习生
  2. 3.5.1 信道划分介质访问控制
  3. 力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法
  4. matlab用lism求零输入响应,信号与系统matlab课后作业_北京交通大学讲解.docx
  5. linux ubuntu文件浏览器如何显示隐藏文件?(快捷键ctrl+h)
  6. eclipse中护眼色设置
  7. java arraylist 源代码_java中ArrayList的源代码是什么
  8. phalanger php compiler,phalanger-php的.net编译器 _php技巧
  9. 容器编排技术 -- Pod 安全策略
  10. 关于vue的语法规则检测报错问题
  11. adt 22.6出现的问题
  12. div 夸站点加载html,使用jQuery加载html页面到指定的div实现方法
  13. c++反转字符,算法优化与实现
  14. js 表单打开新窗口
  15. linux ps3手柄驱动,ps3 DS3 手柄驱动
  16. ryu实例---Hub
  17. 利用scrapy爬取58同城租房信息
  18. 解决苹果手机滑动卡顿
  19. python_pygame.外星人入侵
  20. Java开发人员幽默外号,姓李的幽默外号 - 经典语录大全

热门文章

  1. 计算机教学研修心得英语,英语网络研修心得体会
  2. shell迷你版监控脚本
  3. 洛谷刷题P5709苹果与兔子 P5707 上学迟到
  4. 中国硬质合金市场需求调研与前景预测分析报告2022年版
  5. android如何复制链接,小红书复制链接怎么打开_小红书复制链接打开方法_攻略
  6. forward reference extends over definition of value movieRecs 和 Cannot resolve symbol XXX 解决方法
  7. 赋能新一代物联网的LoRaWAN技术
  8. 计算器c语言代码中缀表达式,C语言实现中缀表达式求值,计算器的简单实现
  9. 001word行距与字体大小
  10. 一条SQL语句统计总数及各状态数