CLIP/CLOOBの使い方
概要
- OpenAIで開発された画像とテキストの関係を学習するもの
- 画像とテキストの距離を計算してその距離が近いテキストは画像を説明している
- 距離は画像とテキストの内積
- rinna社がモデルを公開している
- 画像とテキストのゼロショットラーニングとしても使える
考えられるユースケース
- 自然言語の文章で画像を検索
- 画像で自然言語の文章を検索
- 実装が思いつかないができるだろうこと
- 文章から画像を生成
- 画像から文章を生成
具体例
モデルのロード
import io
import requests
from PIL import Image
import torch
import japanese_clip as ja_clip
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = ja_clip.load("rinna/japanese-cloob-vit-b-16", device=device)
tokenizer = ja_clip.load_tokenizer()
茶トラの猫の写真をダウンロードしてzero-shotでどれかを推論する
URL = "https://img.benesse-cms.jp/pet-cat/item/image/normal/resized/resized_e9e82de6-a89e-4a21-b592-4e648ef71e4b.jpg"
img = Image.open(io.BytesIO(requests.get(URL).content))
image = preprocess(img).unsqueeze(0).to(device)
encodings = ja_clip.tokenize(
texts=["茶トラの猫", "猫", "象", "眠そうな犬", "ゴールデンレトリバー", "犬"],
max_seq_len=77,
device=device,
tokenizer=tokenizer, # this is optional. if you don't pass, load tokenizer each time
)
with torch.no_grad():
image_features = model.get_image_features(image)
text_features = model.get_text_features(**encodings)
# text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
text_probs = torch.clamp((image_features @ text_features.T), min=0)
text_probs /= text_probs.sum()
print("Label probs:", text_probs) # prints: [[1.0, 0.0, 0.0]]