CLIP 浅析

CLIP 浅析

概述

CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法或者模型

如何训练CLIP

CLIP包括两个模型:Text EncoderImage Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。

其中CLIP的流程图如下

CLIP.png

首先CLIP通过一个文本编码器和图像编码器获得相关特征

在这里插入图片描述

其中对于通过文本编码器获得的特征记为 T i T_i Ti 表示第 i i i个文本特征,其中共含有 N N N个特征, N N N为训练数据集中的文本信息中的类别个数,对于通过图像编码器获得的特征记为 I i I_i Ii 表示第 i i i个图像特征,并将 I i I_i Ii与每一个文本特征 T i T_i Ti进行余弦相似度计算。并使用softmax计算概率得到最相似的图文匹配对。其中伪代码如下

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter

# 分别提取图像特征和文本特征
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# 计算缩放的余弦相似度:[n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# 对称的对比学习损失:等价于N个类别的cross_entropy_loss
labels = np.arange(n) # 对角线元素的labels
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WebImageText

如何使用Clip进行图像分类

因为ImageNet中的label全是图像类别的表情,为了更好的适应Transformer,作者使用了A photo of {label}的句子作为输入。

img

伪代码如下

# 首先生成每个类别的文本描述
labels = ["dog", "cat", "bird", "person", "mushroom", "cup"]
text_descriptions = [f"A photo of a {label}" for label in labels]
text_tokens = clip.tokenize(text_descriptions).cuda()

# 提取文本特征
with torch.no_grad():
    text_features = model.encode_text(text_tokens).float()
    text_features /= text_features.norm(dim=-1, keepdim=True)

然后通过计算余弦相似度,并使用softmax计算概率得到最相似的图文匹配对。

优缺点分析

优点

因为CLIP使用图文对的形式进行训练,所以可以从互联网上获得大量的数据进行训练,从而无需大量的人工标注。因为大数据集的原因使得CLIP与CV中常用的先预训练然后微调不同,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练数据,就能在某个具体下游任务上实现分类。

同时OpenAI证明了CLIP在许多数据集上与ResNet50具有相似甚至更好的准确率。

image-20240511213152514

image-20240511213335644

缺点

因为CLIP采用了大量的数据集以及复杂的视觉结构使得它需要消耗恐怖的计算资源。同时对于训练集外的数据,无法做到很好的预测。

### Midjourney 的技术原理 Midjourney 使用复杂的机器学习模型,当用户输入文本描述(即提示词)时,模型会分析提示词中的关键词和概念,然后利用从海量图像数据集中学到的模式来生成符合描述的图像[^3]。 #### 数据集与训练过程 为了实现高质量的图像生成,Midjourney 需要依赖于大规模的数据集进行训练。这些数据集通常包含了数百万甚至更多的标记图片及其对应的描述文字。通过监督学习的方式,模型学会了如何将特定的文字映射到相应的视觉特征上。这种关联能力使得即使面对从未见过的新颖组合也能创造出合理的画面效果。 #### 模型架构 具体来说,Midjourney 可能采用了基于Transformer结构或其他先进的神经网络框架构建而成的大规模预训练语言-图像跨模态理解模型作为核心组件之一。这类模型擅长捕捉复杂语义信息之间的关系,并将其转换成具体的图形表达形式。此外,还可能引入了一些专门针对艺术风格迁移、超分辨率重建等方面的优化模块以提升最终输出的质量。 ```python import torch from transformers import CLIPProcessor, CLIPModel model_name = "openai/clip-vit-base-patch32" processor = CLIPProcessor.from_pretrained(model_name) model = CLIPModel.from_pretrained(model_name) text_input = processor(text=["a photo of a cat"], return_tensors="pt", padding=True) image_output = model.generate(**text_input) # 这里简化了实际调用方式 ``` 这段代码展示了使用CLIP (Contrastive Language–Image Pre-training) 类似的方法处理文本输入并尝试生成对应图像的过程,尽管这只是一个示意性的例子而非确切实现了Midjourney内部逻辑。 #### 用户交互设计 除了强大的后台算法支持外,良好的前端体验也是不可或缺的一部分。Midjourney 设计了一个直观易懂的操作界面让用户能够轻松地上手操作,只需简单地键入想要创造的内容即可获得令人惊艳的结果。同时提供了多种参数调整选项以便满足不同层次创作者的需求,比如可以指定画作风格、色彩偏好等个性化设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gowi_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值