clip_en的使用学习

2024-06-18 08:29
文章标签 学习 使用 clip en

本文主要是介绍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 的支持,可以更好地满足特定语言的应用需求。

这篇关于clip_en的使用学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071766

相关文章

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核