Tìm kiếm hình ảnh ngữ nghĩa với OpenAI CLIP và Meta FAISS

Giới thiệu

Hướng dẫn này sẽ giúp bạn xây dựng công cụ tìm kiếm hình ảnh ngữ nghĩa sử dụng OpenAI CLIP, Meta FAISS, và Flask. Bằng cách kết hợp các embedding thị giác-ngôn ngữ mạnh mẽ của CLIP với khả năng tìm kiếm láng giềng gần nhất hiệu quả của FAISS, bạn có thể tạo ra một giao diện web hoàn chỉnh, nơi bạn có thể truy xuất các hình ảnh liên quan bằng truy vấn ngôn ngữ tự nhiên.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

Xem trước trực quan về tìm kiếm hình ảnh ngữ nghĩa

Tổng quan trang web Flask với kết quả tìm kiếm ngữ nghĩa

Cách thức hoạt động

  • CLIP sử dụng một bộ mã hóa hình ảnh (ví dụ: ResNet hoặc ViT) cho hình ảnh và một bộ mã hóa văn bản (dựa trên Transformer) cho ngôn ngữ để đưa cả hai vào cùng một không gian embedding đa phương thức. Điều này cho phép so sánh trực tiếp giữa văn bản và hình ảnh bằng cosine similarity.
  • FAISS (Facebook AI Similarity Search) xây dựng một chỉ mục các embedding hình ảnh và cho phép truy xuất nhanh, có khả năng mở rộng các vector gần nhất với một truy vấn nhất định.
  • Flask cung cấp một giao diện web đơn giản để gửi các truy vấn ngôn ngữ tự nhiên và hiển thị các hình ảnh phù hợp về mặt ngữ nghĩa từ chỉ mục.

Kiến trúc này hỗ trợ tìm kiếm zero-shot, nghĩa là bạn không cần nhãn hoặc danh mục, chỉ cần dữ liệu hình ảnh và một prompt tốt.

Tìm kiếm hình ảnh ngữ nghĩa sử dụng gói Ultralytics Python
Cảnh báo về đường dẫn hình ảnh

Nếu bạn đang sử dụng hình ảnh của riêng mình, hãy đảm bảo cung cấp đường dẫn tuyệt đối đến thư mục hình ảnh. Nếu không, các hình ảnh có thể không xuất hiện trên trang web do hạn chế về phục vụ tệp của Flask.

from ultralytics import solutions

