Semantische Bildersuche mit OpenAI CLIP und Meta FAISS

Einführung

Diese Anleitung führt dich durch den Aufbau einer semantischen Bildersuchmaschine unter Verwendung von OpenAI CLIP, Meta FAISS und Flask. Durch die Kombination der leistungsstarken visuell-sprachlichen Einbettungen von CLIP mit der effizienten Nächste-Nachbarn-Suche von FAISS kannst du eine voll funktionsfähige Weboberfläche erstellen, auf der du relevante Bilder mit natürlichsprachlichen Abfragen abrufen kannst.



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

Visuelle Vorschau der semantischen Bildersuche

Flask-Webseite mit einer Übersicht der semantischen Suchergebnisse

Wie es funktioniert

  • CLIP verwendet einen Vision-Encoder (z. B. ResNet oder ViT) für Bilder und einen Text-Encoder (basierend auf einem Transformer) für Sprache, um beide in denselben multimodalen Einbettungsraum zu projizieren. Dies ermöglicht einen direkten Vergleich zwischen Text und Bildern mittels Kosinus-Ähnlichkeit.
  • FAISS (Facebook AI Similarity Search) erstellt einen Index der Bildeinbettungen und ermöglicht eine schnelle, skalierbare Suche nach den nächsten Vektoren zu einer gegebenen Abfrage.
  • Flask bietet eine einfache Weboberfläche, um natürlichsprachliche Abfragen einzureichen und semantisch passende Bilder aus dem Index anzuzeigen.

Diese Architektur unterstützt Zero-Shot-Suche, was bedeutet, dass du keine Labels oder Kategorien benötigst, sondern nur Bilddaten und eine gute Eingabeaufforderung.

Semantische Bildersuche mit dem Ultralytics Python-Paket
Warnung zum Bildpfad

Wenn du deine eigenen Bilder verwendest, achte darauf, einen absoluten Pfad zum Bildverzeichnis anzugeben. Andernfalls könnten die Bilder aufgrund der Dateibereitstellungsbeschränkungen von Flask möglicherweise nicht auf der Webseite erscheinen.

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

VisualAISearch-Klasse

Diese Klasse führt alle Backend-Operationen durch:

  • Lädt oder erstellt einen FAISS-Index aus lokalen Bildern.
  • Extrahiert Bild- und Text-Einbettungen mit CLIP.
  • Führt eine Ähnlichkeitssuche mittels Kosinus-Ähnlichkeit durch.
Suche nach ähnlichen Bildern
Warnung zum Bildpfad

Wenn du deine eigenen Bilder verwendest, achte darauf, einen absoluten Pfad zum Bildverzeichnis anzugeben. Andernfalls könnten die Bilder aufgrund der Dateibereitstellungsbeschränkungen von Flask möglicherweise nicht auf der Webseite erscheinen.

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

VisualAISearch-Parameter

Die folgende Tabelle führt die verfügbaren Parameter für VisualAISearch auf:

ArgumentTypStandardBeschreibung
datastr'images'Pfad zum Bildverzeichnis, das für die Ähnlichkeitssuche verwendet wird.
ArgumentTypStandardBeschreibung
devicestrNoneSpezifiziert das Gerät für die Inferenz (z. B. cpu, cuda:0 oder 0). Ermöglicht die Wahl zwischen CPU, einer spezifischen GPU oder anderen Recheneinheiten zur Modellausführung.

Vorteile der semantischen Bildersuche mit CLIP und FAISS

