Stability AI が公開している「Japanese InstructBLIP Alpha」を使って日本語で写真の説明をしてもらう

huggingface.co

はじめに

以前BLIP, BLIP2を使った経験があります。
touch-sp.hatenablog.com
touch-sp.hatenablog.com
「Japanese InstructBLIP Alpha」は名前から分かる通り日本語が使えます。

質問にも答えてくれました。

用意した画像

以前と同様、こちらの画像を使わせて頂きました。

結果

指定した画像に対して質問を投げかけると答えを返してくれます。

質問文をなにも投げかけないと、単に画像を説明してくれます。

星を見るために屋根の上に座っている2人の子供



「何人写っていますか」と質問した時の答えがこちらです。

2人



「子供の性別はわかりますか」と質問した時の答えがこちらです。

男の子と女の子

Pythonスクリプト

6行目のuser_queryのところに質問文を打ち込みます。空文字にしておくと単に画像を説明してくれます。

import torch
from transformers import LlamaTokenizer, AutoModelForVision2Seq, BlipImageProcessor
from diffusers.utils import load_image
import requests

user_query = "子供の性別はわかりますか"

model = AutoModelForVision2Seq.from_pretrained(
    # from https://huggingface.co/stabilityai/japanese-instructblip-alpha
    "japanese-instructblip-alpha",
    load_in_8bit=True,
    variant="fp16",
    device_map="auto",
    trust_remote_code=True
)
processor = BlipImageProcessor.from_pretrained("japanese-instructblip-alpha")
tokenizer = LlamaTokenizer.from_pretrained(
    "novelai/nerdstash-tokenizer-v1",
    additional_special_tokens=['▁▁']
)

url = "https://github.com/SHI-Labs/Versatile-Diffusion/blob/master/assets/demo/reg_example/boy_and_girl.jpg?raw=true"
image = load_image(url)
prompt_head = (
    "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。"
    "要求を適切に満たす応答を書きなさい。"
    "\n\n### 指示: \n与えられた画像について、詳細に述べてください。"
)
prompt_tail = "\n\n### 応答: "
user_input = "" if user_query=="" else f"\n\n### 入力: \n{user_query}"
prompt = prompt_head + user_input + prompt_tail
inputs = processor(images=image, return_tensors="pt")
text_encoding = tokenizer(prompt, add_special_tokens=False, return_tensors="pt")
text_encoding["qformer_input_ids"] = text_encoding["input_ids"].clone()
text_encoding["qformer_attention_mask"] = text_encoding["attention_mask"].clone()
inputs.update(text_encoding)

outputs = model.generate(
    **inputs.to(model.device, dtype=model.dtype),
    num_beams=5,
    max_new_tokens=32,
    min_length=1,
)
generated_text = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0].strip()
print(generated_text)

PC環境

モデルを8bitで読み込むためにbitsandbytesというライブラリを使います。
そのためWSL2を使いました。
Windowsでもなんとか使えるようですがやったことがありません。
8bitで読み込まないと自分のローカル環境では動きませんでした。
使用しているPCはこちらです。

Ubuntu 22.04 on WSL2
CUDA 11.8
Python 3.10

Python環境構築

CUDA 11.8を使った場合です。
Diffusersの「load_image」を使うためだけにDiffusersをインストールしています。

pip install torch==2.1.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install diffusers[torch]
pip install transformers einops sentencepiece bitsandbytes





このエントリーをはてなブックマークに追加