Ultralytics YOLO27:

So erstellst du eine semantische Bildsuche mit OpenAI CLIP#

Diese Anleitung führt dich durch die Erstellung einer semantischen Bildsuche mit OpenAI CLIP und Flask. Durch die Kombination der visuellen und sprachlichen Embeddings von CLIP mit einer schnellen Suche nach Kosinusähnlichkeit auf Basis von NumPy kannst du eine Weboberfläche erstellen, die relevante Bilder anhand von Abfragen in natürlicher Sprache abruft – ganz ohne Beschriftungen oder Kategorien.



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

Flask-Webseite mit einer Übersicht der Ergebnisse der semantischen Suche

Das Ultralytics Python-Paket kapselt die gesamte Pipeline hinter zwei Klassen, sodass du mit wenigen Zeilen eine funktionierende Suchanwendung starten oder Abfragen programmgesteuert ausführen kannst. Diese Anleitung behandelt die Vorteile der semantischen Suche, ihre Funktionsweise, die Ausführung der Webanwendung, die programmgesteuerte Suche und die Konfiguration der Parameter.

Warum solltest du eine semantische Bildsuche verwenden?#

Eine eigene semantische Bildsuche mit CLIP zu erstellen, bietet mehrere überzeugende Vorteile:

  • Zero-Shot-Funktionen: Du musst dein Dataset nicht trainieren. Mit CLIPs Zero-Shot-Lernen kannst du jede Bildsammlung mit frei formulierten Abfragen in natürlicher Sprache durchsuchen und dabei Zeit und Ressourcen sparen.
  • Menschenähnliches Verständnis: Anders als eine Stichwortsuche versteht CLIP den semantischen Kontext und findet Bilder anhand abstrakter, emotionaler oder relationaler Abfragen wie „ein glückliches Kind in der Natur“ oder „die Skyline einer futuristischen Stadt bei Nacht“.
  • Keine Beschriftungen oder Metadaten: Dieser Ansatz benötigt nur die Rohbilder. CLIP erzeugt die Embeddings ohne manuelle Annotation.
  • Leichtgewichtige und exakte Suche: Eine einzelne normalisierte Matrixmultiplikation in NumPy ordnet jedes Bild nach Kosinusähnlichkeit, liefert exakte Ergebnisse in Echtzeit für Tausende von Embeddings und erfordert keine zusätzliche Suchabhängigkeit, die installiert oder verwaltet werden muss.
  • Anwendungen in verschiedenen Bereichen: Ob du ein persönliches Fotoarchiv, ein Werkzeug für kreative Inspiration, eine Produktsuchmaschine oder ein System für Kunstempfehlungen erstellst – derselbe Technologie-Stack lässt sich mit minimalen Anpassungen einsetzen.

So funktioniert die semantische Bildsuche#

Die Pipeline kombiniert drei Komponenten, von denen jede eine Phase der Umwandlung von Bildern und Text in sortierte Ergebnisse übernimmt:

  • CLIP verwendet für Bilder einen Bildencoder (z. B. ResNet oder ViT) und für Sprache einen Textencoder (auf Transformer-Basis), um beide in denselben multimodalen Embedding-Raum zu projizieren. Dadurch lassen sich Text und Bilder direkt anhand der Kosinusähnlichkeit vergleichen.
  • NumPy speichert die Bild-Embeddings als ein einzelnes Array und ordnet sie mithilfe einer Matrixmultiplikation anhand eines Abfrage-Embeddings. Dabei werden die Vektoren mit der höchsten Kosinusähnlichkeit zurückgegeben, ohne dass eine zusätzliche Abhängigkeit für die Indexierung erforderlich ist.
  • Flask stellt eine einfache Weboberfläche bereit, über die du Abfragen in natürlicher Sprache eingeben und semantisch passende Bilder aus dem Index anzeigen kannst.

Workflow zum Abrufen von Bildern mit OpenAI CLIP

Da Bilder und Text im selben Vektorraum abgebildet werden, funktioniert der Abruf ohne vorheriges Training: Du benötigst keine Beschriftungen oder Kategorien, sondern nur Bilddaten und einen guten Prompt.

Webanwendung für die semantische Suche ausführen#

Die Klasse SearchApp startet die vollständige Flask-Oberfläche. Beim ersten Ausführen lädt sie einen Beispieldatensatz mit Bildern herunter, erstellt den Embedding-Index und stellt eine Seite bereit, auf der du eine Abfrage eingeben und sortierte Ergebnisse anzeigen kannst.

Warnung zum Bildpfad

