0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng dẫn Tìm Kiếm Hình Ảnh bằng Dịch Vụ Multimodal Embedding của Google Cloud Platform

Đăng vào 2 tuần trước

• 5 phút đọc

Giới thiệu

Chào các bạn! Gần đây, mình đã tham gia sự kiện Cloud Summit AI do GCP tổ chức và cảm thấy có rất nhiều kiến thức hay và dễ hiểu dành cho những người mới tiếp cận AI như mình. Hôm nay, mình muốn chia sẻ một cách nhìn tổng quát về công nghệ tìm kiếm hình ảnh từ góc độ của người "non-AI" thông qua dịch vụ Multimodal Embedding trên Google Cloud Platform (GCP).

Dịch vụ Multimodal Embedding là gì?

Dịch vụ Multimodal Embedding cho phép người dùng tạo vector embedding cho cả dữ liệu dạng văn bản và hình ảnh. Điều này rất hữu ích trong việc tìm kiếm và phân tích dữ liệu, giúp cải thiện khả năng tìm kiếm hình ảnh dựa trên nội dung văn bản tương ứng.

Hướng dẫn tạo tài khoản GCP và sử dụng dịch vụ Multimodal Embedding

Trước khi bắt đầu, bạn cần tạo một tài khoản trên GCP. Dưới đây là các bước cần thực hiện:

  1. Tạo tài khoản: Truy cập Google Cloud Platform và tạo một tài khoản.
  2. Tạo dự án mới: Tạo một project mới và kích hoạt dịch vụ Vertex AI API.
  3. Tạo thông tin xác thực: Vào phần IAM & Services -> Credentials và tạo một service account. Tải xuống file credentials.json để sử dụng cho ứng dụng của bạn.

Nếu bạn mới bắt đầu, có thể tham khảo hướng dẫn tại đây.

Thực hành Tìm Kiếm Hình Ảnh

Trước khi thực hiện đoạn mã, bạn cần cài đặt một số phần mềm như Python và Elasticsearch:

Copy
Python >= 3.12.1
Elasticsearch >= 7.17.17

Bạn cũng có thể sử dụng Docker để dễ dàng hơn trong việc quản lý môi trường.

Cài đặt môi trường

bash Copy
https://gitlab.com/doanthephuc/multimodalembeddinggcp.git
cd multimodalembeddinggcp
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python process.py

Nếu bạn sử dụng Linux, hãy thay đổi lệnh python thành python3.12 cho tương thích với phiên bản cài đặt.

Tạo chỉ mục lưu trữ vector trong Elasticsearch

Đoạn mã dưới đây giúp bạn tạo chỉ mục lưu trữ vector trong Elasticsearch:

python Copy
from dotenv import load_dotenv
from vertexai.vision_models import MultiModalEmbeddingModel
from vertexai.preview.vision_models import Image
import os
from elasticsearch import Elasticsearch

load_dotenv()

es = Elasticsearch([os.getenv("ELASTIC_SEARCH_DOMAIN")])
index_name = "product_vectors"
if not es.indices.exists(index=index_name):
    es.indices.create(
        index=index_name,
        body={
            "mappings": {
                "properties": {
                    "vector_of_image": {
                        "type": "dense_vector",
                        "dims": 1408,
                    },
                    "image_name": {"type": "text"},
                }
            }
        },
    )

Ở đây, chúng ta sử dụng kiểu dense_vector để lưu trữ dữ liệu. Kích thước vector mặc định là 1408, bạn có thể điều chỉnh lại cho phù hợp với nhu cầu của mình.

Nhúng hình ảnh thành vector

Bên dưới là đoạn mã giúp bạn thực hiện embedding cho những hình ảnh trong thư mục product_images:

python Copy
def embedding_images():
    folder_path = "product_images"
    files = os.listdir(folder_path)
    model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")
    for file in files:
        image = Image.load_from_file("product_images/" + file)
        embeddings = model.get_embeddings(image=image, dimension=1408)
        document = {"vector_of_image": embeddings.image_embedding, "image_name": file}
        es.index(index=index_name, body=document)

Sau khi quá trình embedding hoàn tất, dữ liệu sẽ được lưu lại trong Elasticsearch.

So sánh kết quả từ hình ảnh với văn bản

Dưới đây là cách embedding cho nội dung văn bản và sử dụng phép so sánh cosine để tìm kiếm hình ảnh tương ứng:

python Copy
def search_related_images(content):
    model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")
    embeddings = model.get_embeddings(contextual_text=content, dimension=1408)
    search_query = {
        "query": {
            "script_score": {
                "query": {"match_all": {}},
                "script": {
                    "source": "cosineSimilarity(params.queryVector, 'vector_of_image') + 1.0",
                    "params": {"queryVector": embeddings.text_embedding},
                },
            }
        }
    }
    results = es.search(index=index_name, body=search_query)
    for hit in results["hits"]["hits"]:
        print(f"Score: {hit['_score']} - Image: {hit['_source']['image_name']}")

Khi chạy hàm này với từ khóa như "television", bạn sẽ nhận được các hình ảnh liên quan với điểm số tương ứng.

Kết luận

Thông qua bài viết này, mình đã giới thiệu về dịch vụ Multimodal Embedding trên GCP và cách tìm kiếm hình ảnh một cách cơ bản nhất. Ngoài ra, GCP còn rất nhiều dịch vụ hấp dẫn khác có thể giúp bạn phát triển kỹ năng trong lĩnh vực AI. Hy vọng rằng bạn có thể thử nghiệm và tạo ra những ứng dụng thú vị như mình trong tương lai!

Mình xin cảm ơn các bạn đã dành thời gian đọc bài viết này. Nếu có ý kiến đóng góp, hãy để lại ý kiến dưới bài viết. Chúc các bạn ngày càng phát triển trong lĩnh vực công nghệ!

Link tham khảo repository: multimodalembeddinggcp
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào