1from transformers import AutoTokenizer, AutoModel
2from PIL import Image
3import torch
4from torchvision import transforms
5import requests
6from io import BytesIO
7
8# モデルとトークナイザーの読み込み
9model = AutoModel.from_pretrained("AoiNoGeso/japanese-clip-stair", trust_remote_code=True)
10tokenizer = AutoTokenizer.from_pretrained("AoiNoGeso/japanese-clip-stair")
11
12# 画像前処理関数
13def preprocess_image(image, size=224):
14 transform = transforms.Compose([
15 transforms.Resize((size, size)),
16 transforms.ToTensor(),
17 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
18 ])
19 if image.mode != 'RGB':
20 image = image.convert('RGB')
21 return transform(image).unsqueeze(0)
22
23# 画像とテキストの準備
24image_url = "https://images.pexels.com/photos/2253275/pexels-photo-2253275.jpeg"
25image = Image.open(BytesIO(requests.get(image_url).content))
26pixel_values = preprocess_image(image)
27
28texts = ["犬", "猫", "象", "鳥"]
29text_inputs = tokenizer(texts, padding=True, return_tensors="pt")
30
31# 推論実行
32with torch.no_grad():
33 outputs = model(
34 pixel_values=pixel_values,
35 input_ids=text_inputs.input_ids,
36 attention_mask=text_inputs.attention_mask
37 )
38
39 # 確率計算
40 probs = outputs['logits_per_image'].softmax(dim=-1)
41
42 # 結果表示
43 for i, (text, prob) in enumerate(zip(texts, probs[0])):
44 print(f"{text}: {prob:.4f} ({prob*100:.2f}%)")
1with torch.no_grad():
2 # 画像特徴量のみ取得
3 image_features = model.get_image_features(pixel_values)
4
5 # テキスト特徴量のみ取得
6 text_features = model.get_text_features(
7 text_inputs.input_ids,
8 text_inputs.attention_mask
9 )
10
11 # 手動で類似度計算
12 similarity = torch.matmul(image_features, text_features.T)
13 probs = similarity.softmax(dim=-1)
1@dataset{stair_captions,
2 title={STAIR Captions: Constructing a Large-Scale Japanese Image Caption Dataset},
3 author={Yoshikawa, Yuya and Shigeto, Yutaro and Takeuchi, Akikazu},
4 year={2017}
5}