• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

CLIP/CLOOB

date: 2022-05-27 excerpt: CLIP/CLOOBの使い方

tag: 機械学習CLIPCLOOB


CLIP/CLOOBの使い方

概要

  • OpenAIで開発された画像とテキストの関係を学習するもの
  • 画像とテキストの距離を計算してその距離が近いテキストは画像を説明している
    • 距離は画像とテキストの内積
  • rinna社がモデルを公開している
    • github.com/rinnakk/japanese-clip
  • 画像とテキストのゼロショットラーニングとしても使える

考えられるユースケース

  • 自然言語の文章で画像を検索
  • 画像で自然言語の文章を検索
  • 実装が思いつかないができるだろうこと
    • 文章から画像を生成
    • 画像から文章を生成

具体例

モデルのロード

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]]

Google Colab

  • japanese-clip/cloob

参考

  • huggingface.co/rinna/japanese-cloob-vit-b-16
  • rinna社、日本語に特化した言語画像モデルCLIPを公開


機械学習CLIPCLOOB Share Tweet