CLIP模型入门

简介

CLIP(Contrastive Language-Image Pre-Training)是OpenAI在2021年初发布的多模态预训练神经网络模型,用于匹配图像和文本。该模型的关键创新之一是将图像和文本映射到统一的向量空间,通过对比学习的方式进行预训练,使得模型能够直接在向量空间中计算图像和文本之间的相似性,无需额外的中间表示。
CLIP模型训练分为三个阶段:

  • 对比式预训练阶段:使用图像-文本对进行对比学习训练;
  • 从标签文本创建数据集分类器:提取预测类别文本特征;
  • 用于零样本预测:进行零样本推理预测。
    在这里插入图片描述
    CLIP的设计灵感在于将图像和文本映射到共享的向量空间,使得模型能够理解它们之间的语义关系。这种共享向量空间使得CLIP实现了无监督的联合学习,可用于各种视觉和语言任务。
    在训练完成后,CLIP可用于多种任务,如分类图像、生成文本描述、检索图像等。它具有出色的zero-shot学习能力,只需简单的线性分类器(Linear Probe)或最近邻搜索(KNN)即可完成任务,无需额外训练或微调。

简单使用

使用CLIP模型可以很方便地实现零样本图片分类(Zero Shot Image Classification),广泛效果好,且图片类别(labels)可以自由定义。从这种意义上来讲,它改变了以前CV界关于图片分类的范式,是真正意义上的创新。

应用入门

以下是使用Hugging Face来使用CLIP模型实现零样本图片分类的Python代码。

from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModelmodel_path = "/data-ai/usr/lmj/models/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_path)
processor = CLIPProcessor.from_pretrained(model_path)
url = "https://static.jixieshi.cn/upload/goods/2022042210295380594_BIG.png"
image = Image.open(requests.get(url, stream=True).raw)
image

在这里插入图片描述

