YOLO Vision 2026:

Cách xây dựng công cụ tìm kiếm hình ảnh ngữ nghĩa (semantic image search) với OpenAI CLIP#

Hướng dẫn này dẫn dắt bạn qua quá trình xây dựng một công cụ tìm kiếm hình ảnh ngữ nghĩa bằng cách sử dụng OpenAI CLIPFlask. Bằng cách kết hợp các embedding thị giác-ngôn ngữ của CLIP với tìm kiếm độ tương tự cosine nhanh chóng được hỗ trợ bởi NumPy, bạn có thể xây dựng một giao diện web có khả năng truy xuất các hình ảnh có liên quan từ các truy vấn bằng ngôn ngữ tự nhiên mà không cần nhãn hoặc danh mục.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

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

Gói Python của Ultralytics đóng gói toàn bộ chuỗi quy trình này đằng sau hai class, giúp bạn có thể khởi chạy một ứng dụng tìm kiếm hoạt động được hoặc chạy các truy vấn theo chương trình chỉ trong vài dòng. Hướng dẫn này bao gồm tại sao tìm kiếm ngữ nghĩa lại hữu ích, cách thức hoạt động, chạy ứng dụng web, tìm kiếm theo chương trình, và cấu hình các tham số.

Tại sao nên sử dụng tìm kiếm hình ảnh ngữ nghĩa?#

Việc 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 mang lại một số lợi thế hấp dẫn:

  • Khả năng zero-shot: Bạn không cần phải huấn luyện trên tập dữ liệu của mình. Học zero-shot của CLIP cho phép bạn truy vấn bất kỳ bộ sưu tập hình ảnh nào bằng ngôn ngữ tự nhiên tự do, giúp tiết kiệm thời gian và tài nguyên.
  • Khả năng hiểu như con người: Khác với tìm kiếm bằng từ khóa, CLIP hiểu ngữ cảnh ngữ nghĩa và truy xuất hình ảnh từ các truy vấn trừu tượng, cảm xúc hoặc mang tính liên hệ 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."
  • Không cần nhãn hoặc siêu dữ liệu: Phương pháp này chỉ cần dữ liệu ảnh thô. CLIP tự tạo ra các embedding mà không cần bất kỳ thao tác gắn nhãn thủ công nào.
  • Tìm kiếm nhẹ và chính xác: Một phép nhân ma trận chuẩn hóa duy nhất trong NumPy sẽ xếp hạng mọi hình ảnh theo độ tương đồng cosine, mang lại kết quả chính xác với phản hồi thời gian thực trên hàng nghìn embedding mà không cần cài đặt hoặc quản lý thêm phụ thuộc tìm kiếm nào.
  • Ứng dụng đa lĩnh vực: 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 hệ thống gợi ý nghệ thuật, cùng một ngăn xếp công nghệ này đều có thể thích ứng với rất ít tùy chỉnh.

Cách thức tìm kiếm hình ảnh ngữ nghĩa hoạt động#