Der Aufbau deines eigenen Systems zur semantischen Bildersuche mit CLIP und FAISS bietet mehrere überzeugende Vorteile:

  1. Zero-Shot-Fähigkeiten: Du musst das Modell nicht auf deinen spezifischen Datensatz trainieren. CLIPs Zero-Shot-Lernen ermöglicht dir Suchanfragen auf jedem beliebigen Bilddatensatz mithilfe von natürlichsprachlicher Eingabe in freier Form, was sowohl Zeit als auch Ressourcen spart.

  2. Menschliches Verständnis: Anders als schlüsselwortbasierte Suchmaschinen versteht CLIP den semantischen Kontext. Es kann Bilder basierend auf abstrakten, emotionalen oder relationalen Abfragen wie "ein glückliches Kind in der Natur" oder "eine futuristische Skyline bei Nacht" abrufen.

    Arbeitsablauf der OpenAI Clip-Bildsuche

  3. Keine Labels oder Metadaten erforderlich: Herkömmliche Bildsuchsysteme erfordern sorgfältig gelabelte Daten. Dieser Ansatz benötigt nur Rohbilder. CLIP generiert Einbettungen ohne manuelle Annotation.

  4. Flexible und skalierbare Suche: FAISS ermöglicht eine schnelle Nächste-Nachbarn-Suche selbst bei großen Datensätzen. Es ist für Geschwindigkeit und Speicher optimiert und erlaubt Echtzeit-Antworten selbst bei Tausenden (oder Millionen) von Einbettungen.

    Arbeitsablauf für den Aufbau von Meta FAISS-Einbettungsvektoren

  5. Domänenübergreifende Anwendungen: Egal, ob du ein persönliches Fotoarchiv, ein Werkzeug für kreative Inspiration, eine Produktsuchmaschine oder sogar ein Empfehlungssystem für Kunst aufbaust, dieser Stack lässt sich mit minimalen Anpassungen an verschiedene Bereiche anpassen.

FAQ

Wie versteht CLIP sowohl Bilder als auch Text?

CLIP (Contrastive Language Image Pretraining) ist ein von OpenAI entwickeltes Modell, das lernt, visuelle und sprachliche Informationen miteinander zu verbinden. Es wurde auf einem riesigen Datensatz von Bildern trainiert, die mit natürlichsprachlichen Bildunterschriften gepaart sind. Dieses Training ermöglicht es, sowohl Bilder als auch Text in einen gemeinsamen Einbettungsraum abzubilden, sodass du sie direkt mittels Vektorähnlichkeit vergleichen kannst.

Warum gilt CLIP als so leistungsstark für KI-Aufgaben?

Was CLIP auszeichnet, ist seine Fähigkeit zur Generalisierung. Anstatt nur für spezifische Labels oder Aufgaben trainiert zu werden, lernt es aus der natürlichen Sprache selbst. Dies ermöglicht es, flexible Abfragen wie „ein Mann auf einem Jetski“ oder „eine surreale Traumlandschaft“ zu verarbeiten, was es für alles von der Klassifizierung bis hin zur kreativen semantischen Suche nützlich macht, ohne dass ein erneutes Training erforderlich ist.

Was genau macht FAISS in diesem Projekt (semantische Suche)?

FAISS (Facebook AI Similarity Search) ist ein Toolkit, das dir hilft, sehr effizient durch hochdimensionale Vektoren zu suchen. Sobald CLIP deine Bilder in Einbettungen umwandelt, macht es FAISS schnell und einfach, die engsten Übereinstimmungen zu einer Textabfrage zu finden – perfekt für den Bildabruf in Echtzeit.

Warum das Ultralytics-Python-Paket verwenden, wenn CLIP und FAISS von OpenAI und Meta stammen?

Während CLIP und FAISS von OpenAI bzw. Meta entwickelt wurden, vereinfacht das Ultralytics Python-Paket deren Integration in eine vollständige Pipeline für die semantische Bildsuche in einem Workflow mit nur zwei Zeilen, der einfach funktioniert:

Suche nach ähnlichen Bildern
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

Diese High-Level-Implementierung übernimmt Folgendes:

  • Generierung von CLIP-basierten Bild- und Texteinbettungen.
  • Erstellung und Verwaltung von FAISS-Indizes.
  • Effiziente semantische Suche mit Kosinus-Ähnlichkeit.
  • Verzeichnisbasiertes Laden von Bildern und Visualisierung.

Kann ich das Frontend dieser App anpassen?

Ja. Das aktuelle Setup verwendet Flask mit einem einfachen HTML-Frontend, aber du kannst es durch dein eigenes HTML ersetzen oder eine dynamischere Benutzeroberfläche mit React, Vue oder einem anderen Frontend-Framework aufbauen. Flask kann als Backend-API für deine benutzerdefinierte Oberfläche dienen.

Ist es möglich, Videos anstelle von statischen Bildern zu durchsuchen?

Nicht direkt. Ein einfacher Workaround besteht darin, einzelne Frames aus deinen Videos zu extrahieren (z. B. einen pro Sekunde), diese als eigenständige Bilder zu behandeln und sie in das System einzuspeisen. Auf diese Weise kann die Suchmaschine visuelle Momente aus deinen Videos semantisch indizieren.

Kommentare