Sentence Transformers 2.2 : 画像検索 – (多言語) ゼロショット画像分類

Sentence Transformers 2.2 : ノートブック : 画像検索 – (多言語) ゼロショット画像分類 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/04/2022 (v2.2.2)

* 本ページは、UKPLab/sentence-transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

Sentence Transformers 2.2 : ノートブック : 画像検索 – (多言語) ゼロショット画像分類

このサンプルは SentenceTransformer が画像とテキストを同じベクトル空間にマップするためにどのように使用できるかを示します。

ラベルのための名前を提供することによりこれをゼロショット分類を実行するために使用できます。

モデルとしては OpenAI CLIP モデル を使用します、これは画像と画像の alt テキストの大規模なセットで訓練されました。

このサンプルの画像は Unsplash から引用しています。

from sentence_transformers import SentenceTransformer, util
from PIL import Image
import glob
import torch
import pickle
import zipfile
from IPython.display import display
from IPython.display import Image as IPImage
import os
from tqdm.autonotebook import tqdm
import torch

# 画像埋め込みと英語テキスト埋め込みを計算するためにオリジナルの CLIP モデルを使用します。
en_model = SentenceTransformer('clip-ViT-B-32')
# 私たちのレポジトリから分類したい幾つかの画像をダウンロードします。
img_names = ['eiffel-tower-day.jpg', 'eiffel-tower-night.jpg', 'two_dogs_in_snow.jpg', 'cat.jpg']
url = 'https://github.com/UKPLab/sentence-transformers/raw/master/examples/applications/image-search/'
for filename in img_names:
    if not os.path.exists(filename):
        util.http_get(url+filename, filename)

# そしてこれらの画像に対して埋め込みを計算します。
img_emb = en_model.encode([Image.open(filepath) for filepath in img_names], convert_to_tensor=True)
# それから、ラベルをテキストとして定義します、4 つのラベルを使用します :
labels = ['dog', 'cat', 'Paris at night', 'Paris']

# そしてこれらのラベルに対してテキスト埋め込みを計算します。
en_emb = en_model.encode(labels, convert_to_tensor=True)

# そして、画像とラベルの間のコサイン類以度を計算します。
cos_scores = util.cos_sim(img_emb, en_emb)

# それからどのラベルが与えられた画像と最も高いコサイン類以度を持っているかを見ます。
pred_labels = torch.argmax(cos_scores, dim=1)

# 最後に画像 + ラベルを出力します。
for img_name, pred_label in zip(img_names, pred_labels):
    display(IPImage(img_name, width=200))
    print("Predicted label:", labels[pred_label])
    print("\n\n")

Predicted label: Paris


Predicted label: Paris at night


Predicted label: dog


Predicted label: cat

 

ゼロショット画像分類

オリジナルの CLIP モデルは英語に対してだけ動作するので、このモデルを 50+ 言語で動作するように私たちは 多言語知識蒸留 を使用しました。

ラベルを 50+ 言語で定義することができて、言語を混在させることもできます。

multi_model = SentenceTransformer('clip-ViT-B-32-multilingual-v1')

# Then, we define our labels as text. Here, we use 4 labels
labels = ['Hund',     # German: dog
          'gato',     # Spanish: cat 
          '巴黎晚上',  # Chinese: Paris at night
          'Париж'     # Russian: Paris
         ]

# And compute the text embeddings for these labels
txt_emb = multi_model.encode(labels, convert_to_tensor=True)

# Now, we compute the cosine similarity between the images and the labels
cos_scores = util.cos_sim(img_emb, txt_emb)

# Then we look which label has the highest cosine similarity with the given images
pred_labels = torch.argmax(cos_scores, dim=1)

# Finally we output the images + labels
for img_name, pred_label in zip(img_names, pred_labels):
    display(IPImage(img_name, width=200))
    print("Predicted label:", labels[pred_label])
    print("\n\n")

Predicted label: Париж


Predicted label: 巴黎晚上


Predicted label: Hund


Predicted label: gato

 

以上