clip_en的使用学习

代码分析

import torch
import cn_clip.clip as clip
from PIL import Image
from cn_clip.clip import load_from_name, available_modelsprint("Torch version:", torch.__version__)
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Available models:", available_models())
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device)
cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]
text = clip.tokenize(cls_list).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()from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}")

这段代码演示了如何使用 CLIP(Contrastive Language-Image Pretraining)模型进行图像和文本之间的匹配和相似性计算。特别是使用了中文版本的 CLIP(cn_clip),即支持中文文本的 CLIP 模型。

让我们逐行分析这段代码,理解其功能和原理。

import torch
import cn_clip.clip as clip
from PIL import Image
from cn_clip.clip import load_from_name, available_models
  1. import torch: 导入 PyTorch,这是一个流行的深度学习框架,CLIP 模型依赖于它进行张量计算和模型推理。
  2. import cn_clip.clip as clip: 从 cn_clip 库中导入 CLIP 模型的核心功能,并命名为 clipcn_clip 是 CLIP 的中文版本,支持中文文本输入。
  3. from PIL import Image: 导入 PIL 库中的 Image 模块,用于加载和处理图像。
  4. from cn_clip.clip import load_from_name, available_models: 从 cn_clip.clip 中导入 load_from_name 函数和 available_models 列表。
    • load_from_name 用于加载指定名称的模型。
    • available_models 是一个列表,包含了所有可用的 CLIP 模型名称。
print("Torch version:", torch.__version__)
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Available models:", available_models())
  1. print("Torch version:", torch.__version__): 输出当前 PyTorch 的版本。
  2. device = "cuda" if torch.cuda.is_available() else "cpu": 检查是否有可用的 GPU,如果有,则使用 cuda 设备,否则使用 CPU。
  3. print("Available models:", available_models()): 输出所有可用的 CLIP 模型名称。
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()
  1. model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./'):
    • 通过 load_from_name 函数加载指定的模型(这里是 ViT-B-16),并指定设备(GPU 或 CPU)和下载路径。
    • 返回值 model 是加载的模型,preprocess 是一个预处理函数,用于将图像处理成模型可以接受的格式。
  2. model.eval(): 将模型设置为评估模式。这是一个常见的步骤,尤其是在推理阶段,它禁用了 dropout 和批归一化的训练行为。
image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device)
cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]
text = clip.tokenize(cls_list).to(device)
  1. image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device):
    • 使用 PIL 打开指定路径的图像文件。
    • 使用预处理函数 preprocess 处理图像,使其符合模型的输入要求。
    • unsqueeze(0) 增加一个批次维度,使图像的形状适应模型的输入需求(即批量大小)。
    • 使用 to(device) 将图像数据移动到指定设备(CPU 或 GPU)。
  2. cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]:
    • 定义一个包含几个中文描述词的列表,用于与图像进行匹配。
  3. text = clip.tokenize(cls_list).to(device):
    • 使用 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()
  1. with torch.no_grad()::
    • 使用 torch.no_grad() 上下文管理器,禁用梯度计算,这可以减少内存消耗并加速计算,因为我们只是在进行推理而不是训练。
  2. image_features = model.encode_image(image):
    • 使用模型的 encode_image 方法将图像输入编码为图像特征向量。
  3. text_features = model.encode_text(text):
    • 使用模型的 encode_text 方法将文本输入编码为文本特征向量。
  4. image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True):
    • 对图像和文本的特征向量进行归一化处理。这一步确保特征向量的长度(即欧几里得范数)为1,便于后续的相似性计算。
  5. logits_per_image, logits_per_text = model.get_similarity(image, text):
    • 使用模型的 get_similarity 方法计算图像和文本之间的相似性分数。这些分数是图像特征和文本特征之间的点积。
  6. probs = logits_per_image.softmax(dim=-1).cpu().numpy():
    • 将图像的相似性分数通过 softmax 函数转换为概率分布,表示每个文本描述与图像匹配的概率。
    • 使用 cpu() 将张量移动到 CPU,然后转换为 NumPy 数组以便于进一步处理或打印。
