Sentence Transformers 2.2 : ノートブック : 画像検索 – 画像 & 多言語テキストの結合埋め込み (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/29/2022 (v2.2.2)
* 本ページは、UKPLab/sentence-transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
クラスキャット 人工知能 研究開発支援サービス
◆ クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
Sentence Transformers 2.2 : ノートブック : 画像検索 – 画像 & 多言語テキストの結合埋め込み
このサンプルは SentenceTransformer が画像とテキストを同じベクトル空間にマップするためにどのように使用できるかを示します。
モデルとしては OpenAI CLIP モデル を使用します、これは画像と画像の alt テキストの大規模なセットで訓練されました。
オリジナルの CLIP モデルは英語に対してだけ動作するので、このモデルを 50+ 言語で動作するように私たちは 多言語知識蒸留 を使用しました。
写真のソースとしては、Unsplash Dataset Lite を使用します、これは約 25k 画像を含みます。Unsplash 画像については ライセンス をご覧ください。
Note : 25k 画像は非常に少ないです。実際に特定の用語を検索した場合、そのような写真がコレクションに存在しない可能性は高いです。
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
# ここでは多言語 CLIP モデルをロードします。注意してください、このモデルはテキストをエンコードするだけです。
# 画像の埋め込みを必要とする場合は、'clip-ViT-B-32' モデルをロードする必要があります。
model = SentenceTransformer('clip-ViT-B-32-multilingual-v1')
# 次に Unsplash から約 25k 画像を取得します。
img_folder = 'photos/'
if not os.path.exists(img_folder) or len(os.listdir(img_folder)) == 0:
os.makedirs(img_folder, exist_ok=True)
photo_filename = 'unsplash-25k-photos.zip'
if not os.path.exists(photo_filename): #Download dataset if does not exist
util.http_get('http://sbert.net/datasets/'+photo_filename, photo_filename)
#Extract all images
with zipfile.ZipFile(photo_filename, 'r') as zf:
for member in tqdm(zf.infolist(), desc='Extracting'):
zf.extract(member, img_folder)
# 今は、埋め込みを計算する必要があります。
# 早めるために、事前計算された埋め込みを分配します。
# そうでないなら画像を貴方自身でエンコードすることもできます。
# 画像をエンコードするには、以下のコードを使用できます :
# from PIL import Image
# img_emb = model.encode(Image.open(filepath))
use_precomputed_embeddings = True
if use_precomputed_embeddings:
emb_filename = 'unsplash-25k-photos-embeddings.pkl'
if not os.path.exists(emb_filename): #Download dataset if does not exist
util.http_get('http://sbert.net/datasets/'+emb_filename, emb_filename)
with open(emb_filename, 'rb') as fIn:
img_names, img_emb = pickle.load(fIn)
print("Images:", len(img_names))
else:
#For embedding images, we need the non-multilingual CLIP model
img_model = SentenceTransformer('clip-ViT-B-32')
img_names = list(glob.glob('unsplash/photos/*.jpg'))
print("Images:", len(img_names))
img_emb = img_model.encode([Image.open(filepath) for filepath in img_names], batch_size=128, convert_to_tensor=True, show_progress_bar=True)
Images: 24996
# 次に、search 関数を定義します。
def search(query, k=3):
# 最初に、クエリーを埋め込みます (それは画像かテキスト文字列のいずれかです)。
query_emb = model.encode([query], convert_to_tensor=True, show_progress_bar=False)
# そして、util.semantic_search 関数を使用します、
# これはクエリー埋め込みとすべての画像埋め込みの間のコサイン類以度を計算します。
# そしてそれは top_k の最も高いランクされた画像を返し、私たちはそれを出力します :
hits = util.semantic_search(query_emb, img_emb, top_k=k)[0]
print("Query:")
display(query)
for hit in hits:
print(img_names[hit['corpus_id']])
display(IPImage(os.path.join(img_folder, img_names[hit['corpus_id']]), width=200))
search("Two dogs playing in the snow")
Query: 'Two dogs playing in the snow' lyStEjlKNSw.jpg FAcSe7SjDUU.jpg Hb6nGDgWztE.jpg
#ドイツ語: A cat on a chair
search("Eine Katze auf einem Stuhl")
Query: 'Eine Katze auf einem Stuhl' CgGDzMYdYw8.jpg kjERLXaHjXc.jpg I-YJ-gaJNaw.jpg
#スペイン語: Many fish
search("Muchos peces")
Query: 'Muchos peces' H22jcGTyrS4.jpg CJ_9I6aXSnc.jpg _MJKaRig1Ic.jpg
#中国語: A beach with palm trees
search("棕榈树的沙滩")
Query: '棕榈树的沙滩' crIXKhUDpBI.jpg _6iV1AJZ53s.jpg rv63du1a79E.jpg
#ロシア語: A sunset on the beach
search("Закат на пляже")
Query: 'Закат на пляже' JC5U3Eyiyr4.jpg 5z1QDcisnJ8.jpg rdG4hRoyVR0.jpg
#トルコ語: A dog in a park
search("Parkta bir köpek")
Query: 'Parkta bir köpek' ROJLfAbL1Ig.jpg 0O9A0F_d1qA.jpg 4mdsPUtN0P0.jpg
# Japanese: New York at night
search("夜のニューヨーク")
Query: '夜のニューヨーク' FGjR4IGwP7U.jpg 8nCMOFYyXF4.jpg ZAOEjcpdMkc.jpg
以上