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.hqwc.cn/news/601404.html

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

相关文章

如何给MySQL数据库的所有表统一加上字段

在开发过程中&#xff0c;有时候慢慢的建了很多数据库表&#xff0c;但是后来发现需要统一增加某些字段的时候&#xff0c;可以通过alter语句 ALTER TABLE 表名 ADD 列名 数据类型;比如我要给t_user表增加gmt_create与gmt_modified字段&#xff0c;用作记录新增记录时间与更新…

基于支持 GPT 的服务的初创公司

Kafkai&#xff1a;多语言长篇内容生成&#xff0c;AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现&#xff0c;技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势&#xff0c;而是一种趋势。 它已成为科技行业的基石&#xff0c…

做海外问卷调查有什么技巧和方法?纯干货讲解

做海外问卷调查无外乎几个步骤&#xff1a;选国家、做人设、测题目、刷题目。每个步骤都有一定的技巧&#xff0c;但是它的技巧成分不是很明显。 国家的选择一般以发达国家为主&#xff0c;国家越发达问卷的数量越多&#xff0c;正常白天做题主流国家选择&#xff1a;新加坡、…

【Java EE】Spring请求如何传递参数详解

文章目录 &#x1f38d;传递单个参数&#x1f334;传递多个参数&#x1f340;传递对象&#x1f384;后端参数重命名&#xff08;后端参数映射&#xff09;&#x1f332;传递数组&#x1f38d;传递集合&#x1f334;传递JSON数据&#x1f338;JSON概念&#x1f338;JSON的语法&a…

2024年阿里云优惠券(代金券)在哪里领取?

阿里云作为国内领先的云计算服务提供商&#xff0c;不仅提供了稳定、高效的云服务&#xff0c;还时常推出各种优惠活动&#xff0c;以此来吸引用户上云。其中&#xff0c;阿里云优惠券就是一种常见的优惠方式。那么&#xff0c;在2024年&#xff0c;我们该如何领取阿里云优惠券…

动态规划:背包问题合集

01背包 定义dp[i][j]&#xff1a;在前i件物品中选出若干件&#xff0c;放入容量为j的背包&#xff0c;能获得的最大价值。 考虑第i件物品拿还是不拿。讨论c[i]与背包容量的关系&#xff1a; &#xff08;1&#xff09;j < c[i] 时&#xff0c;背包容量为j&#xff0c;而第…

基于java+springboot+vue实现的教学辅助系统(文末源码+Lw)23-225

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

LLM-base版本和chat版本的比较

突然想到了这个问题&#xff0c;网上搜集了一些资料&#xff0c;自己也总结一下 首先放一张llama2论文当中的图&#xff0c;可以很直观的看到区别 面试回答版 问题&#xff1a; 大语言模型base版和chat版的区别是什么&#xff1f; 回答&#xff1a; base版本更适合文本补全…

TechTool Pro for Mac v19.0.3中文激活版 硬件监测和系统维护工具

TechTool Pro for Mac是一款专为Mac用户设计的强大系统维护和故障排除工具。它凭借全面的功能、高效的性能以及友好的操作界面&#xff0c;赢得了广大用户的信赖和好评。 软件下载&#xff1a;TechTool Pro for Mac v19.0.3中文激活版 作为一款专业的磁盘和系统维护工具&#x…

huawei 华为交换机 配置 VLAN 聚合示例

组网需求 某公司拥有多个部门且位于同一网段&#xff0c;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN 中&#xff0c;如 图 5-7 所示&#xff0c; VLAN2 和 VLAN3 属于不同部门。各部门均有访问Internet需求&#xff0c;同时由于业务需要&#xff0c;不同部…

Docker 安装RabbitMQ以及使用客户端图形化界面

目录 一、点击进入docker 镜像仓库 1.1 直接在官网里 搜索 rabbitmq 1.2 在标签里 直接搜索3.10-management 因为这个标签包含用户操作界面 二、启动docker 2.1 首先拉取镜像&#xff1a; 2.2 Docker运行&#xff0c;并设置开机自启动 三、访问用户操作界面 一、点击进入…