Ultralytics YOLO27:
Get Started

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

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



Xem: Cách hoạt động của tìm kiếm tương đồng | Tìm kiếm trực quan bằng OpenAI CLIP và package Ultralytics 🎉

Trang web Flask hiển thị tổng quan kết quả tìm kiếm ngữ nghĩa

Package Ultralytics Python đóng gói toàn bộ pipeline này đằng sau hai lớp, cho phép bạn khởi chạy ứng dụng tìm kiếm hoàn chỉnh hoặc chạy truy vấn bằng code chỉ với vài dòng. Hướng dẫn này bao gồm lý do tìm kiếm ngữ nghĩa hữu ích, cách thức hoạt động, chạy ứng dụng web, tìm kiếm bằng code và cấu hình tham số.

Tự xây dựng hệ thống tìm kiếm hình ảnh ngữ nghĩa bằng CLIP mang lại một số lợi ích nổi bật:

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

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

Pipeline kết hợp ba thành phần, mỗi thành phần đảm nhiệm một giai đoạn chuyển hình ảnh và văn bản thành kết quả được xếp hạng:

  • CLIP sử dụng encoder thị giác (ví dụ: ResNet hoặc ViT) cho hình ảnh và encoder văn bản (dựa trên Transformer) cho ngôn ngữ để ánh xạ 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 văn bản và hình ảnh bằng độ tương đồng cosine.
  • NumPy lưu embedding hình ảnh trong một mảng duy nhất và xếp hạng chúng với 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 dependency lập chỉ mục bổ sung.
  • Flask cung cấp giao diện web đơn giản để gửi truy vấn bằng ngôn ngữ tự nhiên và hiển thị hình ảnh khớp về mặt ngữ nghĩa từ chỉ mục.

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

Vì hình ảnh và văn bản đều được ánh xạ vào cùng một không gian vector nên quá trình truy xuất là zero-shot: bạn không cần nhãn hay danh mục, chỉ cần dữ liệu hình ảnh và prompt phù hợp.

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

Lớp SearchApp khởi chạy giao diện Flask hoàn chỉnh. Trong lần chạy đầu tiên, lớp này tải xuống một tập ảnh mẫu, xây dựng chỉ mục embedding và cung cấp một trang cho phép bạn nhập truy vấn và xem kết quả được xếp hạng.

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

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

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # thay bằng đường dẫn đến thư mục ảnh của bạn để xây dựng công cụ tìm kiếm
    device="cpu",  # cấu hình device dùng để xử lý, ví dụ: "cpu" hoặc "cuda"
)

app.run(debug=False)  # Bạn cũng có thể dùng đối số `debug=True` để kiểm thử

Tìm kiếm hình ảnh bằng code#

Lớp VisualAISearch thực hiện toàn bộ thao tác backend mà không cần lớp web:

  • Tải hoặc xây dựng chỉ mục embedding từ 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 searcher với truy vấn bằng ngôn ngữ tự nhiên để nhận danh sách tên file hình ảnh khớp, được xếp hạng theo độ tương đồng:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # thay bằng đường dẫn đến thư mục ảnh của bạn để xây dựng công cụ tìm kiếm
    device="cpu",  # cấu hình device dùng để xử lý, ví dụ: "cpu" hoặc "cuda"
)

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

# Kết quả được xếp hạng:
# - 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 tham số VisualAISearch#

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

Đối sốKiểuMặc địnhMô tả
datastr'images'Đường dẫn đến thư mục hình ảnh cần lập chỉ mục và tìm kiếm.
devicestr'cpu'Device dùng để chạy inference CLIP (ví dụ: cpu, cuda, 0).
Quản lý dữ liệu trên cloud

Để tìm kiếm các bộ sưu tập hình ảnh ở quy mô production mà không phải quản lý file cục bộ, bạn có thể sắp xếp và tạo phiên bản cho hình ảnh trên Ultralytics Platform trước khi lập chỉ mục bằng CLIP.

Kết luận#

Với CLIP và package Ultralytics Python, bạn có thể triển khai công cụ tìm kiếm hình ảnh ngữ nghĩa zero-shot chỉ bằng vài dòng code, dưới dạng ứng dụng web Flask hoặc backend tìm kiếm chạy bằng code. Từ đây, hãy trỏ data đến thư mục hình ảnh của bạn để lập chỉ mục, sau đó khám phá các Giải pháp Ultralytics khác để mở rộng quy trình computer vision.

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

  • CLIP (Tiền huấn luyện ngôn ngữ-hình ảnh tương phản) là model do OpenAI phát triển, có khả năng học cách liên kết thông tin thị giác và ngôn ngữ. Model được huấn luyện trên một dataset khổng lồ gồm các hình ảnh đi kèm chú thích bằng ngôn ngữ tự nhiên. Quá trình huấn luyện này giúp model ánh xạ cả hình ảnh lẫn văn bản vào một không gian embedding chung, cho phép bạn so sánh trực tiếp chúng bằng độ tương đồng vector.

  • Điểm nổi bật của CLIP 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ể, model học trực tiếp từ ngôn ngữ tự nhiên. Nhờ đó, model có thể 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 "cảnh mộng siêu thực", hữu ích cho nhiều tác vụ 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 hình ảnh thành embedding, package Ultralytics chuẩn hóa L2 các embedding này và lưu chúng trong một mảng NumPy duy nhất. Truy vấn được xếp hạng bằng một phép nhân ma trận, tính độ tương đồng cosine giữa embedding truy vấn với từng embedding hình ảnh, rồi sắp xếp các điểm số. Phương pháp tìm kiếm vét cạn này vừa chính xác vừa nhanh đối với các bộ sưu tập hình ảnh thông thường, không cần cài đặt hay quản lý dependency cơ sở dữ liệu vector bổ sung.

  • CLIP do OpenAI phát triển, nhưng package Ultralytics Python đóng gói việc tạo embedding, lập chỉ mục và tìm kiếm bằng cosine similarity thành một pipeline tìm kiếm hình ảnh ngữ nghĩa hoàn chỉnh, có thể chạy chỉ với vài dòng code:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # thay bằng đường dẫn đến thư mục ảnh của bạn để xây dựng công cụ tìm kiếm
        device="cpu",  # cấu hình device dùng để xử lý, ví dụ: "cpu" hoặc "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    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 embedding.
    • Tìm kiếm ngữ nghĩa hiệu quả bằng cosine similarity.
    • Tải hình ảnh theo thư mục và trực quan hóa.
  • Có. Cấu hình hiện tại sử dụng Flask với frontend HTML cơ bản, nhưng bạn có thể thay thế bằng HTML của riêng mình hoặc xây dựng UI linh hoạt hơn bằng React, Vue hay framework frontend khác. Flask có thể đóng vai trò backend API cho giao diện tùy chỉnh của bạn.

  • Không trực tiếp. Một cách xử lý đơn giản là trích xuất từng khung hình từ video (ví dụ: mỗi giây một khung hình), xem chúng như hình ảnh độc lập rồi đưa vào hệ thống. Nhờ vậy, công cụ tìm kiếm có thể lập chỉ mục ngữ nghĩa các khoảnh khắc hình ảnh trong video của bạn.

Bình luận