文章目录
前言
多模态CLIP的推理部分代码简单试玩一下。
致敬大佬的CLIP!!!
论文链接《Learning Transferable Visual Models From Natural Language Supervision》
代码链接 openai/CLIP
一、CLIP整体流程简述
流程主要分为训练过程(1)
与推理过程(2)(3)
。
训练过程
- 输入
N
个文本Text
与N
个图片Image
,实际上是N
个文本图片对[Text-Image] pair
;Text
与Image
分别通过Text Encoder
与Image Encoder
分别转变成N
个文本特征表示Text_Embed
与N
个图片特征表示Image_Embed
;- 由
N
个Text_Embed
与N
个Image_Embed
互相求余弦相似度,得到相似度矩阵 S i m i l a r i t y M a t r i x N × N SimilarityMatrix_{N\times N} SimilarityMatrixN×N;- S i m i l a r i t y M a t r i x N × N SimilarityMatrix_{N\times N} SimilarityMatrixN×N中对角线都为正样本([文本-图片]匹配正确),即一共
N
个正样本,一共N^2-N
个负样本。
推理过程
- 随机给定一些单词标签
word_label
,以及一张需要推理的图片Image
;word_label
通过prompt engineering
转化为句子形式,也就是多个Text
;- 多个
Text
通过Text Encoder
转化为多个Text_Embed
,图片Image
通过Image Encoder
转化为一个Image_Embed
;- 将这个
Image_Embed
与多个Text_Embed
求得多个相似度水平,最高的即为预测的类别。
二、代码试玩
代码在Jupyter Notebook
中运行的,前提先装好Pytorch
+CUDA
。
先装一些所需要的包。
! pip install ftfy regex tqdm
! pip install git+https://github.com/openai/CLIP.git
加载需要的包以及模型,在这一步会下载模型的权重文件(338M)。
import numpy as np
import torch
import clip
from PIL import Image
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
读取所要推理的图片以及自定义的标签来进行分类推理。
# DIY image 可改
image = preprocess(Image.open('./Pikachu.png')).unsqueeze(0).to(device)
# DIY text 可改
text = clip.tokenize(["plane", "birds", "river", "human", "yellow pet"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image=image)
text_features = model.encode_text(text=text)
logits_per_image, logits_per_text = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("Label probs: ", probs)
我们的输入图片是皮卡丘:
给出的预测可能类别文本为:
最终得到的结果为:
可以看到,最后一个类别yellow pet
的预测概率最高~~
参考
https://github.com/openai/CLIP
https://www.bilibili.com/video/BV1SL4y1s7LQ/