tarent heißt jetzt Qvest Digital AG | mehr erfahren

KI gestützte Bildersuche: Bilder und Texte vergleichen

Sven Schumann
SENIOR SOFTWARE DEVELOPER
Veröffentlicht 21. August 2024

KI gestützte Bildersuche: Bilder und Texte vergleichen

In dem ersten Teil der Blog-Serie haben wir gesehen, wie wir es schaffen, ähnliche Bilder anhand von Textbeschreibungen und deren Vektoren zu finden. Allerdings kam es mir unnötig vor, zuerst Beschreibungen zu erzeugen. Warum nicht direkt aus den Bildern Vektoren erzeugen?

Bildverständnis

Zugegeben: mit der Methode Beschreibungen aus Bildern zu erzeugen, um diese dann zu durchsuchen, kommen wir schon recht weit. Mich ließ allerdings der Gedanke nicht los: Die Durchsuchbarkeit ist von der Qualität der Beschreibung abhängig.

  • Was ist, wenn die Beschreibung nicht gut ist?
  • Oder was ist, wenn die Beschreibung nicht das beschreibt, was ich suche?
  • Was ist, wenn ich später nach etwas anderem suche, was die aktuelle Beschreibung nicht hergibt?

Klar, einem KI-Modell ein Bild zu geben und dann Frage dazu zu stellen, ist auch eine Möglichkeit (#Multimodal). Allerdings ist das Kosten- und Zeit- intensiv. Ich wollte also nicht auf den Vorteil verzichten, die Bilder nur einmal zu analysieren und dann beliebig oft zu durchsuchen.

CLIP

Meine Suche führte mich zu CLIP. Allerdings ist dies "nur" ein Konzept und keine fertige Implementierung. Es gibt also keine API, die ich einfach nutzen kann. Sollte ich also ein Modell selbst erstellen? Ich habe doch (noch) keine Ahnung davon! Außerdem hätte ich weder eine Grafikkarte, noch die Zeit, um ein Modell zu trainieren. Doch es sollte einfacher sein, als ich dachte...

Meine Suche führte mich zu CLIP. Allerdings ist dies "nur" ein Konzept und keine fertige Implementierung. Es gibt also keine API, die ich einfach nutzen kann. Sollte ich also ein Modell selbst erstellen? Ich habe doch (noch) keine Ahnung davon! Außerdem hätte ich weder eine Grafikkarte, noch die Zeit, um ein Modell zu trainieren. Doch es sollte einfacher sein, als ich dachte...


Hugging Face

Hugging Face ist eine Plattform auf der - unter anderem - fertig trainierte KI-Modelle geteilt werden. Hier gibt es auch vortrainierte CLIP-Modelle. Dabei bin ich konkret bei dem Modell jinaai/jina-clip-v1 kleben geblieben. Die Frage ist nur noch: wie bekomme ich das Modell "gestartet"?


Transformer

Hugging Face selbst stellt eine eigene Python Bibliothek bereit, mit der es super einfach ist, vortrainierte Modelle zu benutzen! Transformers bietet diverse Funktionen an, Modelle von der Plattform Hugging Face zu laden und zu starten. Hier mal ein einfaches Beispiel, welches die Ähnlichkeit zwischen Text und Bildern berechnet:

import torch
from transformers import AutoModel
# Modell initialisieren (läd das Modell von Hugging Face - fals es noch nicht lokal vorhanden ist)
model = AutoModel.from_pretrained('jinaai/jina-clip-v1', trust_remote_code=True)
# Überprüfen, ob CUDA (Nvidia => Grafikkarte => Power) verfügbar ist
model.to(torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu"))
# Suchanfragen
queries = ['A yellow bird', 'A striped cat', 'A carport']
# Bild URLs (werden automatisch heruntergeladen)
# Man könnte auch lokale Bilder verwenden!
image_urls = [
    'https://upload.wikimedia.org/wikipedia/commons/8/8e/Hauskatze_langhaar.jpg',
    'https://upload.wikimedia.org/wikipedia/commons/8/8b/Hauskatze_filou.jpg'
]
# Suchanfragen in Embeddings umwandeln
text_embeddings = model.encode_text(queries)
# Bilder in Embeddings umwandeln
image_embeddings = model.encode_image(image_urls)
# Berechne die Ähnlichkeit zwischen Text und Bildern (die Distanz zwischen den Embeddings)
for query, text_embedding in zip(queries, text_embeddings):
    print(f"{query}:")
    for image_url, image_embedding in zip(image_urls, image_embeddings):
        # Berechne Distanz zwischen Text- und Bild-Embedding
        similarity = text_embedding @ image_embedding.T
        print(f"{similarity} - {image_url}")
  • - A yellow bird: 0.024
  • - A striped cat: 0.194
  • - A carport: -0.073


  • - A yellow bird: 0.005
  • - A striped cat: 0.231
  • - A carport: -0.053


Ergebnis

Die "Kunst" ist es nun, einen Schwellwert für die Ähnlichkeit zu finden, ab wann ein Bild als "ähnlich" gilt. Laut meinen Erfahrungen bietet sich ein Minimalwert zwischen +0,1 - +0,2 an. Das bedeutet für die obigen Beispiele, dass gut die Katzen als ähnlich erkannt werden. Toll, es sind ja auch wirklich Katzen! Einen Vogel scheint schon nicht ganz unähnlich zu sein. Vermutlich, weil es auch ein Tier ist. Ein Carport hingegen ist schon sehr unähnlich.

Warum in Englisch?

Das von mir genutzte Modell ist auf Englisch trainiert worden. Das heißt nicht unbedingt, dass es gar nicht mit anderssprachigen Anfragen funktioniert. Allerdings ist die Wahrscheinlichkeit, dass es mit Englisch besser funktioniert, höher!

Was lernen wir daraus?

1. Via CLIP-Modelle können Bilder und Texte auf Ähnlichkeit geprüft werden

2. Hugging Face bietet eine Plattform, auf der vortrainierte KI-Modelle geteilt werden können

3. Mittels Python Bibliothek Transformers ist es super einfach, diese Modelle zu nutzen

4. Es muss selbst ein sinnvoller Schwellwert für die Ähnlichkeit gefunden werden