CLIPで画像分類をしてみよう
目的
CLIPの仕組みをざっくり理解し、実際に画像分類をおこなう
CLIPの概要
テキストと画像の両方を扱うことができるマルチモーダルモデル
画像分類においてSOTAを獲得
プロンプトエンジニアリングにより、ゼロショット性能を獲得
CLIPの仕組み
画像とそれを表すテキストの40億ペアのデータを学習に使用
テキストエンコーダはTransformer、イメージエンコーダはVision Transformer(ベースモデルではResNet)を使用
画像とテキストのそれぞれのベクトルのコサイン類似度が大きくなるように学習
CLIPの利用例
画像分類
最もオーソドックスな利用目的
入力画像と、事前に用意したテキストリスト内の単語との類似度を計算
追加学習無しに自然言語のみで画像分類をおこなうことができることが特徴
学習データに生のテキストデータを使用しているため、柔軟な自然言語に対応可能
(例)'a photo of a dog, a kind of a pet' など、事前に対象に関する知識があれば、テキストに扶養することで分類精度を上げることが可能
DALL-E
OpenAI製の画像生成AI
生成された画像の再ランキングにCLIPを利用
画像分類のためのサンプルコード
code:必要なライブラリをインストール
pip install ftfy regex tqdm
※pytorchは自分のマシンやcudaに合ったものをインストールする
code:python
import torch
import clip
from PIL import Image
import numpy as np
# モデルの読み込み
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
# 画像とテキストの準備
image = preprocess(Image.open("/path/to/your/image")).unsqueeze(0).to(device)
text = clip.tokenize(text_list).to(device)
with torch.no_grad():
# 画像とテキストのエンコード
image_features = model.encode_image(image)
text_features = model.encode_text(text)
# 推論
logits_per_image, logits_per_text = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
# 類似率の出力
print("Label probs:", probs0) print(text_list[np.argmax(probs0)]) 上記のコードで簡単な画像分類が可能
上記のサンプルコードではVision Transformerのイメージデコーダを使用
text_list には任意のテキストを格納可能
print(text_list[np.argmax(probs[0)])で、入力画像と、リスト内のテキストの中で最も類似度の大きいテキストを出力
参考資料