全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Implementasi pengambilan data gambar-teks lintas modal dengan menggunakan TairVector

更新时间:Jul 02, 2025

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

  1. 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".

  2. Sambungkan ke instance Tair Anda. Untuk implementasi kode spesifik, lihat fungsi get_tair dalam contoh kode berikut.

  3. 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_index dalam contoh kode berikut.

  4. 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_images dan upsert_text dalam contoh kode berikut.多模检索..jpeg

  5. 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_text dalam 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_image dalam contoh kode berikut.

    Catatan
    • Anda tidak perlu menyimpan teks dan gambar yang digunakan untuk mengambil data di instance Tair.

    • TVS.KNNSEARCH memungkinkan Anda menggunakan parameter topK untuk menentukan jumlah hasil yang akan dikembalikan. Semakin kecil nilai parameter distance, 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.

    以文搜图,奔跑的狗..jpeg

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

    奔跑的狗(搜索图)..jpeg

    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.