Pipeline này kết hợp ba thành phần, mỗi thành phần xử lý một giai đoạn chuyển đổi hình ảnh và văn bản thành các kết quả có thứ hạng:

  • CLIP sử dụng bộ mã hóa thị giác (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 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 cách sử dụng độ tương tự cosine.
  • NumPy lưu trữ các embedding hình ảnh dưới dạng một mảng duy nhất và xếp hạng chúng so với một embedding truy vấn bằng một phép nhân ma trận, trả về các vector gần nhất theo độ tương đồng cosine mà không cần phụ thuộc vào chỉ mục (indexing) bổ sung.
  • Flask cung cấp 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ừ index.

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

Vì cả hình ảnh và văn bản đều nằm trong cùng một không gian vector, việc truy xuất là zero-shot: bạn không cần nhãn hay danh mục, chỉ cần dữ liệu ảnh và một câu lệnh (prompt) tốt.

Chạy ứng dụng web tìm kiếm ngữ nghĩa#

Class SearchApp khởi chạy toàn bộ giao diện Flask. Trong lần chạy đầu tiên, nó tải xuống một tập dữ liệu hình ảnh mẫu, xây dựng chỉ mục embedding và phục vụ một trang nơi bạn có thể nhập truy vấn và xem các kết quả được xếp hạng.

Cảnh báo về đường dẫn ảnh

Nếu bạn 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 chứa ảnh. Nếu không, hình ảnh có thể không hiển thị trên trang web do hạn chế về phục vụ tệp tin của Flask.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the 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

Tìm kiếm hình ảnh theo lập trình#

Class VisualAISearch thực hiện tất cả các thao tác backend mà không cần lớp web:

  • Tải hoặc xây dựng một chỉ mục embedding từ các hình ảnh cục bộ.
  • Trích xuất 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.

Gọi trình tìm kiếm với truy vấn ngôn ngữ tự nhiên để nhận lại danh sách các tên tệp hình ảnh khớp, được xếp hạng theo độ tương đồng:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # 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ấu hình các tham số VisualAISearch#

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

Đối sốLoạiMặc địnhMô tả
datastr'images'Đường dẫn đến thư mục hình ảnh để lập chỉ mục và tìm kiếm.
devicestr'cpu'Thiết bị được sử dụng để suy luận CLIP (ví dụ: cpu, cuda, 0).
Quản lý dữ liệu của bạn trên đám mây

Để tìm kiếm các bộ sưu tập hình ảnh ở quy mô sản xuất mà không phải quản lý các tệp cục bộ, bạn có thể tổ chức và quản lý phiên bản cho hình ảnh của mình trong Ultralytics Platform trước khi lập chỉ mục chúng bằng CLIP.

Kết luận#

Với CLIP và gói Python của Ultralytics, bạn có thể thiết lập một công cụ tìm kiếm hình ảnh ngữ nghĩa zero-shot chỉ trong vài dòng, dưới dạng ứng dụng web Flask hoặc dưới dạng backend tìm kiếm theo chương trình. Từ đây, hãy trỏ data tới thư mục hình ảnh của riêng bạn để lập chỉ mục, sau đó khám phá các Ultralytics Solutions khác để xây dựng dựa trên các quy trình thị giác máy tính của bạn.

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

  • CLIP (Contrastive Language Image Pretraining) là một mô hình được phát triển bởi OpenAI có khả năng học cách kết nối thông tin trực quan và ngôn ngữ. Mô hình này được huấn luyện trên một tập dữ liệu khổng lồ gồm các hình ảnh đi kèm với chú thích bằng 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 embedding chung, nhờ đó bạn có thể so sánh chúng trực tiếp bằng cách sử dụng độ tương tự vector.

  • Điều làm nên sự nổi bật của CLIP là khả năng tổng 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.

  • Sau khi CLIP chuyển đổi hình ảnh của bạn thành các embedding, gói Ultralytics sẽ chuẩn hóa L2 các embedding đó và lưu trữ chúng trong một mảng NumPy duy nhất. Một truy vấn được xếp hạng bằng một phép nhân ma trận duy nhất tính toán độ tương tự cosine giữa embedding truy vấn và mọi embedding hình ảnh, sau đó sắp xếp các điểm số. Tìm kiếm vét cạn (brute-force) này vừa chính xác vừa nhanh chóng đối với các bộ sưu tập hình ảnh thông thường, không cần thêm phụ thuộc cơ sở dữ liệu vector nào để cài đặt hoặc quản lý.

  • Mặc dù CLIP được phát triển bởi OpenAI, Ultralytics Python package vẫn gói gọn việc tạo embedding, lập chỉ mục và tìm kiếm độ tương tự cosine thành một chuỗi quy trình tìm kiếm hình ảnh ngữ nghĩa hoàn chỉnh đằng sau một vài dòng mã hoạt động ngay lập tức:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Việc 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 embedding.
    • 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.
  • Có. Thiết lập hiện tại sử dụng Flask với một frontend HTML cơ bản, nhưng bạn có thể thay thế nó bằng HTML của riêng bạn hoặc xây dựng một giao diện người dùng (UI) động hơn với React, Vue hoặc các framework frontend khác. Flask có thể đóng vai trò là REST API backend cho giao diện tùy chỉnh của bạn.

  • 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. Bằng cách này, công cụ tìm kiếm có thể index các khoảnh khắc thị giác từ video của bạn một cách ngữ nghĩa.

Bình luận