from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}")
  1. from IPython.display import Image, display:
    • IPython.display 模块中导入 Imagedisplay 函数,用于在 Jupyter Notebook 或 IPython 环境中显示图像。
  2. display(Image(filename="data_examples/truck.jpg")):
    • 显示指定路径的图像文件。
  3. for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}"):
    • 遍历文本描述列表 cls_list,打印每个文本描述与图像的匹配概率。

CLIP 和 cn_clip 的区别和联系

  • CLIP: 由 OpenAI 提出的 CLIP 模型(Contrastive Language-Image Pretraining)是一个多模态模型,可以将图像和文本编码到同一个向量空间中,从而能够进行图像与文本之间的相似性匹配。CLIP 主要是用英语训练的,因此更适用于处理英文文本和图像匹配。

  • cn_clip: cn_clip 是 CLIP 的中文版本,专为支持中文文本和图像之间的匹配而训练。它使用了中文语料进行预训练,可以处理和理解中文文本。

两者的联系:

  • 相同的原理:CLIP 和 cn_clip 都基于相同的对比学习原理,将图像和文本映射到相同的向量空间中,并通过最大化正确图像-文本对之间的相似性和最小化错误对之间的相似性来进行训练。
  • 不同的语料:CLIP 使用的是英文语料,而 cn_clip 使用的是中文语料。因此,它们分别在各自的语言领域内表现出色。

代码执行结果

PS E:\study\OPENAI-BASE-ENV> & D:/Python311/python.exe e:/study/OPENAI-BASE-ENV/fine-tuning-lab/web_demo/13_clip_en.py
Torch version: 2.3.0+cu121
Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
Loading vision model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\ViT-B-16.json
Loading text model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\RoBERTa-wwm-ext-base-chinese.json
Model info {'embed_dim': 512, 'image_resolution': 224, 'vision_layers': 12, 'vision_width': 768, 'vision_patch_size': 16, 'vocab_size': 21128, 'text_attention_probs_dropout_prob': 0.1, 'text_hidden_act': 'gelu', 'text_hidden_dropout_prob': 0.1, 'text_hidden_size': 768, 'text_initializer_range': 0.02, 'text_intermediate_size': 3072, 'text_max_position_embeddings': 512, 'text_num_attention_heads': 12, 'text_num_hidden_layers': 12, 'text_type_vocab_size': 2}
D:\Python311\Lib\site-packages\torch\nn\functional.py:5504: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at ..\aten\src\ATen\native\transformers\cuda\sdp_utils.cpp:455.)attn_output = scaled_dot_product_attention(q, k, v, attn_mask, dropout_p, is_causal)
<IPython.core.display.Image object>
狗: 1.3709068298339844e-06
汽车: 0.0012388229370117188
白色皮卡: 0.705078125
火车: 2.6524066925048828e-05
皮卡: 0.2939453125

分析代码执行过程与输出结果

环境和模型信息
Torch version: 2.3.0+cu121
Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
Loading vision model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\ViT-B-16.json
Loading text model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\RoBERTa-wwm-ext-base-chinese.json
  • Torch version: 2.3.0+cu121: 指出使用的 PyTorch 版本是 2.3.0,并且包含了 CUDA 121 支持,这表明模型可以在 GPU 上加速运行。
  • Available models: …: 列出 cn_clip 库中可用的模型名称,这些模型是不同的视觉和文本模型组合,支持不同的应用场景。
  • Loading vision model config…: 加载视觉模型(ViT-B-16)的配置文件,这个文件包含了视觉模型的架构和参数信息。
  • Loading text model config…: 加载文本模型(RoBERTa-wwm-ext-base-chinese)的配置文件,这个文件包含了文本模型的架构和参数信息。