text = ["a photo of a computer", "a photo of a mouse", "a photo of a keyboard", "a photo of a cellphone"]
inputs = processor(text=text, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
logits_per_image
tensor([[23.6426, 20.7598, 28.2721, 17.9425]], grad_fn=<TBackward0>)
probs = logits_per_image.softmax(dim=1)
probs.detach().numpy().tolist()
[[0.009659518487751484,0.000540732522495091,0.9897673726081848,3.2318232115358114e-05]]

可视化应用

以下是使用Gradio工具来构建零样本图片分类的Python代码:

# -*- coding: utf-8 -*-
import pandas as pd
import gradio as gr
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModelmodel_path = "./models/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_path)
processor = CLIPProcessor.from_pretrained(model_path)
print("load model...")def image_predict(image_url, prompts):image = Image.open(requests.get(image_url, stream=True).raw)labels = prompts.split(',')inputs = processor(text=labels, images=image, return_tensors="pt", padding=True)outputs = model(**inputs)logits_per_image = outputs.logits_per_imageprobs = logits_per_image.softmax(dim=1).detach().numpy().tolist()[0]return image, gr.BarPlot(value=pd.DataFrame({"label": labels,"prob": probs,}),x="label",y="prob",width=400,color='label',title="Zero Shot Image Classification",tooltip=["label", "prob"],y_lim=[0, 1])if __name__ == '__main__':with gr.Blocks() as demo:with gr.Row():with gr.Column():image_urls = gr.TextArea(lines=1, placeholder="Enter image urls", label="Images")prompt = gr.TextArea(lines=3, placeholder="Enter labels, separated by comma", label="Labels")with gr.Column():search_image = gr.Image(type='pil')plot = gr.BarPlot()submit = gr.Button("Classify")submit.click(fn=image_predict,inputs=[image_urls, prompt],outputs=[search_image, plot])demo.launch(server_name="0.0.0.0", server_port=50073)

效果图如下:
在这里插入图片描述
在这里插入图片描述

参考

CLIP:多模态领域革命者:https://bbs.huaweicloud.com/blogs/371319
CLIP in Hugging Face:https://huggingface.co/docs/transformers/model_doc/clip
openai/clip-vit-base-patch32 · Hugging Face
OpenAI Clip:https://openai.com/research/cli

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为eNSP网络模拟器

华为eNSP网络模拟器安装详细教程&#xff08;2024&#xff09; 华为eNSP网络模拟器安装详细教程&#xff08;2024&#xff09;_ensp安装-CSDN博客 eNSP设备基础配置 eNSP设备基础配置_ensp中路由器交换机pc机配置ip地址-CSDN博客 ENSP学习 ENSP学习-CSDN博客 【华为eNSP模拟器】…

运用OSI模型提升排错能力

1. OSI模型有什么实际的应用价值&#xff1f; 2. 二层和三层网络的区别和应用&#xff1b; 3. 如何通过OSI模型提升组网排错能力&#xff1f; -- OSI - 开放式系统互联 - 一个互联标准 - 从软件和硬件 定义标准 - 不同厂商的设备 研发的技术 - 具备兼容性 -- O…

知识图谱入门到实战之1.知识图谱基础

知识图谱基础 1.为什么要用知识图谱2.知识图谱的前世今生&#xff08;1&#xff09;发展脉络&#xff08;2&#xff09;发展阶段&#xff08;3&#xff09;知识图谱定义&#xff08;4&#xff09;知识类型&#xff08;5&#xff09;常见的开源知识图谱 3.知识图谱的相关技术&am…

微服务learning

一、部分网址 有道云笔记 (youdao.com) Spring Cloud Alibaba| ProcessOn免费在线作图,在线流程图,在线思维导图 系统由单体架构到微服务架构到底是如何演进的&#xff1f;-腾讯云开发者社区-腾讯云 (tencent.com) 阿里限流神器Sentinel夺命连环 17 问&#xff1f; - 掘金 …

拥有一台阿里云服务器可以做什么?

阿里云ECS云服务器可以用来做什么&#xff1f;云服务器可以用来搭建网站、爬虫、邮件服务器、接口服务器、个人博客、企业官网、数据库应用、大数据计算、AI人工智能、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云服务器可以…

2024/4/5—力扣—下一个排列

代码实现&#xff1a; 思路&#xff1a;两遍扫描 void swap(int *a, int *b) {int t *a;*a *b;*b t; }void reverse(int *nums, int l, int r) {while (l < r) {swap(nums l, nums r);l;r--;} }void nextPermutation(int *nums, int numsSize) {int i numsSize - 2;wh…

陆面、生态、水文模拟与多源遥感数据同化

原文链接&#xff1a;陆面、生态、水文模拟与多源遥感数据同化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601198&idx6&sn51b9b26b75c9df1f11dcb9a187878261&chksmfa820dc9cdf584df9ac3b997c767d63fef263d79d30238a6523db94f68aec621e1f91df85f6…

算法-日期问题

算法-日期问题 1.判断是否闰年 int is_leap(int y) {if((y%4000)||(y%40&&y%100!0)){return 1;}return 0; }2.每个月的天数 const int months[]{0,31,28,31,30,31,30,31,31,30,31,30,31};3.计算当前年当前月的天数 int get_month_days(int year,int month) {int re…

一位来自河南农村,大学前从未接触电脑的大二学生

怎么说呢&#xff0c;在大学前从未接触过编程&#xff0c;总以为编程是特别高大上的东西&#xff08;现在依然以为编程是高大上的东西哈哈哈&#xff09;&#xff0c;父母借钱凑了一台2800的联想笔记本电脑&#xff08;说实话看到室友七八千的电脑玩游戏真羡慕&#xff09;&…

LANG 和 LC_ALL两者的区别

LANG 和 LC_ALL 都是环境变量&#xff0c;用于设置系统的语言环境。它们的区别如下&#xff1a; LANG 环境变量&#xff1a; LANG 是 Linux 系统中定义的最基本的语言环境变量。它用于设置默认的区域设置&#xff0c;包括语言、字符集和其他本地化设置。当系统需要在多个环境变…

Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer

一、前言 记录时间 [2024-4-10] 前置文章&#xff1a; Docker学习笔记&#xff08;一&#xff09;&#xff1a;入门篇&#xff0c;Docker概述、基本组成等&#xff0c;对Docker有一个初步的认识 Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&…

C++ 解引用与函数基础:内存地址、调用方法及声明

C 解引用 获取内存地址和值 在上一页的示例中&#xff0c;我们使用了指针变量来获取变量的内存地址&#xff08;与引用运算符 & 一起使用&#xff09;。但是&#xff0c;你也可以使用指针来获取变量的值&#xff0c;这可以通过使用 * 运算符&#xff08;解引用运算符&…

Latex中todonotes超出页面范围及其他参数说明

解决方案为 \usepackage{todonotes} \setlength{\marginparwidth}{2.25cm} % 设置边注宽度&#xff0c;否则todo会超出页面范围在使用todo时&#xff0c;还可以进一步设置行距和字体大小。 {\linespread{1.0} \todo[size\small]{这是一个todo}} 在 LaTeX 中&#xff0c;有一系…

库、框架、脚手架和IDE一文讲明白

在区分上面几个问题前&#xff0c;咱们先看看几个疑问。 一、常见问题汇总 js css直接复制到服务器 然后引用不就行了么&#xff1f; 为什么还需要安装&#xff1f; 引入js不就是引入了框架了吗&#xff1f;框架就是js&#xff1f; 脚手架和框架都有架&#xff0c;是不是一…

前端js基础知识(八股文大全)

一、js的数据类型 值类型(基本类型)&#xff1a;数字(Number)、字符串&#xff08;String&#xff09;、布尔(Boolean)、对空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol,大数值类型(BigInt) 引用数据类型&#xff1a;对象(Object)、数组…

Qt | 对象树与生命期(对象的创建、销毁、擦查找)

一、组合模式与对象树 1、组合模式指的是把类的对象组织成树形结构,这种树形结构也称为对象树,Qt 使用对象树来管理 QObject 及其子类的对象。注意:这里是指的类的对象而不是类。把类组织成树形结构只需使用简单的继承机制便可实现。 2、使用组合模式的主要作用是可以通过…

代码随想录算法训练营第三十七天| 738.单调递增的数字,968.监控二叉树,总结

题目与题解 参考资料&#xff1a;贪心总结 738.单调递增的数字 题目链接&#xff1a;738.单调递增的数字 代码随想录题解&#xff1a;738.单调递增的数字 视频讲解&#xff1a;贪心算法&#xff0c;思路不难想&#xff0c;但代码不好写&#xff01;LeetCode:738.单调自增的数字…

Docker安装Oracle数据库 【转载】

Docker安装Oracle数据 alter user system identified by abc; --修改system用户的密码

JVM调优工具详解-jps、jmap、jstat、jstack

jps 用于查看相关java线程的相关信息 选项作用-q仅显示进程 ID&#xff0c;而不显示类名或 JAR 文件的路径-m显示传递给主类的参数-l显示完整的主类名或 JAR 文件的路径-v显示传递给 Java 虚拟机的参数 jmap 此命令用来查看内存信息&#xff0c;实例个数以及占内存大小 jmap…

IT技术人员必看:什么是业务?何为业务架构?

在技术型的组织里&#xff0c;好多Leader能脱颖而出&#xff0c;除了得有扎实的技术底子&#xff0c;对业务的熟悉和理解也相当重要。尤其在像阿里那样的公司&#xff0c;P7以上的技术人员要想升职&#xff0c;深度理解业务就特别关键。而且&#xff0c;级别越高&#xff0c;对…