Wenn du eigene Bilder verwendest, musst du einen absoluten Pfad zum Bildverzeichnis angeben. Andernfalls werden die Bilder aufgrund der Einschränkungen beim Bereitstellen von Dateien durch Flask möglicherweise nicht auf der Webseite angezeigt.

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

Bilder programmgesteuert durchsuchen#

Die Klasse VisualAISearch führt alle Backend-Operationen ohne die Webschicht aus:

  • Lädt einen Embedding-Index aus lokalen Bildern oder erstellt ihn.
  • Extrahiert Bild- und Text-Embeddings mit CLIP.
  • Führt eine Ähnlichkeitssuche mithilfe der Kosinusähnlichkeit durch.

Rufe die Suchklasse mit einer Abfrage in natürlicher Sprache auf, um eine nach Ähnlichkeit sortierte Liste passender Bilddateinamen zurückzuerhalten:

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

Parameter von VisualAISearch konfigurieren#

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

ArgumentTypStandardwertBeschreibung
datastr'images'Pfad zum Bildverzeichnis, das indexiert und durchsucht werden soll.
devicestr'cpu'Für die CLIP-Inferenz verwendetes Gerät (z. B. cpu, cuda, 0).
Verwalte deine Daten in der Cloud

Um Bildsammlungen im Produktionsmaßstab zu durchsuchen, ohne lokale Dateien verwalten zu müssen, kannst du deine Bilder auf der Ultralytics Platform organisieren und versionieren, bevor du sie mit CLIP indexierst.

Fazit#

Mit CLIP und dem Ultralytics Python-Paket kannst du mit wenigen Zeilen eine semantische Bildsuche ohne vorheriges Training bereitstellen – entweder als Flask-Webanwendung oder als programmgesteuertes Such-Backend. Verweise dazu data auf dein eigenes Bildverzeichnis, um es zu indexieren, und sieh dir anschließend weitere Ultralytics Solutions an, um deine Workflows für Computer Vision zu erweitern.

FAQ#

  • CLIP (Kontrastives Sprach-Bild-Vortraining) ist ein von OpenAI entwickeltes Modell, das lernt, visuelle und sprachliche Informationen miteinander zu verknüpfen. Es wird mit einem umfangreichen Dataset aus Bildern und zugehörigen Bildunterschriften in natürlicher Sprache trainiert. Durch dieses Training kann CLIP sowohl Bilder als auch Text in einen gemeinsamen Embedding-Raum abbilden, sodass du sie direkt anhand der Vektorähnlichkeit vergleichen kannst.

  • CLIP zeichnet sich durch seine Fähigkeit zur Verallgemeinerung aus. Statt ausschließlich für bestimmte Beschriftungen oder Aufgaben trainiert zu werden, lernt das Modell direkt aus natürlicher Sprache. Dadurch kann es flexible Abfragen wie „ein Mann fährt Jetski“ oder „eine surreale Traumlandschaft“ verarbeiten und ist ohne erneutes Training für verschiedenste Anwendungen geeignet – von der Klassifizierung bis zur kreativen semantischen Suche.

  • Nachdem CLIP deine Bilder in Embeddings umgewandelt hat, normalisiert das Ultralytics-Paket sie nach L2 und speichert sie in einem einzigen NumPy-Array. Eine Abfrage wird mit einer Matrixmultiplikation sortiert, die die Kosinusähnlichkeit zwischen dem Abfrage-Embedding und jedem Bild-Embedding berechnet und anschließend die Bewertungen sortiert. Diese Suche durch vollständiges Durchlaufen ist für typische Bildsammlungen exakt und schnell, ohne dass eine zusätzliche Abhängigkeit für eine Vektordatenbank installiert oder verwaltet werden muss.

  • CLIP wird zwar von OpenAI entwickelt, aber das Ultralytics Python-Paket kapselt die Erzeugung von Embeddings, die Indexierung und die Suche nach Kosinusähnlichkeit in einer vollständigen Pipeline für die semantische Bildsuche, die mit wenigen funktionierenden Codezeilen auskommt:

    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")

    Diese Implementierung auf hoher Abstraktionsebene übernimmt:

    • Erzeugung von Bild- und Text-Embeddings auf Basis von CLIP.
    • Erstellung und Verwaltung des Embedding-Index.
    • Effiziente semantische Suche mit Kosinusähnlichkeit.
    • Bildladen aus Verzeichnissen und Visualisierung.
  • Ja. Die aktuelle Einrichtung verwendet Flask mit einem einfachen HTML-Frontend, aber du kannst es durch dein eigenes HTML ersetzen oder mit React, Vue oder einem anderen Frontend-Framework eine dynamischere Benutzeroberfläche erstellen. Flask kann als Backend-API für deine benutzerdefinierte Oberfläche dienen.

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

Kommentare