模型结构信息
Model info {'embed_dim': 512, 'image_resolution': 224, 'vision_layers': 12, 'vision_width': 768, 'vision_patch_size': 16, 'vocab_size': 21128, 'text_attention_probs_dropout_prob': 0.1, 'text_hidden_act': 'gelu', 'text_hidden_dropout_prob': 0.1, 'text_hidden_size': 768, 'text_initializer_range': 0.02, 'text_intermediate_size': 3072, 'text_max_position_embeddings': 512, 'text_num_attention_heads': 12, 'text_num_hidden_layers': 12, 'text_type_vocab_size': 2}

这个输出提供了模型的详细配置:

  • embed_dim: 嵌入维度,512 表示图像和文本的特征向量维度是 512。
  • image_resolution: 图像分辨率,224 表示输入图像的尺寸为 224x224 像素。
  • vision_layers: 视觉模型的层数,这里是 12 层。
  • vision_width: 视觉模型每层的宽度,即每层的通道数为 768。
  • vision_patch_size: 每个图像块的大小,16 表示图像被分割成 16x16 的小块。
  • vocab_size: 文本模型的词汇表大小,21128 表示可以处理的不同词汇的数量。
  • **text_*: 文本模型的其他参数,如注意力概率的 dropout 率、隐藏层的激活函数(gelu)、最大位置嵌入数(512)等。
  • text_num_hidden_layers: 文本模型的隐藏层数,12 层。
警告信息
D:\Python311\Lib\site-packages\torch\nn\functional.py:5504: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at ..\aten\src\ATen\native\transformers\cuda\sdp_utils.cpp:455.)attn_output = scaled_dot_product_attention(q, k, v, attn_mask, dropout_p, is_causal)
  • UserWarning: 这是一个警告,表明当前的 PyTorch 版本没有使用 “flash attention” 优化。这种优化可以加速自注意力机制的计算,但在没有这种优化的情况下,模型依然可以正常工作,只是性能上可能会稍微差一点。
显示图像
<IPython.core.display.Image object>
  • 这是在代码中使用 display(Image(filename="data_examples/truck.jpg")) 语句显示的图像。这一步只是展示输入图像,帮助我们更直观地理解后续的文本与图像匹配结果。
匹配结果输出
狗: 1.3709068298339844e-06
汽车: 0.0012388229370117188
白色皮卡: 0.705078125
火车: 2.6524066925048828e-05
皮卡: 0.2939453125

这些结果是模型计算出每个文本标签与输入图像的匹配概率。解释这些概率的含义可以帮助我们理解模型的工作原理:

  1. 狗: 1.3709068298339844e-06:

    • 非常低的概率,表明模型认为图像与“狗”几乎没有匹配度。
  2. 汽车: 0.0012388229370117188:

    • 较低的概率,表明图像与“汽车”不太匹配,尽管比“狗”略高。
  3. 白色皮卡: 0.705078125:

    • 很高的概率,表明图像与“白色皮卡”有很高的匹配度。由于图像实际上是一辆白色的卡车,这与这个标签非常吻合。
  4. 火车: 2.6524066925048828e-05:

    • 很低的概率,表明图像与“火车”几乎没有匹配度。
  5. 皮卡: 0.2939453125:

    • 适中的概率,表明图像与“皮卡”有一定的匹配度。由于“皮卡”也可以指某种卡车,尽管不如“白色皮卡”那么精确,这个结果是合理的。

原理解释

  1. 特征提取与匹配:

    • CLIP 模型通过视觉模型(ViT-B-16)将输入图像编码为特征向量,并通过文本模型(基于 RoBERTa 的中文模型)将文本描述编码为特征向量。
    • 这些特征向量被映射到一个共享的向量空间中,使得相似的图像和文本特征向量在空间中靠得更近。
  2. 相似性计算:

    • 通过计算图像特征向量与每个文本特征向量之间的点积,得到它们的相似性分数(logits)。
    • 然后,这些分数通过 softmax 函数转换为概率,表示每个文本与图像匹配的概率。
  3. 归一化处理:

    • 在计算相似性之前,对图像和文本的特征向量进行归一化,使得每个向量的长度为1。这有助于稳定计算,并使得点积的结果直接反映向量之间的角度相似性。

