Buat sistem pengambilan teks-ke-gambar menggunakan DashVector dan model Chinese CLIP dari ModelScope. Set data multimodal Muge berfungsi sebagai korpus gambar.
Alur Kerja

Proses ini terdiri dari dua tahap utama:
-
Penyematan dan penyimpanan data gambar. Ubah gambar dari set data Muge menjadi vektor menggunakan API penyematan Chinese CLIP, lalu simpan ke DashVector.
-
Pengambilan berdasarkan kueri teks. Ubah kueri teks menjadi vektor menggunakan model Chinese CLIP yang sama, lalu ambil gambar serupa dari DashVector.
Prasyarat
1. Siapkan kunci API
-
Aktifkan DashVector. Aktifkan DashVector.
-
Buat kunci API DashVector. Kelola kunci API.
2. Siapkan lingkungan
Tutorial ini menggunakan model CLIP Enormous (resolusi 224) dari ModelScope, yang dilatih pada sekitar 200 juta pasangan gambar-teks dalam bahasa Tiongkok. Instal dependensi berikut:
Instal Python 3.7 atau versi yang lebih baru.
# Instal client DashVector
pip3 install dashvector
# Instal ModelScope
# Diperlukan ModelScope 0.3.7 atau versi yang lebih baru. Versi default biasanya lebih baru dari 0.3.7, tetapi pastikan untuk memeriksa.
# Perbarui image atau gunakan metode berikut.
pip3 install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# Instal decord secara terpisah.
# pip3 install decord
# Instalasi ModelScope mungkin memiliki dependensi lain. Dependensi untuk versi saat ini tercantum di bawah ini.
# pip3 install torch torchvision opencv-python timm librosa fairseq transformers unicodedata2 zhconv rapidfuzz3. Siapkan data
Tutorial ini menggunakan set validasi set data multimodal Muge. Muat melalui API dataset ModelScope.
from modelscope.msdatasets import MsDataset
dataset = MsDataset.load("muge", split="validation")Langkah-langkah
Ganti your-xxx-api-key dan your-xxx-cluster-endpoint dengan kunci API dan titik akhir kluster Anda yang sebenarnya.
1. Sematkan dan simpan data gambar
Set validasi set data multimodal Muge berisi 30.588 gambar. Ekstrak vektor penyematannya menggunakan model CLIP dan simpan di DashVector bersama data gambar yang dikodekan dalam base64 untuk ditampilkan nanti.
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__':
# Inisialisasi client DashVector
client = Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'
)
# Buat koleksi: Tentukan nama koleksi dan dimensi vektor. Model CLIP Enormous menghasilkan vektor dengan dimensi 1024.
rsp = client.create('muge_embedding', 1024)
if not rsp:
raise DashVectorException(rsp.code, reason=rsp.message)
# Hasilkan penyematan gambar dalam batch dan simpan vektornya.
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"Mulai mengindeks data validasi Muge. Total ukuran data: {TOTAL_DATA_NUM}, Ukuran batch: {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]
# Hasilkan vektor penyematan gambar dengan model 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("Selesai mengindeks data validasi Muge.")
Model berjalan di CPU secara default. Menjalankannya di GPU meningkatkan performa.
2. Ambil data menggunakan kueri teks
Dengan data gambar yang telah disimpan, ubah kueri teks menjadi vektor menggunakan model CLIP yang sama, lalu ambil gambar serupa melalui API 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
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):
# Inisialisasi client DashVector
client = Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'
)
# Dapatkan koleksi yang sebelumnya telah disimpan.
collection = client.get('muge_embedding')
# Dapatkan vektor penyematan untuk kueri teks.
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'] # Tensor 2D, [jumlah teks, dimensi fitur]
text_vector = text_embedding.detach().cpu().numpy()[0]
# Ambil vektor dengan 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 = "a dog wearing glasses"
images = multimodal_search(text_query)
for img in images:
# Catatan: Fungsi show() mungkin memerlukan instalasi komponen penampil gambar yang diperlukan agar berfungsi di Server Linux.
# Jalankan kode ini di server yang mendukung Jupyter Notebook.
img.show()
Jalankan kode tersebut. Output-nya adalah sebagai berikut:


