DashVector と ModelScope の Chinese CLIP モデルを使用して、text-to-image 検索システムを構築します。Muge マルチモーダルデータセット は、画像コーパスとして使用します。
ワークフロー

このプロセスには、主に 2 つのステージがあります:
-
画像データの埋め込みと保存:Chinese CLIP 埋め込み API を使用して Muge データセットの画像をベクターに変換し、DashVector に書き込みます。
-
テキストクエリによる取得:同じ Chinese CLIP モデルを使用してテキストクエリをベクターに変換し、DashVector から類似の画像を取得します。
前提条件
1. API キーの準備
-
DashVector を有効化します。DashVector の有効化を参照してください。
-
DashVector の API キーを作成します。API キーの管理を参照してください。
2. 環境の準備
このチュートリアルでは、ModelScope の CLIP Enormous モデル (解像度 224) を使用します。このモデルは、約 2 億の中国語の画像とテキストのペアでトレーニングされています。以下の依存関係をインストールしてください:
Python 3.7 以降のバージョンをインストールしてください。
# DashVector クライアントのインストール
pip3 install dashvector
# ModelScope のインストール
# ModelScope 0.3.7 以降が必要です。デフォルトのバージョンは通常 0.3.7 より新しいバージョンですが、念のため確認してください。
# イメージを更新するか、次の方法を使用してください。
pip3 install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# decord は別途インストールしてください。
# pip3 install decord
# ModelScope のインストールには、他の依存関係が含まれる場合があります。現在のバージョンの依存関係は以下のとおりです。
# pip3 install torch torchvision opencv-python timm librosa fairseq transformers unicodedata2 zhconv rapidfuzz3. データの準備
このチュートリアルでは、Muge マルチモーダルデータセット の検証セットを使用します。ModelScope の dataset API を使用してロードします。
from modelscope.msdatasets import MsDataset
dataset = MsDataset.load("muge", split="validation")手順
your-xxx-api-key と your-xxx-cluster-endpoint を実際の API キーとクラスターエンドポイントに置き換えてください。
1. 画像データの埋め込みと保存
Muge マルチモーダルデータセット の検証セットには、30,588 枚の画像が含まれています。CLIP モデルを使用してそれらの埋め込みベクターを抽出し、後で表示するために base64 でエンコードされた画像データとともに DashVector に保存します。
import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException, DashVectorCode
from PIL import Image
import base64
import io
def image2str(image):
image_byte_arr = io.BytesIO()
image.save(image_byte_arr, format='PNG')
image_bytes = image_byte_arr.getvalue()
return base64.b64encode(image_bytes).decode()
if __name__ == '__main__':
# DashVector クライアントを初期化します
client = Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'
)
# コレクションの作成:コレクション名とベクター次元を指定します。CLIP Enormous モデルは 1024 次元のベクターを生成します。
rsp = client.create('muge_embedding', 1024)
if not rsp:
raise DashVectorException(rsp.code, reason=rsp.message)
# バッチで画像の埋め込みを生成し、ベクターを保存します。
collection = client.get('muge_embedding')
pipe = pipeline(task=Tasks.multi_modal_embedding,
model='damo/multi-modal_clip-vit-huge-patch14_zh',
model_revision='v1.0.0')
ds = MsDataset.load("muge", split="validation")
BATCH_COUNT = 10
TOTAL_DATA_NUM = len(ds)
print(f"Muge 検証データのインデックス作成を開始します。合計データサイズ: {TOTAL_DATA_NUM}、バッチサイズ: {BATCH_COUNT}")
idx = 0
while idx < TOTAL_DATA_NUM:
batch_range = range(idx, idx + BATCH_COUNT) if idx + BATCH_COUNT <= TOTAL_DATA_NUM else range(idx, TOTAL_DATA_NUM)
images = [ds[i]['image'] for i in batch_range]
# Chinese CLIP モデルで画像の埋め込みベクターを生成します。
image_embeddings = pipe.forward({'img': images})['img_embedding']
image_vectors = image_embeddings.detach().cpu().numpy()
collection.insert(
[
Doc(
id=str(img_id),
vector=img_vec,
fields={'png_img': image2str(img)}
)
for img_id, img_vec, img in zip(batch_range, image_vectors, images)
]
)
idx += BATCH_COUNT
print("Muge 検証データのインデックス作成が完了しました。")
モデルはデフォルトで CPU で実行されます。GPU で実行すると、パフォーマンスが向上します。
2. テキストクエリを使用したデータの取得
画像データが保存された状態で、同じ CLIP モデルを使用してテキストクエリをベクターに変換し、DashVector API を使用して類似の画像を取得します。
import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException
from PIL import Image
import base64
import io
def str2image(image_str):
image_bytes = base64.b64decode(image_str)
return Image.open(io.BytesIO(image_bytes))
def multimodal_search(input_text):
# DashVector クライアントを初期化します
client = Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'
)
# 保存済みのコレクションを取得します。
collection = client.get('muge_embedding')
# テキストクエリの埋め込みベクターを取得します。
pipe = pipeline(task=Tasks.multi_modal_embedding,
model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0')
text_embedding = pipe.forward({'text': input_text})['text_embedding'] # 2D テンソル、[テキスト数、特徴次元]
text_vector = text_embedding.detach().cpu().numpy()[0]
# DashVector でベクターを取得します。
rsp = collection.query(text_vector, topk=3)
image_list = list()
for doc in rsp:
image_str = doc.fields['png_img']
image_list.append(str2image(image_str))
return image_list
if __name__ == '__main__':
text_query = "メガネをかけた犬"
images = multimodal_search(text_query)
for img in images:
# 注:show() 関数を Linux サーバーで動作させるには、必要な画像ブラウザーコンポーネントのインストールが必要な場合があります。
# このコードは、Jupyter Notebook をサポートするサーバーで実行してください。
img.show()
コードを実行すると、出力は次のようになります。


