Chuyển đến nội dung

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

Giới thiệu

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



Xem: Cách thức hoạt động của Tìm kiếm Tương tự | Tìm kiếm Trực quan Sử dụng OpenAI CLIP, META FAISS và Gói Ultralytics 🎉

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

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

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

  • CLIP sử dụng bộ mã hóa hình ảnh (ví dụ: ResNet hoặc ViT) cho hình ảnh và bộ mã hóa văn bản (dựa trên Transformer) cho ngôn ngữ để chiếu cả hai vào cùng một không gian nhúng đ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 cách sử dụng độ tương đồng cosine.
  • 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 chóng, có khả năng mở rộng các vectơ 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 bằng ngôn ngữ tự nhiên và hiển thị các hình ảnh khớp 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 ảnh ngữ nghĩa sử dụng gói Ultralytics Python

Cảnh báo đườ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, hình ảnh có thể không xuất hiện trên trang web do giới hạn 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 i.e "cpu" or "cuda"
)

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

VisualAISearch class

Lớp này thực hiện tất cả các hoạt động backend:

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

Tìm kiếm ảnh tương tự

Cảnh báo đườ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, hình ảnh có thể không xuất hiện trên trang web do giới hạn 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 i.e "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

VisualAISearch Tham số

Bảng dưới đây phác thảo các tham số có sẵn cho VisualAISearch:

Đối số Loại Mặc định Mô tả
data str 'images' Đường dẫn đến thư mục hình ảnh được sử dụng cho tìm kiếm tương tự.
Đối số Loại Mặc định Mô tả
device str None Chỉ định thiết bị cho suy luận (ví dụ: cpu, cuda:0 hoặc 0). Cho phép người dùng lựa chọn giữa CPU, một GPU cụ thể hoặc các thiết bị tính toán khác để thực thi mô hình.

Ưu điểm của Tìm kiếm Ả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 một số ưu điểm thuyết phục:

  1. Khả năng Zero-Shot: Bạn không cần phải huấn luyện mô hình trên bộ dữ liệu cụ thể của mình. Tính 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ỳ bộ dữ liệu hình ảnh nào bằng ngôn ngữ tự nhiên dạng tự do, giúp tiết kiệm cả thời gian và tài nguyên.

  2. Khả năng Hiểu Giống Con Người: Không giống như các công cụ tìm kiếm dựa trên từ khóa, CLIP hiểu 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 quan hệ như "một đứa trẻ hạnh phúc trong tự 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 ả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. Phương pháp 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 bộ 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 theo thời gian thực ngay cả với hàng nghìn (hoặc hàng triệu) embedding.

    Quy trình xây dựng vector nhúng Meta FAISS

  5. Ứng dụng đa lĩnh vực: Dù bạn đang xây dựng kho lưu trữ ảnh cá nhân, công cụ khơi nguồn 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, ngăn xếp này vẫn thích ứng với nhiều lĩnh vực khác nhau mà không cần điều chỉnh nhiều.

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

CLIP hiểu 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, học cách kết nối thông tin trực quan và ngôn ngữ. Nó được huấn luyện trên một tập dữ liệu lớn gồm các hình ảnh được ghép nối với chú thích ngôn ngữ tự nhiên. Quá trình 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 nhúng 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 vectơ.

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

Điều làm cho CLIP nổi bật là khả năng khái quát hóa của nó. Thay vì chỉ được huấn luyện cho các nhãn hoặc tác vụ cụ thể, nó học hỏi 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 lái mô tô nước" hoặc "một cảnh quan giấc mơ siêu thực", làm cho 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 (Facebook AI Similarity Search) là một bộ công cụ giúp bạn tìm kiếm các vectơ chiều cao một cách rất hiệu quả. Khi CLIP biến hình ảnh của bạn thành embeddings, FAISS giúp bạn tìm thấy các kết quả phù hợp nhất với truy vấn văn bản một cách nhanh chóng và dễ dàng, hoàn hảo cho việc truy xuất hình ảnh theo thời gian thực.

Tại sao nên sử dụng gói Python Ultralytics nếu CLIP và FAISS đến từ OpenAI và Meta?

Mặc dù CLIP và FAISS được phát triển bởi OpenAI và Meta tương ứng, nhưng gói Ultralytics Python giúp đơ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 làm việc 2 dòng hoạt động ngay lập tức:

Tìm kiếm ả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 i.e "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

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 độ tương đồng cosine.
  • 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 người dùng của ứng dụng này không?

Đúng vậy, hoàn toàn có thể. Thiết lập hiện tại sử dụng Flask với giao diện người dùng HTML cơ bản, nhưng bạn có thể tự do thay thế HTML của riêng mình hoặc thậm chí xây dựng thứ gì đó năng động hơn với React, Vue hoặc một framework giao diện người dùng nào khác. Flask có thể dễ dàng phục vụ như một API backend cho giao diện tùy chỉnh của bạn.

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

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



📅 Đã tạo 3 tháng trước ✏️ Cập nhật 2 tháng trước

Bình luận