Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.
Introdução
Blip2 é uma inteligência artificial capaz de receber uma imagem ou vídeo como entrada e ter uma conversa, respondendo perguntas ou fornecendo contexto do que essa entrada mostra de maneira muito precisa 🤯
Instalação
Para poder instalar esta ferramenta o melhor é criar um novo ambiente do Anaconda
!$ conda create -n blip2 python=3.9
Agora vamos entrar no ambiente
!$ conda activate blip2
Instalamos todos os módulos necessários
!$ conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
!$ conda install -c anaconda pillow
!$ conda install -y -c anaconda requests
!$ conda install -y -c anaconda jupyter
Por fim, instalamos Blip2
!$ pip install salesforce-lavis
Uso
Carregamos as bibliotecas necessárias
import torchfrom PIL import Imageimport requestsfrom lavis.models import load_model_and_preprocess
Carregamos uma imagem de exemplo
img_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/12_-_The_Mystical_King_Cobra_and_Coffee_Forests.jpg/800px-12_-_The_Mystical_King_Cobra_and_Coffee_Forests.jpg'raw_image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')display(raw_image.resize((500, 500)))
<PIL.Image.Image image mode=RGB size=500x500>
Estabelecemos a GPU se houver.
device = torch.device("cuda" if torch.cuda.is_available() else 'cpu')device
device(type='cuda')
Atribuímos um modelo. No meu caso, com um computador com 32 GB de RAM e uma GPU 3060 com 12 GB de VRAM, não posso usar todos, então coloquei ao lado um comentário ok
com os modelos que consegui usar, e para os que não, o erro que recebi. Se você tem um computador com a mesma quantidade de RAM e VRAM, já sabe quais pode usar; caso contrário, você precisa testar.
# name = "blip2_opt"; model_type = "pretrain_opt2.7b" # ok# name = "blip2_opt"; model_type = "caption_coco_opt2.7b" # FAIL VRAM# name = "blip2_opt"; model_type = "pretrain_opt6.7b" # FAIL RAM# name = "blip2_opt"; model_type = "caption_coco_opt6.7b" # FAIL RAM# name = "blip2"; model_type = "pretrain" # FAIL type error# name = "blip2"; model_type = "coco" # okname = "blip2_t5"; model_type = "pretrain_flant5xl" # ok# name = "blip2_t5"; model_type = "caption_coco_flant5xl" # FAIL VRAM# name = "blip2_t5"; model_type = "pretrain_flant5xxl" # FAILmodel, vis_processors, _ = load_model_and_preprocess(name=name, model_type=model_type, is_eval=True, device=device)vis_processors.keys()
Loading checkpoint shards: 0%| | 0/2 [00:00<?, ?it/s]
dict_keys(['train', 'eval'])
Preparamos a imagem para colocá-la no modelo
image = vis_processors["eval"](raw_image).unsqueeze(0).to(device)
Analisamos a imagem sem perguntar nada
model.generate({"image": image})
['a black and white snake']
Analisamos a imagem fazendo perguntas
prompt = None
def prepare_prompt(prompt, question):if prompt is None:prompt = question + " Answer:"else:prompt = prompt + " " + question + " Answer:"return prompt
def get_answer(prompt, question, model):prompt = prepare_prompt(prompt, question)answer = model.generate({"image": image,"prompt": prompt})answer = answer[0]prompt = prompt + " " + answer + "."return prompt, answer
question = "What's in the picture?"prompt, answer = get_answer(prompt, question, model)print(f"Question: {question}")print(f"Answer: {answer}")
Question: What's in the picture?Answer: a snake
question = "What kind of snake?"prompt, answer = get_answer(prompt, question, model)print(f"Question: {question}")print(f"Answer: {answer}")
Question: What kind of snake?Answer: cobra
question = "Is it poisonous?"prompt, answer = get_answer(prompt, question, model)print(f"Question: {question}")print(f"Answer: {answer}")
Question: Is it poisonous?Answer: yes
question = "If it bites me, can I die?"prompt, answer = get_answer(prompt, question, model)print(f"Question: {question}")print(f"Answer: {answer}")
Question: If it bites me, can I die?Answer: yes