Semantische Suche für Bilder
Jeder kennt das Problem: Die Anzahl an Bildern hat in den vergangenen Jahren massiv zugenommen. Sei es auf dem eigenem Handy, auf dem PC oder in Bilddatenbanken: Jeder hat zehntausende von Bildern. Aber wie findet man eins, wenn man nach einem ganz bestimmten Bild sucht?
Natürlich könnte man jedes Bild beschreiben und dann eine gewöhnliche Textsuche verwenden. Dass wäre aber wenig praktisch. Stattdessen empfiehlt sich die semantische Suche.
Semantische Suche für Bilder
Bei der semantischen Suche werden Bilder in einen Vektorraum projiziert. Das besondere dabei ist, dass sich Text ebenfalls in den gleichen Vektorraum projizieren lässt und zwar so dass Text und das passende Bild dicht im Vektorraum ist. Somit lässt sich eine entsprechende Suche realisieren. Sucht man z.B. nach "Zwei Hunden im Schnee", so bildet man diesen Text im Vektorraum ab und schaut welche Bilder am dichtesten sind. Und schon hat man das passende Bild gefunden! Dies lässt sich auch wunderbar für die eigene Webseite nutzen, z.B. für eine Seite wie bitcoins-code.de, um passende Bilder in die Website zu integrieren.
Bild-Suche mittels CLIP und Sentence-Transformers
In diesem Beispiel nutzen wir das CLIP Model, das von OpenAI entwickelt wurde: Es wurde auf rund 400 Millionen Bild-Text-Paaren trainiert und kennt damit ein breites Spektrum an Bildern. Diese Modell lässt sich einfach per sentence transformers installieren und nutzen.
Zuerst müssen wir es installieren:
1 |
pip install sentence-transformers |
Anschließend können wir Bilder und Text in den Vektorraum einbetten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from sentence_transformers import SentenceTransformer, util from PIL import Image #Load CLIP model model = SentenceTransformer('clip-ViT-B-32') #Encode an image: img_emb = model.encode(Image.open('two_dogs_in_snow.jpg')) #Encode text descriptions text_emb = model.encode(['Two dogs in the snow', 'A cat on a table', 'A picture of London at night']) #Compute cosine similarities cos_scores = util.cos_sim(img_emb, text_emb) print(cos_scores) |
Das ursprüngliche CLIP-Modell funktioniert nur für English, es gibt aber eine mehrsprachige Version die ebenfalls auch für deutsch funktioniert. Diese kann man wie folgt verwenden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from sentence_transformers import SentenceTransformer, util from PIL import Image #Load CLIP model img_model = SentenceTransformer('clip-ViT-B-32') #Encode an image: img_emb = img_model.encode(Image.open('two_dogs_in_snow.jpg')) #Encode text descriptions model = SentenceTransformer('clip-ViT-B-32-multilingual-v1') text_emb = model.encode(['Zwei Hunde im Schnee', 'Paris bei Nacht']) #Compute cosine similarities cos_scores = util.cos_sim(img_emb, text_emb) print(cos_scores) |
Diese Modelle lassen sich nicht nur für einzelne Bilder verwenden, sondern damit können problemlos tausende oder gar Millionen von Bildern problemlos innerhalb weniger Millisekunden durchsucht werden. Dabei brauchen die Modelle nur das Bild an sich, man muss keine Beschreibungen mehr hinzufügen oder Tags vergeben.
Limitierungen
Natürlich funktioniert so ein Modell nicht perfekt. Das Modell kann zwar Personen erkennen, aber nur wenn diese ausreichend oft in den Trainingsdaten vorgekommen sind. Sprich, das Modell kann nur bekannte Promis erkennen. Eine Suche nach Bildern nach eurem Freund Paul oder Bilder von Lisa können nicht gefunden werden. Ebenso können keine nicht klaren Bilder gefunden werden, wo nur ihr wisst wo z.B. das Bild entstanden ist.
Auch haben die Modelle Probleme mit neuen Sachen, z.B. neue Filme, neue Promis, neue Kunstwerke: Diese kennt das Modell nicht, und kann diese auch nicht finden wenn danach gesucht wird.
Autor: Nils Reimers