• openai/CLIP 代码样例报告


    先阅读详解CLIP (二) | 简易使用CLIP-PyTorch预训练模型进行图像预测,了解CLIP的工作原理,是基于计算图像嵌入与文本嵌入距离的。

    CLIP样例

    先将样例图保存为CLIP.png,放置在项目目录下。
    保存该图

    安装环境依赖

    先将CLIP项目所需的环境依赖安装好

    $ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0 # pytorch和cuda版本仅为示例
    $ pip install ftfy regex tqdm
    $ pip install git+https://github.com/openai/CLIP.git
    
    • 1
    • 2
    • 3
    1. 第一行是安装pytorch、torchvision 、cudatoolkit,已经安装就不必重复安装,版本不一样没关系,楼主1.10.2顺利运行。
    2. 第二行安装依赖ftfy、regex、tqdm,照着运行没报错就好
    3. 第三行安装openai/CLIP,访问git不顺利可能要使用科技

    如何查看本地安装的pytorch版本

    (torch) C:\Users\Administrator>conda list pytorch
    # packages in environment at E:\ProgramFiles\anaconda\envs\torch:
    #
    # Name                    Version                   Build  Channel
    pytorch                   1.11.0          py3.9_cuda11.3_cudnn8_0    pytorch
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行1

    安装好环境后,运行如下代码:

    import torch
    import clip
    from PIL import Image
    
    # 来自https://zhuanlan.zhihu.com/p/524247403
    # 需先按照教程安装环境依赖
    
    device = "cuda" if torch.cuda.is_available() else "cpu"
    # download to path "~/.cache/clip" by default
    model, preprocess = clip.load("ViT-B/32", device=device)
    
    # CLIP.png为本文中图一,即CLIP的流程图
    image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
    # 将这三句话向量化
    text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)
    
    # image.shape:  torch.Size([1, 3, 224, 224])
    print("image.shape: ", image.shape)
    # text.shape:  torch.Size([3, 77])
    print("text.shape: ", text.shape)
    
    with torch.no_grad():
        # image_features = model.encode_image(image) # 将图片进行编码
        # text_features = model.encode_text(text)    # 将文本进行编码
    
        logits_per_image, logits_per_text = model(image, text)
        # logits_per_image.shape torch.Size([1, 3])
        print("logits_per_image.shape", logits_per_image.shape)
        # logits_per_text.shape torch.Size([3, 1])
        print("logits_per_text.shape", logits_per_text.shape)
    
        probs = logits_per_image.softmax(dim=-1).cpu().numpy()
    
    print("Label probs:", probs)  # prints: [[0.9927937  0.00421068 0.00299572]] # 图片"CLIP.png"对应"a diagram"的概率为0.9927937
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    第一次运行时,会下载模型参数到"~/.cache/clip",详见clip.load注释里的download_root参数,

    代码的输出解释如下:

    • 输出image.shape: torch.Size([1, 3, 224, 224]),是因为有一张图片,大小被缩放为224*224,彩色图是3通道
    • 输出text.shape: torch.Size([3, 77]),是因为有3个单词,每个词向量长度为77
    • 输出logits_per_image.shape torch.Size([1, 3]),代表了1张图片嵌入与3个词向量的距离。
    • 输出logits_per_text.shape torch.Size([3, 1]),代表了3个词向量各自与这1张图片嵌入的距离。与前一条输出的区别只在于主语的不同。

    运行2

    修改代码运行如下片段

    with torch.no_grad():
    	# 将图片和文本进行编码
    	image_features = model.encode_image(image)
    	text_features = model.encode_text(text)
    	# image_features.shape torch.Size([1, 512])
    	# text_features.shape torch.Size([3, 512])
    	print("image_features.shape", image_features.shape)
    	print("text_features.shape", text_features.shape)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可见输出如下:

    • 输出image_features.shape torch.Size([1, 512]),因为有一张图片,其长度为512。
    • 输出text_features.shape torch.Size([3, 512]),因为有3个词向量,其长度为512。

    可见,CLIP能够将图片和词语都转化为512长度的向量,从而能相互计算cosine距离。

  • 相关阅读:
    43特征01——特征值特征向量: 特征多项式、特殊矩阵 的特征值与特征向量、Hamilton-Cayley 定理
    二十一、Java 继承
    【C语言】二分查找(含图解)
    保姆级 -- Zookeeper超详解
    golang validator 提示消息本地化(中英文案例)
    Spring Session中存放于Redis中的PRINCIPAL_NAME_INDEX_NAME没有设置过期时间
    Go微服务框架go-kratos实战04:kratos中服务注册和服务发现的使用
    Polygon zkEVM zkASM 与 以太坊虚拟机opcode 对应集合
    位运算符 &、|、^ 的应用
    算法 —— 前缀和
  • 原文地址:https://blog.csdn.net/duoyasong5907/article/details/127644690