10|CLIP:让AI绘画模型乖乖听你的话
追本溯源:CLIP 的提出背景
- 深入了解
- 翻译
- 解释
- 总结
CLIP算法:多模态信息整合的重要技术 CLIP算法是OpenAI在2021年提出的重要技术,通过对比学习的方式,将图像和文本编码为模型能理解的“语言”,实现了多模态信息的有效整合。该算法利用海量互联网数据,通过对图像和文本的对应关系进行训练,使得模型能够理解和处理不同形式的输入数据。CLIP的提出解决了CV数据集标注成本高昂和模型无法轻易迁移到新任务的问题,为多模态模型的发展提供了重要思路。 CLIP算法的应用包括图像分类、文字识别、视频理解等多种任务,通过跨模态检索的方式进行分类,具有较强的扩展性和适用性。此外,CLIP还衍生出增强版,如OpenCLIP、ChineseCLIP和EVA-CLIP,进一步提升了模型的性能和适用范围。 读者可以通过Colab等平台动手使用CLIP完成图像分类任务,通过安装对应的Python包和运行相应的代码,实现对图像的分类和文本理解任务。CLIP算法在AI绘画等领域也有重要应用,能够帮助模型更好地理解和处理文本指令,指导模型作画。 总之,CLIP算法通过对比学习的方式,实现了图像和文本的有效整合,为多模态模型的发展提供了重要思路,并在图像分类、文本理解等领域展现出了广阔的应用前景。
《AI 绘画核心技术与实战》,新⼈⾸单¥59
全部留言(5)
- 最新
- 精选
- 海杰老师我有几个问题。 1. 在SD里,CLIP的作用就是对prompt进行编码。文生图txt2img是用CLIP的文本编码器,图生图img2img用的是图像编码器,这样理解对吗? 2. 看到有些模型用CLIP skip 2,就是不用编码器的最后一层,这样设计的原理是什么?会得到更好的模型吗? 3. 外面下载的各种SD基础模型,它们用的都是同一个CLIP吗?下载的几个G的一个safetensors文件里,也包括CLIP的权重吗?
作者回复: 你好。关于Q1,在SD中CLIP的作用是对prompt进行编码,文生图用CLIP文本编码器,这样的理解是准确的。图生图img2img并不会用到图像编码器,而是直接在图像中加入噪声然后按照SD流程进行去噪,去噪过程仍然使用CLIP文本编码器做引导。针对Q2,CLIP Skip设置为2这个知识点,在第16讲会展开讨论,本质上是使用CLIP文本编码器倒数第二层的特征而不是最后一层特征,这样做的原因是由于CLIP的训练方式导致最后一层特征更靠近训练的图像数据,从而对prompt的表达能力变弱。实操经验是使用倒数第二层特征能让模型更听话、文生图效果更好。针对Q3,我们下载的各种SD基础模型中,包含CLIP、VAE、UNet等模型的权重。不同SD中用到的CLIP可能不同,比如SD1.x和SD2.x、SDXL中用的CLIP就不一样。希望能帮助到你。
2023-08-12归属地:新加坡25 - 恨%心~老师好,请问下如何分别用CLIP 和OpenCLIP推断任意图片的prompt,有对应的代码示例吗?
作者回复: 你好。CLIP和OpenCLIP模型无法推断图片的prompt,如果想得到图像prompt,需要使用BLIP这类文本生成模型,可以参考这个链接:https://huggingface.co/spaces/Salesforce/BLIP。希望能帮助到你。
2023-09-06归属地:北京1 - peter请教老师几个问题: Q1:动图是用什么做的? Q2:512纬度空间,这个512也是经验值吗? Q3:以4亿对图文数据集为例,硬件资源的需求量是个什么样子? 比如存储空间需要多少台机器,计算需要多少台机器等。 Q4:我的笔记本电脑是惠普电脑,16G内存,不知道是否有GPU(估计有但不知道多大),这样的配置能运行老师的例子吗?
作者回复: 你好。针对Q1,动图是生成多张图片直接合成GIF图片,可以用一些工具或者python代码来实现。针对Q2,512维度是经验值,比如OpenCLIP一个较大的模型,这个数值可以是1280。针对Q3,4亿图文对不建议存储到个人电脑,当然OpenAI的数据也没有开源。如果需要复现CLIP论文可以使用LAION开源的400M数据。一张显卡无法训练CLIP,需要多机多卡并行来做。对于我们而言,更多需要关注CLIP的使用即可,可以根据课程中的Colab来操作。针对Q4,可以使用CPU模式运行CLIP的推理,这样便可以运行课程的例子。希望能够帮助到你。
2023-08-08归属地:北京 - yanyu-xin按着老师的代码,一次性在Colab运行成功。 第二个作业: 第一个图片,用CLIP测试,结果是:“Predicted class: cat prob: cat 1.0, dog 0.0”; 用OpenCLIP测试结果是:“prob: a diagram 8.51679033075925e-06, a dog 1.5743193216621876e-05, a cat 0.9999756813049316” 第二个图片,用CLIP测试,结果是:“Predicted class: dog prob: cat 0.0, dog 1.0” 用OpenCLIP测试结果是:“prob: a diagram 8.806668120087124e-06, a dog 0.999969482421875, a cat 2.167693673982285e-05”
编辑回复: 优秀,后面还有更多实战和作业,继续练习呀,参与越多收获越大,加油~
2023-08-07归属地:广东 - 进化论import torch import clip from PIL import Image import urllib.request import matplotlib.pyplot as plt # Load the CLIP model device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = clip.load("ViT-B/32", device=device) # Define the target classes target_classes = ["cat", "dog", "owl"] # Load and preprocess the image image_url = "https://z1.ax1x.com/2023/10/23/piALRpQ.png" image_path = "test_image.png" urllib.request.urlretrieve(image_url, image_path) image = Image.open(image_path).convert("RGB") image_input = preprocess(image).unsqueeze(0).to(device) # Encode the image with torch.no_grad(): image_features = model.encode_image(image_input) # Encode the target classes text_inputs = clip.tokenize(target_classes).to(device) with torch.no_grad(): text_features = model.encode_text(text_inputs) # Compute the similarity scores similarity_scores = (100.0 * image_features @ text_features.T).softmax(dim=-1) # Get the predicted class _, predicted_class = similarity_scores.max(dim=-1) predicted_class = predicted_class.item() # Print the predicted class predicted_label = target_classes[predicted_class] plt.imshow(image) plt.show() print(f"Predicted class: {predicted_label}") print(f"prob: cat {similarity_scores[0][0]}, dog {similarity_scores[0][1]}, owl {similarity_scores[0][2]}")2023-10-23归属地:北京