clipcn_clip 的区别与联系

  • clip: 是 OpenAI 提供的基于英语训练的多模态模型,用于图像和英文文本之间的匹配。
  • cn_clip: 是 clip 的中文版本,针对中文文本进行了调整和优化,使用了中文语料进行预训练,更适合处理中文的多模态任务。

两者的核心思想和模型架构相似,主要区别在于训练语料和处理的语言不同。对于中文应用,cn_clip 提供了更好的性能和支持。

使用场景

这些模型可以广泛应用于:

  • 图片搜索与推荐: 根据文字描述找到最匹配的图像,或根据图像找到相关的描述。
  • 自动图像标注: 为图像生成准确的文字标签。
  • 多模态问答系统: 根据图像和文本进行智能问答。
  • 电子商务: 根据用户输入的文本描述推荐合适的产品图像。

通过上述代码和结果的分析,我们可以看出,CLIP 模型在处理多模态任务时具有强大的功能和灵活性,尤其是在不同语言环境下,如中文,通过 cn_clip 的支持,可以更好地满足特定语言的应用需求。

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

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

相关文章

第 10 章 监控系统 | 实战案例 - Nginx 监控

👉 本文目标:为 Nginx 安装 nginx-prometheus-exporter,实现对 Nginx 的监控。 👀 本文内容: 安装 Nginx Prometheus Exporter,暴露 Nginx 指标配置 Prometheus 抓取 Nginx Prometheus Exporter 暴露的指标数据【配置 Recording Rule,便于缓存/加速 Dashboard 频繁访问…

深度学习推理显卡设置

深度学习推理显卡设置 进入NVIDIA控制面板&#xff0c;选择 “管理3D设置”设置 "低延时模式"为 "“超高”"设置 “电源管理模式” 为 “最高性能优先” 使用锁频来获得稳定的推理 法一&#xff1a;命令行操作 以管理员身份打开CMD查看GPU核心可用频率&…

【如何使用python获取excel中sheet页的样式】

如何使用python获取excel中sheet页的样式 要获取Excel中sheet页的样式&#xff0c;特别是单元格的样式&#xff0c;如字体、颜色、边框等&#xff0c;你可以使用openpyxl库&#xff0c;但需要深入一些底层的操作&#xff0c;因为openpyxl的主要API不直接暴露这些样式信息。 以…

云计算 | (四)基本云安全