app = solutions.SearchApp(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cpu"  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

Lớp VisualAISearch

Lớp này thực hiện tất cả các thao tác backend:

  • Tải hoặc xây dựng một chỉ mục FAISS từ các hình ảnh cục bộ.
  • Trích xuất các embedding hình ảnh và văn bản bằng CLIP.
  • Thực hiện tìm kiếm tương đồng bằng cosine similarity.
Tìm kiếm hình ảnh tương tự
Cảnh báo về đường dẫn hình ảnh

Nếu bạn đang sử dụng hình ảnh của riêng mình, hãy đảm bảo cung cấp đường dẫn tuyệt đối đến thư mục hình ảnh. Nếu không, các hình ảnh có thể không xuất hiện trên trang web do hạn chế về phục vụ tệp của Flask.

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Các tham số của VisualAISearch

Bảng dưới đây liệt kê các tham số khả dụng cho VisualAISearch:

Đối sốLoạiMặc địnhMô tả
datastr'images'Đường dẫn đến thư mục hình ảnh được sử dụng để tìm kiếm sự tương đồng.
Đối sốLoạiMặc địnhMô tả
devicestrNoneChỉ định thiết bị thực hiện suy luận (ví dụ: cpu, cuda:0 hoặc 0). Cho phép người dùng chọn giữa CPU, một GPU cụ thể hoặc các thiết bị tính toán khác để chạy model.

Ưu điểm của tìm kiếm hình ảnh ngữ nghĩa với CLIP và FAISS

Xây dựng hệ thống tìm kiếm hình ảnh ngữ nghĩa của riêng bạn với CLIP và FAISS mang lại nhiều ưu điểm hấp dẫn:

  1. Khả năng Zero-Shot: Bạn không cần huấn luyện mô hình trên tập dữ liệu cụ thể của mình. Khả năng học zero-shot của CLIP cho phép bạn thực hiện các truy vấn tìm kiếm trên bất kỳ tập dữ liệu hình ảnh nào bằng ngôn ngữ tự nhiên tự do, giúp tiết kiệm cả thời gian và tài nguyên.

  2. Sự thấu hiểu giống con người: Khác với các công cụ tìm kiếm dựa trên từ khóa, CLIP hiểu được ngữ cảnh ngữ nghĩa. Nó có thể truy xuất hình ảnh dựa trên các truy vấn trừu tượng, cảm xúc hoặc liên quan như "một đứa trẻ hạnh phúc trong thiên nhiên" hoặc "đường chân trời thành phố tương lai vào ban đêm".

    Quy trình truy xuất hình ảnh OpenAI CLIP

  3. Không cần nhãn hoặc siêu dữ liệu: Các hệ thống tìm kiếm hình ảnh truyền thống yêu cầu dữ liệu được gắn nhãn cẩn thận. Cách tiếp cận này chỉ cần hình ảnh thô. CLIP tạo ra các embedding mà không cần bất kỳ chú thích thủ công nào.

  4. Tìm kiếm linh hoạt và có khả năng mở rộng: FAISS cho phép tìm kiếm láng giềng gần nhất nhanh chóng ngay cả với các tập dữ liệu quy mô lớn. Nó được tối ưu hóa cho tốc độ và bộ nhớ, cho phép phản hồi thời gian thực ngay cả với hàng ngàn (hoặc hàng triệu) embedding.

    Quy trình xây dựng vector embedding của Meta FAISS

  5. Ứng dụng đa miền: Cho dù bạn đang xây dựng kho lưu trữ ảnh cá nhân, công cụ truyền cảm hứng sáng tạo, công cụ tìm kiếm sản phẩm hay thậm chí là hệ thống gợi ý nghệ thuật, stack công nghệ này thích ứng với các lĩnh vực đa dạng với việc tinh chỉnh tối thiểu.

Câu hỏi thường gặp (FAQ)

CLIP hiểu cả hình ảnh và văn bản như thế nào?

CLIP (Contrastive Language Image Pretraining) là một mô hình được phát triển bởi OpenAI giúp kết nối thông tin thị giác và ngôn ngữ. Nó được huấn luyện trên một tập dữ liệu khổng lồ gồm các hình ảnh được ghép đôi với chú thích ngôn ngữ tự nhiên. Việc huấn luyện này cho phép nó ánh xạ cả hình ảnh và văn bản vào một không gian embedding chung, vì vậy bạn có thể so sánh chúng trực tiếp bằng cách sử dụng độ tương đồng vector.

Tại sao CLIP được coi là rất mạnh mẽ cho các tác vụ AI?

Điều làm cho CLIP trở nên nổi bật là khả năng khái quát hóa. Thay vì chỉ được huấn luyện cho các nhãn hoặc tác vụ cụ thể, nó học từ chính ngôn ngữ tự nhiên. Điều này cho phép nó xử lý các truy vấn linh hoạt như “một người đàn ông đang lái mô tô nước” hoặc “một khung cảnh giấc mơ siêu thực”, giúp nó hữu ích cho mọi thứ từ phân loại đến tìm kiếm ngữ nghĩa sáng tạo, mà không cần huấn luyện lại.

FAISS thực sự làm gì trong dự án này (Tìm kiếm ngữ nghĩa)?

FAISS (Facebook AI Similarity Search) là một bộ công cụ giúp bạn tìm kiếm qua các vector có số chiều cao rất hiệu quả. Khi CLIP chuyển đổi hình ảnh của bạn thành các embedding, FAISS giúp việc tìm kiếm các kết quả gần nhất với truy vấn văn bản trở nên nhanh chóng và dễ dàng, hoàn hảo cho việc truy xuất hình ảnh thời gian thực.

Tại sao sử dụng Ultralytics Python package nếu CLIP và FAISS là từ OpenAI và Meta?

Mặc dù CLIP và FAISS được phát triển lần lượt bởi OpenAI và Meta, gói Python của Ultralytics đơn giản hóa việc tích hợp chúng vào một quy trình tìm kiếm hình ảnh ngữ nghĩa hoàn chỉnh trong một quy trình 2 dòng code hoạt động ngay lập tức:

Tìm kiếm hình ảnh tương tự
from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Cách triển khai cấp cao này xử lý:

  • Tạo embedding hình ảnh và văn bản dựa trên CLIP.
  • Tạo và quản lý chỉ mục FAISS.
  • Tìm kiếm ngữ nghĩa hiệu quả với cosine similarity.
  • Tải hình ảnh dựa trên thư mục và trực quan hóa.

Tôi có thể tùy chỉnh giao diện frontend của ứng dụng này không?

Có. Thiết lập hiện tại sử dụng Flask với giao diện HTML cơ bản, nhưng bạn có thể thay thế nó bằng HTML của riêng mình hoặc xây dựng giao diện người dùng năng động hơn với React, Vue hoặc một framework frontend khác. Flask có thể đóng vai trò là API backend cho giao diện tùy chỉnh của bạn.

Có thể tìm kiếm thông qua video thay vì hình ảnh tĩnh không?

Không trực tiếp. Một giải pháp thay thế đơn giản là trích xuất các khung hình riêng lẻ từ video của bạn (ví dụ: một khung hình mỗi giây), coi chúng như các hình ảnh độc lập và đưa chúng vào hệ thống. Theo cách này, công cụ tìm kiếm có thể lập chỉ mục ngữ nghĩa cho các khoảnh khắc hình ảnh từ video của bạn.

Bình luận