文字生成图片是近年来多模态和大模型研究的热门方向,openai提出的CLIP提供了一个方法建立起了图片和文字的联系,但是只能做到给定一张图片选择给定文本语义最相近的那一个,实际项目开发中我们总是需要从一张图片获取描述,clip-interrogator应运而生。
代码:https://github.com/pharmapsychotic/clip-interrogator
用途:根据图像获取提示词,即图生文
体验:https://huggingface.co/spaces/fffiloni/CLIP-Interrogator-2
上传一张图,反推出描述,然后将其作为prompt,喂到 Midjourney,效果还不错,自己可以微调一下刚才的prompt,以获得更好的效果。
https://huggingface.co/spaces/mukaist/Midjourney
流程上验证没啥问题,在本地搭建一下图生文。
原理
clip-interrogator会使用BILP生成一段对图片的自然语言描述。
接下来会根据四种模式,从data文件夹下的txt文件中组合出文字生成图片常用的prompt,通过CLIP进行编码,然后将图片也用CLIP进行编码,计算出相似度最大的一组prompt,和BILP生成的prompt拼接到一起,就得到了一组prompt。
安装
# install torch with GPU support for example:
pip3 install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu117
# install clip-interrogator
pip install clip-interrogator==0.5.4
# or for very latest WIP with BLIP2 support
#pip install clip-interrogator==0.6.0
模型
https://github.com/mlfoundations/open_clip
https://huggingface.co/models?library=open_clip
For the best prompts for Stable Diffusion 1.X use ViT-L-14/openai for clip_model_name. For Stable Diffusion 2.0 use ViT-H-14/laion2b_s32b_b79k(我们选择这个)
代码:img2text.py
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
from clip_interrogator import Config, Interrogator
import torch
config = Config()
config.device = 'cuda' if torch.cuda.is_available() else 'cpu'
config.blip_offload = False if torch.cuda.is_available() else True
config.chunk_size = 2048
config.flavor_intermediate_count = 512
config.blip_num_beams = 64
config.clip_model_name = "ViT-H-14/laion2b_s32b_b79k"
ci = Interrogator(config)
def get_prompt_from_image(image):
return ci.interrogate(image.convert('RGB'))
import requests
import shutil
r = requests.get("https://pic1.zhimg.com/v2-6e056c49362bff9af1eb39ce530ac0c6_1440w.jpg?source=d16d100b", stream=True)
if r.status_code == 200:
with open('./image.jpg', 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
from PIL import Image
print(get_prompt_from_image(Image.open('./image.jpg')))
代码
# 可以在运行命令前加上HF_ENDPOINT=https://hf-mirror.com。缓解国内无法下载问题
HF_ENDPOINT=https://hf-mirror.com python img2text.py
其他使用可参考:clip_interrogator教程 - plus studio - StudyingLover
模型
BLIP
BLIP可以传入两种选项,large
和 base
,默认使用large
, base用法是
from PIL import Image
from clip_interrogator import Config, Interrogator
image = Image.open(image_path).convert('RGB')
ci = Interrogator(Config(caption_model_name='blip-base',clip_model_name="RN50-quickgelu/openai"))
print(ci.interrogate_fast(image))
CLIP:
模型 | tag |
---|---|
coca_base | 不传 |
RN50 | 'openai', 'yfcc15m', 'cc12m' |
RN50-quickgelu | 'openai', 'yfcc15m', 'cc12m' |
RN101 | 'openai', 'yfcc15m' |
RN101-quickgelu | 'openai', 'yfcc15m' |
RN50x4 | 'openai' |
RN50x16 | 'openai' |
RN50x64 | 'openai' |
ViT-B-32 | 'openai', 'laion400m_e31', 'laion400m_e32', 'laion2b_e16', 'laion2b_s34b_b79k' |
ViT-B-32-quickgelu | 'openai', 'laion400m_e31', 'laion400m_e32' |
ViT-B-16 | 'openai', 'laion400m_e31', 'laion400m_e32', 'laion2b_s34b_b88k' |
ViT-L-14-336 | 'openai' |
ViT-S-32-alt | 不传 |
ViT-S-32 | 不传 |
ViT-S-16-alt | 不传 |
ViT-S-16 | 不传 |
ViT-M-32-alt | 不传 |
ViT-M-32 | 不传 |
ViT-M-16-alt | 不传 |
ViT-M-16 | 不传 |
xlm-roberta-base-ViT-B-32 | 'laion5b_s13b_b90k' |
xlm-roberta-large-ViT-H-14 | 'frozen_laion5b_s13b_b90k' |
例如使用
RN50-quickgelu/openai
的用法就是ci = Interrogator(Config(clip_model_name="RN50-quickgelu/openai"))
文档中有这么一句ViT-L for Stable Diffusion 1, and ViT-H for Stable Diffusion 2,意思是 ViT-L 是给 Stable Diffusion 1 用的,ViT-H是给 Stable Diffusion 2 用的
模式
模式有best
, classic
, fast
和negative
三种,开发者在这里的设计很奇怪,不同模式的使用不是传不同的参数而是使用不同的方法。best
模式就是上面的用法
fast
模式的用法是
from PIL import Image
from clip_interrogator import Config, Interrogator
image = Image.open(image_path).convert('RGB')
ci = Interrogator(Config(clip_model_name="RN50-quickgelu/openai"))
print(ci.interrogate_fast(image))
classic
模式用法
from PIL import Image
from clip_interrogator import Config, Interrogator
image = Image.open(image_path).convert('RGB')
ci = Interrogator(Config(clip_model_name="RN50-quickgelu/openai"))
print(ci.interrogate_classic(image))
negative
模式用法
from PIL import Image
from clip_interrogator import Config, Interrogator
image = Image.open(image_path).convert('RGB')
ci = Interrogator(Config(clip_model_name="RN50-quickgelu/openai"))
print(ci.interrogate_negative(image))
quiet
quiet
选项的作用是不输出中间过程,使用方法是直接写进Config 即可 ,例如
from PIL import Image
from clip_interrogator import Config, Interrogator
image = Image.open('/content/test.png').convert('RGB')
ci = Interrogator(Config(clip_model_name="RN50-quickgelu/openai",quiet=True))
print(ci.interrogate_fast(image))
自定义词库
如果你安装的是0.6.0,那么可以使用自定义词库
from clip_interrogator import Config, Interrogator, LabelTable, load_list
from PIL import Image
ci = Interrogator(Config(blip_model_type=None))
image = Image.open(image_path).convert('RGB')
table = LabelTable(load_list('terms.txt'), 'terms', ci)
best_match = table.rank(ci.image_to_features(image), top_count=1)[0]
print(best_match)
其他:
1:clip-interrogator代码解析 - plus studio-腾讯云开发者社区-腾讯云
2:https://www.cnblogs.com/studyinglover/p/17857214.html
3:clip_interrogator教程 - plus studio - StudyingLover