文章目录 📚基本云安全🐇云安全背景🐇基本术语和概念⭐️风险(risk)⭐️安全需求🐇威胁作用者⭐️威胁作用者(threat agent)⭐️匿名攻击者(anonymous attacker)⭐️恶意服务作用者(malicious service agent)⭐️授信的攻击者(trusted attacker)⭐️恶意的内部人员(mal…

Web自动化测试框架(基础篇)--Selenium WebDriver工作原理和环境搭建

文章目录 引言一、Selenium WebDriver简介二、Selenium WebDriver工作原理2.1 架构概述2.2 通信机制2.3 支持的浏览器 三、环境搭建3.1 安装Python3.2 安装pip3.3 安装Selenium3.4 下载WebDriver 四、编写第一个测试脚本4.1 导入Selenium库4.2 启动WebDriver4.3 打开网页4.4 执…

有趣且重要的JS知识合集(22)树相关的算法

0、举例&#xff1a;树形结构原始数据 1、序列化树形结构 /*** 平铺序列化树形结构* param tree 树形结构* param result 转化后一维数组* returns Array<TreeNode>*/ export function flattenTree(tree, result []) {if (tree.length 0) {return result}for (const …

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景&#xff1a; 业务需要将一个pdf文件展示在前端显示&#xff0c;但是基于各种原因&#xff0c;放弃了h5使用插件展示 原因有多个&#xff0c;文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效果…

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…

力扣每日一题 6/17 枚举+双指针

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 522.最长特殊序列II【中等】 题目&#xff1a; 给定字符串列表 strs &…

【Ubuntu通用压力测试】Ubuntu16.04 CPU压力测试

使用 stress 对CPU进行压力测试 我也是一个ubuntu初学者&#xff0c;分享是Linux的优良美德。写的不好请大佬不要喷&#xff0c;多谢支持。 sudo apt-get update 日常先更新再安装东西不容易出错 sudo apt-get upgrade -y 继续升级一波 sudo apt-get install -y linux-tools…

Stable Diffusion文生图模型训练入门实战(完整代码)

Stable Diffusion 1.5&#xff08;SD1.5&#xff09;是由Stability AI在2022年8月22日开源的文生图模型&#xff0c;是SD最经典也是社区最活跃的模型之一。 以SD1.5作为预训练模型&#xff0c;在火影忍者数据集上微调一个火影风格的文生图模型&#xff08;非Lora方式&#xff…

Python | Leetcode Python题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; class Solution:def findPeakElement(self, nums: List[int]) -> int:n len(nums)# 辅助函数&#xff0c;输入下标 i&#xff0c;返回 nums[i] 的值# 方便处理 nums[-1] 以及 nums[n] 的边界情况def get(i: int) -> int:if i -1 or…

数实融合创新发展 隆道分享企业级AI应用

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着各行各业&#xff0c;重塑企业的运营管理模式和创新发展路径。6月14日&#xff0c;数实融合全国行&#xff08;潍坊站&#xff09;暨 AI 企业级应用专题会在山东潍坊成功召开。…

STM32单片机DMA存储器详解

文章目录 1. DMA概述 2. 存储器映像 3. DMA框架图 4. DMA请求 5. 数据宽度与对齐 6. DMA数据转运 7. ADC扫描模式和DMA 8. 代码示例 1. DMA概述 DMA&#xff08;Direct Memory Access&#xff09;可以直接访问STM32内部的存储器&#xff0c;DMA是一种技术&#xff0c;…

【随性】学习感想

这几天的作息时间&#xff1a;13:00-23:00&#xff0c;稍显疲惫。为了继续调整作战&#xff0c;明天改变生物钟&#xff0c;尝试新作息时间&#xff1a;9:00-20:00&#xff01;最近已经学完了C与QT&#xff0c;又重回Linux的怀抱&#xff0c;以下为适应Linux下C编程的代码&…

【 ARMv8/ARMv9 硬件加速系列 3.5.1 -- SVE 谓词寄存器有多少位?】

文章目录 SVE 谓词寄存器(predicate registers)简介SVE 谓词寄存器的位数SVE 谓词寄存器对向量寄存器的控制SVE 谓词寄存器位数计算SVE 谓词寄存器小结SVE 谓词寄存器(predicate registers)简介 ARMv9的Scalable Vector Extension (SVE) 引入了谓词寄存器(Predicate Register…

打造工业操作系统开源开放体系

我国制造业具有细分行业、领域众多&#xff0c;产品丰富&#xff0c;制造模式多样等特点&#xff0c;围绕以工业操作系统为核心的工业软件赋能体系建设&#xff0c;离不开平台运营商、工业软件开发商、系统服务商、科研机构、工业企业等多方联合参与。聚众同行、聚力创新&#…

【数据库系统概论复习】关系数据库与关系代数笔记

文章目录 基本概念数据库基本概念关系数据结构完整性约束 关系代数关系代数练习课堂练习 语法树 基本概念 数据库基本概念 DB 数据库&#xff0c; 为了存用户的各种数据&#xff0c;我们要建很多关系&#xff08;二维表&#xff09;&#xff0c;所以把相关的关系&#xff08;二…

创建型模式--抽象工厂模式

产品族创建–抽象工厂模式 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题。 但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品族”,…

Java基础16(集合 List)

目录 一、什么是集合&#xff1f; 二、集合接口 三、List集合 1. ArrayList容器类 1.1 常用方法 1.1.1 增加 1.1.2 查找 int size() E get(int index) int indexOf(Object c) boolean contains(Object c) boolean isEmpty() List SubList(int fromindex,i…