Topik ini menjelaskan cara mengimplementasikan pengambilan data gambar-teks lintas modal menggunakan TairVector.
Informasi latar belakang
Internet dipenuhi oleh informasi tidak terstruktur. Dalam konteks ini, model seperti jaringan saraf Contrastive Language-Image Pre-Training (CLIP) muncul untuk memenuhi kebutuhan pengambilan data lintas modal. Akademi DAMO menyediakan model CLIP sumber terbuka yang memiliki arsitektur Text Transformer dan ResNet bawaan untuk mengekstraksi fitur dari data tidak terstruktur dan mengurai mereka menjadi data terstruktur.
Dengan Tair, Anda dapat menggunakan CLIP untuk memproses data tidak terstruktur seperti gambar dan dokumen, menyimpan hasilnya di instance Tair Anda, dan kemudian menggunakan algoritma pencarian tetangga terdekat (ANN) dari TairVector untuk mengimplementasikan pengambilan data gambar-teks lintas modal. Untuk informasi lebih lanjut tentang TairVector, lihat Vektor.
Ikhtisar solusi
Unduh gambar sebagai data uji.
Dalam contoh ini, data uji berikut digunakan:
Gambar: lebih dari 7.000 gambar hewan peliharaan dari dataset sumber terbuka di Extreme Mart.
Teks: "seekor anjing", "seekor anjing putih", dan "seekor anjing putih yang sedang berlari".
Sambungkan ke instance Tair Anda. Untuk implementasi kode spesifik, lihat fungsi
get_tairdalam contoh kode berikut.Buat dua indeks vektor di instance Tair, satu untuk vektor fitur gambar dan satu untuk vektor fitur teks. Untuk implementasi kode spesifik, lihat fungsi
create_indexdalam contoh kode berikut.Tulis gambar dan teks sebelumnya ke instance Tair.
Dalam kasus ini, CLIP digunakan untuk memproses gambar dan teks. Kemudian, perintah TVS.HSET dari TairVector dijalankan untuk menulis nama dan informasi fitur gambar serta teks ke instance Tair. Untuk implementasi kode spesifik, lihat fungsi
insert_imagesdanupsert_textdalam contoh kode berikut.
Lakukan pengambilan data lintas modal pada instance Tair.
Gunakan teks untuk mengambil gambar
Gunakan CLIP untuk memproses teks dan jalankan perintah TVS.KNNSEARCH dari TairVector untuk mengambil gambar yang paling mirip dengan deskripsi teks dari instance Tair. Untuk implementasi kode spesifik, lihat fungsi
query_images_by_textdalam contoh kode berikut.Gunakan gambar untuk mengambil teks
Gunakan CLIP untuk memproses gambar dan jalankan perintah TVS.KNNSEARCH dari TairVector untuk mengambil teks yang paling mirip dengan apa yang ditunjukkan oleh gambar dari instance Tair. Untuk implementasi kode spesifik, lihat fungsi
query_texts_by_imagedalam contoh kode berikut.
CatatanAnda tidak perlu menyimpan teks dan gambar yang digunakan untuk mengambil data di instance Tair.
TVS.KNNSEARCH memungkinkan Anda menggunakan parameter
topKuntuk menentukan jumlah hasil yang akan dikembalikan. Semakin kecil nilai parameterdistance, semakin tinggi kesamaan antara teks atau gambar dan data yang diambil.
Contoh kode
Dalam contoh ini, Python 3.8 digunakan, dan dependensi berikut diinstal: Tair-py, torch, Image, pylab, plt, dan CLIP. Anda dapat menjalankan perintah pip3 install tair untuk menginstal Tair-py.
# -*- coding: utf-8 -*-
# !/usr/bin/env python
from tair import Tair
from tair.tairvector import DistanceMetric
from tair import ResponseError
from typing import List
import torch
from PIL import Image
import pylab
from matplotlib import pyplot as plt
import os
import cn_clip.clip as clip
from cn_clip.clip import available_models
def get_tair() -> Tair:
"""
Metode ini digunakan untuk menyambungkan ke instance Tair.
* host: titik akhir yang digunakan untuk menyambungkan ke instance Tair.
* port: nomor port yang digunakan untuk menyambungkan ke instance Tair. Nilai default: 6379.
* password: kata sandi akun database default dari instance Tair. Jika Anda ingin menyambungkan ke instance Tair menggunakan akun database kustom, Anda harus menentukan kata sandi dalam format username:kata sandi.
"""
tair: Tair = Tair(
host="r-8vbehg90y9rlk9****pd.redis.rds.aliyuncs.com",
port=6379,
db=0,
password="D******3",
decode_responses=True
)
return tair
def create_index():
"""
Buat dua indeks vektor di instance Tair, satu untuk vektor fitur gambar dan satu untuk vektor fitur teks.
Indeks vektor untuk vektor fitur gambar diberi nama index_images. Indeks vektor untuk vektor fitur teks diberi nama index_texts.
* Dimensi vektor adalah 1024.
* Rumus perkalian dalam digunakan.
* Algoritma pengindeksan Hierarchical Navigable Small World (HNSW) digunakan.
"""
ret = tair.tvs_get_index("index_images")
if ret is None:
tair.tvs_create_index("index_images", 1024, distance_type="IP",
index_type="HNSW")
ret = tair.tvs_get_index("index_texts")
if ret is None:
tair.tvs_create_index("index_texts", 1024, distance_type="IP",
index_type="HNSW")
def insert_images(image_dir):
"""
Tentukan direktori gambar yang ingin Anda simpan di instance Tair. Metode ini secara otomatis melintasi semua gambar di direktori ini.
Selain itu, metode ini memanggil metode extract_image_features untuk menggunakan CLIP memproses gambar, mengembalikan vektor fitur dari gambar-gambar ini, dan kemudian menyimpan vektor fitur ini di instance Tair.
Vektor fitur gambar disimpan dengan informasi berikut:
* Nama indeks vektor: index_images.
* Kunci: jalur gambar yang berisi nama gambar. Contoh: test/images/boxer_18.jpg.
* Informasi fitur: Dimensi vektor adalah 1024.
"""
file_names = [f for f in os.listdir(image_dir) if (f.endswith('.jpg') or f.endswith('.jpeg'))]
for file_name in file_names:
image_feature = extract_image_features(image_dir + "/" + file_name)
tair.tvs_hset("index_images", image_dir + "/" + file_name, image_feature)
def extract_image_features(img_name):
"""
Metode ini menggunakan CLIP untuk memproses gambar dan mengembalikan vektor fitur dari gambar-gambar ini. Dimensi vektor adalah 1024.
"""
image_data = Image.open(img_name).convert("RGB")
infer_data = preprocess(image_data)
infer_data = infer_data.unsqueeze(0).to("cuda")
with torch.no_grad():
image_features = model.encode_image(infer_data)
image_features /= image_features.norm(dim=-1, keepdim=True)
return image_features.cpu().numpy()[0] # [1, 1024]
def upsert_text(text):
"""
Tentukan teks yang ingin Anda simpan di instance Tair. Metode ini memanggil metode extract_text_features untuk menggunakan CLIP memproses teks, mengembalikan vektor fitur dari teks-teks ini, dan kemudian menyimpan vektor fitur di instance Tair.
Vektor fitur teks disimpan dengan informasi berikut:
* Nama indeks vektor: index_texts.
* Kunci: isi teks. Contoh: seekor anjing yang sedang berlari.
* Informasi fitur: Dimensi vektor adalah 1024.
"""
text_features = extract_text_features(text)
tair.tvs_hset("index_texts", text, text_features)
def extract_text_features(text):
"""
Metode ini menggunakan CLIP untuk memproses teks dan mengembalikan vektor fitur dari teks-teks ini. Dimensi vektor adalah 1024.
"""
text_data = clip.tokenize([text]).to("cuda")
with torch.no_grad():
text_features = model.encode_text(text_data)
text_features /= text_features.norm(dim=-1, keepdim=True)
return text_features.cpu().numpy()[0] # [1, 1024]
def query_images_by_text(text, topK):
"""
Metode ini menggunakan teks untuk mengambil gambar.
Tentukan isi teks sebagai parameter teks dan jumlah hasil yang ingin dikembalikan oleh Tair sebagai parameter topK.
Metode ini menggunakan CLIP untuk memproses teks dan menjalankan perintah TVS.KNNSEARCH dari TairVector untuk mengambil gambar yang paling mirip dengan apa yang dijelaskan oleh teks dari instance Tair.
Metode ini mengembalikan nilai parameter distance dan kunci gambar yang diambil. Semakin kecil nilai parameter distance dari gambar yang diambil, semakin tinggi kesamaan antara teks yang ditentukan dan gambar.
"""
text_feature = extract_text_features(text)
result = tair.tvs_knnsearch("index_images", topK, text_feature)
for k, s in result:
print(f'key : {k}, distance : {s}')
img = Image.open(k.decode('utf-8'))
plt.imshow(img)
pylab.show()
def query_texts_by_image(image_path, topK=3):
"""
Metode ini menggunakan gambar untuk mengambil teks.
Tentukan jumlah hasil yang ingin dikembalikan oleh Tair sebagai nilai parameter topK dan jalur gambar.
Metode ini menggunakan CLIP untuk memproses gambar dan menjalankan perintah TVS.KNNSEARCH dari TairVector untuk mengambil teks yang paling mirip dengan apa yang ditunjukkan oleh gambar dari instance Tair.
Metode ini mengembalikan nilai parameter distance dan kunci teks yang diambil. Semakin kecil nilai parameter distance dari teks yang diambil, semakin tinggi kesamaan antara gambar yang ditentukan dan teks.
"""
image_feature = extract_image_features(image_path)
result = tair.tvs_knnsearch("index_texts", topK, image_feature)
for k, s in result:
print(f'text : {k}, distance : {s}')
if __name__ == "__main__":
# Buat dua indeks vektor di instance Tair, satu untuk vektor fitur gambar dan satu untuk vektor fitur teks.
tair = get_tair()
create_index()
# Muat CLIP.
model, preprocess = clip.load_from_name("RN50", device="cuda", download_root="./")
model.eval()
# Tulis jalur dataset contoh gambar. Contoh: /home/CLIP_Demo.
insert_images("/home/CLIP_Demo")
# Tulis teks contoh berikut: "seekor anjing", "seekor anjing putih", "seekor anjing putih yang sedang berlari".
upsert_text("seekor anjing")
upsert_text("seekor anjing putih")
upsert_text("seekor anjing putih yang sedang berlari")
# Gunakan teks "seekor anjing yang sedang berlari" untuk mengambil tiga gambar yang menunjukkan seekor anjing yang sedang berlari.
query_images_by_text("seekor anjing yang sedang berlari", 3)
# Tentukan jalur gambar untuk mengambil teks yang menggambarkan apa yang ditunjukkan oleh gambar.
query_texts_by_image("/home/CLIP_Demo/boxer_18.jpg",3)Hasil
Gunakan teks "seekor anjing yang sedang berlari" untuk mengambil tiga gambar yang menunjukkan seekor anjing yang sedang berlari.

Gunakan gambar berikut untuk mengambil teks yang menggambarkan apa yang ditunjukkan oleh gambar.

Kode berikut menunjukkan hasil:
{ "results":[ { "text":"seekor anjing putih yang sedang berlari", "distance": "0,4052203893661499" }, { "text":"seekor anjing putih", "distance": "0,44666868448257446" }, { "text":"seekor anjing", "distance": "0,4553511142730713" } ] }
Ringkasan
Tair adalah layanan database dalam memori yang memungkinkan Anda menggunakan algoritma pengindeksan seperti HNSW untuk mempercepat pengambilan data dan menggabungkan CLIP serta TairVector untuk pengambilan data gambar-teks lintas modal.
Tair dapat digunakan dalam skenario seperti rekomendasi produk dan penulisan berdasarkan gambar. Selain itu, Anda dapat mengganti CLIP di Tair dengan model penyematan lain untuk mengimplementasikan pengambilan data video-teks atau audio-teks lintas modal.